MySQL возвращая null, неправильно - установка и настройка PHP
Я пытаюсь выполнить SELECT с помощью mysqli в PHP, но он возвращает null всех параметров объекта, возвращенный $mysqli->query($sql).
и все Же он возвращает строки, которые я выбрал из таблицы, только то, что некоторые значения неуклонно null:
Ниже мой код:
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$cell_number = $_POST['cell'];
$sql = sprintf("SELECT * FROM SMS WHERE Number LIKE '%%%s%%'", $cell_number);
$query = $mysqli->query($sql) or die($mysqli->error.__LINE__);
while($row = $query->fetch_assoc()) {
$result[] = $row;
}
die(json_encode(array('resultado' => $result, 'debug' => $query, 'sql' => $sql)));
я пытался увидеть, если могут быть некоторые ошибки синтаксиса в MySQL, но я бросил query прямо в базу, и он работал нормально. Была такая же проблема с другим кодом, что делал вчера, и я не мог решить. Это странно, учитывая, что я всегда делаю, так же и работает...
, Где я не хватает? Кто-нибудь может мне помочь?
"Спасибо".
1 answers
, Еще раз великие злодеи истории charset и "вам" в PHP.
Json_encode() принимает строки только тогда, когда в кодировке UTF-8. Если вы сталкиваетесь с любой во время процесса кодирования, PHP будет считать, что значения как NULL, спокойно, вместо того, чтобы дать тебе одно касание с любой Notice, например.
Вы можете исправить это, изменив кодировку своих данных, прежде чем сообщить массив json_encode(). Два способа легко достичь этого с iconv mb_convert_encoding().
Например, предполагая, что их данные в базе хранятся charset latin1, вы бы это сделали:
while( $row = $query->fetch_assoc() ) {
$result[] = array_map(
function( $string ) {
return iconv( 'iso-8859-1', 'utf-8', $string );
}, $row
);
}
Здесь используется анонимная функция, в пресс-формы одного Closure, доступна начиная с PHP 5.3. Я надеюсь, что вы используете по крайней мере, это версия, но в любом случае вы можете сделать:
while( $row = $query->fetch_assoc() ) {
$result[] = array_map( 'cb', $row );
}
// ...
function cb( $string ) {
return iconv( "iso-8859-1", "utf-8", $string );
}
Альтернативой более громоздким, но больше подходит, было бы создать новую базу данных, а уже в UTF-8 и вновь ввести все данные в UTF-8.
Ясно, что вам не нужно делать вручную, это может создать сценарий, который сделает за вас, но это другой вопрос.
Адаптированы этот ответ SOEn.