MySQL возвращая null, неправильно - установка и настройка PHP


Я пытаюсь выполнить SELECT с помощью mysqli в PHP, но он возвращает null всех параметров объекта, возвращенный $mysqli->query($sql).

O objeto que retornou após o método query

и все Же он возвращает строки, которые я выбрал из таблицы, только то, что некоторые значения неуклонно null:

Linha retornada pelo SELECT

Ниже мой код:

$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 прямо в базу, и он работал нормально. Была такая же проблема с другим кодом, что делал вчера, и я не мог решить. Это странно, учитывая, что я всегда делаю, так же и работает...

, Где я не хватает? Кто-нибудь может мне помочь?

"Спасибо".

Author: carol_caires, 2014-12-22

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.

 4
Author: Bruno Augusto, 2017-05-23 12:37:23