Запрос php mysqli возвращает ноль, если значение поля содержит «ñ» - PullRequest
0 голосов
/ 22 июля 2011

У меня есть таблица базы данных с именем users, и у одного из пользователей есть фамилия, которая содержит «ñ», и когда я запрашиваю из таблицы users, она возвращает null для фамилии, содержащей «ñ», но для других это просто отлично.

Ответы [ 2 ]

2 голосов
/ 22 июля 2011

Согласно документации json_encode :

Эта функция работает только с данными в кодировке UTF-8.

Если ваши данные находятся вlatin1_swedish_ci, он не примет ñ.Я советую либо изменить вашу базу данных и везде использовать utf-8 (что мне хорошо подходит), либо пытаться использовать многобайтовые функции для изменения входных данных на utf-8.Нечто подобное должно работать:

<?php
$input = mb_convert_encoding( $yourstring, 'UTF-8', mb_detect_encoding( $yourstring ) );

Снова;Я думаю, что использование UTF-8 для всего является более разумным шагом и в дальнейшем избавит вас от неприятностей.

1 голос
/ 22 июля 2011

Я не могу воспроизвести ошибку с

<code><?php
ini_set('default_mimetype', 'text/html');
ini_set('default_charset', 'utf-8');

echo 'phpversion: ', phpversion(), "<br />\n";

$mysqli = connect();
echo 'mysqli server version: ', mysqli_get_server_version($mysqli), "<br />\n";
echo 'mysqli client version: ', mysqli_get_client_version($mysqli), "<br />\n";
echo 'mysqli proto info: ', mysqli_get_proto_info($mysqli), "<br />\n";
echo '<pre>mysqli charset: '; var_dump(mysqli_get_charset($mysqli)); echo "
\ п "; установки ($ MySQLi); $ result = mysqli_query ($ mysqli, 'SELECT x FROM foo') или die (__ LINE __. mysqli_error ($ mysqli)); while ($ row = mysqli_fetch_assoc ($ result)) { эхо '
', $row['x'], "<pre>\n";
}

function connect() {
    $mysqli = mysqli_connect('localhost', 'localonly', 'localonly', 'test') or die(__LINE__.mysqli_connect_error());
    mysqli_set_charset($mysqli, 'utf8') or die(__LINE__.mysqli_error($mysqli));
    return $mysqli;
}

function setup($mysqli) {
    mysqli_query($mysqli, 'CREATE TEMPORARY TABLE foo (id int auto_increment, x varchar(32), primary key(id))') or die(__LINE__.mysqli_error($mysqli));
    $v = chr(0xC3). chr(0x91);
    mysqli_query($mysqli, "INSERT INTO foo (x) VALUES ('abc'),('$v')") or die(__LINE__.mysqli_error($mysqli));
}
</code>

который печатает на моем компьютере

phpversion: 5.3.5
mysqli server version: 50508
mysqli client version: 50007
mysqli proto info: 10

mysqli charset: 

object(stdClass)[2]
  public 'charset' => string 'utf8' (length=4)
  public 'collation' => string 'utf8_general_ci' (length=15)
  public 'dir' => string '' (length=0)
  public 'min_length' => int 1
  public 'max_length' => int 3
  public 'number' => int 33
  public 'state' => int 1
  public 'comment' => string 'UTF-8 Unicode' (length=13)

abc

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