Проблемы при вставке строки utf-8 в базу данных, а затем выводе ее на веб-страницу - PullRequest
0 голосов
/ 28 сентября 2010

Я изучаю программирование на PHP, поэтому я настроил тестовую базу данных и стараюсь делать с ней разные вещи.Таким образом, ситуация такова:

Сортировка базы данных utf8_general_ci.

Есть таблица "книг", созданная по запросу

create table books
(  isbn char(13) not null primary key,
   author char(50),
   title char(100),
   price float(4,2)
);

Затем она заполняется некоторыми примерами данных -обратите внимание, что текстовые записи на русском языке.Этот запрос сохраняется как utf-8 без спецификации .sql и выполняется.

insert into books values
  ("5-8459-0046-8", "Майкл Морган", "Java 2. Руководство разработчика", 34.99),
  ("5-8459-1082-X", "Кристофер Негус", "Linux. Библия пользователя", 24.99),
  ("5-8459-1134-6", "Марина Смолина", "CorelDRAW X3. Самоучитель", 24.99),
  ("5-8459-0426-9", "Родерик Смит", "Сетевые средства Linux", 49.99);

Когда я просматриваю содержимое созданной таблицы через phpMyAdmin, я получаю правильные результаты.

Когда я получаю данные из этой таблицы и пытаюсь отобразить их через php, вместо русских символов появляются вопросительные знаки.Вот фрагмент моего php-кода:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Books</title>
</head>
<body>
<?php
  header("Content-type: text/html; charset=utf-8");
  mysqli_set_charset('utf8');
  @ $db = new mysqli('localhost', 'login', 'password', 'database');

  $query = "select * from books where ".$searchtype." like '%".$searchterm."%'";
  $result = $db->query($query);
  $num_results = $result->num_rows;

  for ($i = 0; $i < $num_results; $i++) {
     $row = $result->fetch_assoc();
     echo "<p><strong>".($i+1).". Title: ";
     echo htmlspecialchars (stripslashes($row['title']));
     echo "</strong><br />Author: ";
     echo stripslashes($row['author']);
     echo "<br />ISBN: ";
     echo stripslashes($row['isbn']);
     echo "<br />Price: ";
     echo stripslashes($row['price']);
     echo "</p>";
  }
...

А вот вывод:

1. Название: Java 2. ??????????? ????????????
Автор: ????? ??????
ISBN: 5-8459-0046-8
Цена: 34.99

Может кто-нибудь указать, что я делаю неправильно?

Ответы [ 6 ]

2 голосов
/ 28 сентября 2010

Кто-то может указать, что я делаю неправильно?

Да, я могу.
Вы не сообщили серверу Mysql, какую кодировку данных вы хотите.
Mysql может предоставить любую кодировку на случай, если кодировка вашей страницы отличается от кодировки сохраненных данных.И перекодируйте его на лету.
Таким образом, необходимо указать предпочтительную кодировку клиента (ваш PHP-код является клиентом базы данных).
По умолчанию это latin1.Таким образом, поскольку в таблице символов latin1 таких символов нет, вместо них возвращаются знаки вопроса.

Есть два способа сообщить mysql, какую кодировку мы хотим:

  • чуть более предпочтительным является mysqli_set_charset () function (метод в вашем случае).
  • менее предпочтительным является SET NAMES запрос.

Но если вы правильно используете расширение MySQL, это не имеет значения.(хотя это не так)

Обратите внимание, что в mysql эта кодировка называется utf8, без тире или пробелов.

1 голос
/ 28 сентября 2010

После подключения mysql_connect установите для UTF-8:

mysql_query("SET NAMES utf8");

Следуйте советам Александра для .htaccess, заголовка и кодировки файлов

1 голос
/ 28 сентября 2010

Вам, вероятно, нужно позвонить mysqli_set_charset('utf8'); после того, как вы установили соединение с new mysqli(...), так как оно работает по ссылке, а не по глобальной настройке.

так ..

@ $db = new mysqli('localhost', 'login', 'password', 'database');
mysqli_set_charset($db, 'utf8');
$query = "select * from books where ".$searchtype." like '%".$searchterm."%'";

Кстати, этот запрос кажется открытым для SQL-инъекций, если $searchterm не подвергнут санитарной обработке. Просто что-то нужно иметь в виду, подумайте об использовании подготовленных утверждений.

И использование @ для подавления ошибок, как правило, не рекомендуется, особенно во время разработки. Лучше иметь дело с ошибочными условиями.

1 голос
/ 28 сентября 2010
  1. Попробуйте установить выходную кодировку:

    SET NAMES 'utf-8' SET SET CHARACTER SET utf-8

  2. Создать .htaccessfile:

    AddDefaultCharset utf-8 AddCharset utf-8 * CharsetSourceEnc utf-8 CharsetDefault utf-8

  3. Сохранение файлов в UTF-8 без спецификации.

  4. Установить кодировку в html-заголовке.
0 голосов
/ 27 июля 2013

после вашего запроса mysql_query добавьте

        @mysql_query("SET character_set_server='utf8'; ");   
    @mysql_query("SET character_set_client='utf8'; ");
    @mysql_query("SET character_set_results='utf8'; ");   
    @mysql_query("SET character_set_connection='utf8'; ");   
    @mysql_query("SET character_set_database='utf8'; ");   
    @mysql_query("SET collation_connection='utf8_general_ci'; ");   
    @mysql_query("SET collation_database='utf8_general_ci'; ");   
    @mysql_query("SET collation_server='utf8_general_ci'; ");
0 голосов
/ 28 сентября 2010

Попробуйте также поместить в HTML-документ. Заголовок метатега:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Это отличается от заголовка HTTP header("Content-type: text/html; charset=utf-8");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...