У меня проблема с моим скриптом, который запрашивает записи из базы данных ajax, а затем возвращает его через JSON. Он работает нормально на моем localhost, но когда я загружаю его на сервер, он не работает.
Я прочитал темы о пустом результате json_encode()
и обнаружил, что подобная проблема была для многих людей, и было решение с кодировкой данных. Но все мои файлы, таблицы и данные обычно кодируются в UTF-8 как локально, так и на удаленном сервере.
Все, что делает мой PHP-скрипт, – это записи запросов из базы данных (я использую библиотеку PDO и устанавливаю кодировку базы данных в UTF-8 – «SET NAMES» utf8 »), затем бросает цикл, который генерирует html-теги с данными из базы данных, а затем возвращается назад как массив с json_encode($result)
.
Если я попробую print_r($result)
и посмотрю их в браузере Developer tools
я увижу правильный массив с нормальными данными. Но если я верну их с json_encode($result)
результат будет – ничего.
Также у меня есть русский текст в моем массиве результатов.
Пример массива результатов:
[data] => Array ( [0] => Array ( [0] => <input type="checkbox" name="id[]" value="1"> [1] => 1 [2] => Английский стол [3] => <span title='Вращающийся английский стол с выдвижными ящиками.Англия, 1900-е гг.Красное дерево, мягкая кожа диска, передвигается на бронзовых колесиках.Диаметр 91, высота 71 см.'>Вращающийся английский стол с выдвижными ящиками.<br>Англия, 1900-е гг.<br>Красное дерево, мягкая кожа диска, перед...</span> [4] => 250€ [5] => sss [6] => [7] => <span class="label label-sm label-success">Опубликован</span> [8] => <a href="/jc_adm/?p=edit_product&id=1" class="btn btn-xs default btn-editable"><i class="fa fa-pencil"></i> Редактировать</a> ) [1] => Array ( [0] => <input type="checkbox" name="id[]" value="2"> [1] => 2 [2] => Старинный раскладной стол [3] => <span title='Оригинальный стол 1800 г. вторая половина.Изогнутые ножки, резная опора, натуральное дерево.Высота 125 Ширина 56 Высота 78 см.'>Оригинальный стол 1800 г. вторая половина.<br>Изогнутые ножки, резная опора, натуральное дерево.<br>Высота 125 Ширин...</span> [4] => 210€ [5] => sss [6] => [7] => <span class="label label-sm label-success">Опубликован</span> [8] => <a href="/jc_adm/?p=edit_product&id=2" class="btn btn-xs default btn-editable"><i class="fa fa-pencil"></i> Редактировать</a> ) [2] => Array......
Но если я вручную создаю массив с, например, следующим infromation echo json_encode(array('fruits' => array('banan', 'apple', 'mango', 'редиска')));
Он будет работать корректно и будет отображать обычно кодировку json. Но мой массив из примера не хочет возвращаться.
Не могли бы вы дать мне какой-нибудь совет, почему это происходит?
Благодаря!
Отредактировано:
Я обнаружил, что если я удалю настройку кодировки базы данных $objDB->query("SET NAMES utf8");
, я получаю результат, но вместо русского текста получаю вопросительные знаки ?????
{"data":[["<input type=\"checkbox\" name=\"id[]\" value=\"1\">",1,"?????????? ????","<span title='??????????? ?????????? ???? ? ?????????? ???????.??????, 1900-? ??.??????? ??????...
РЕШИТЬ:
Эй, я нашел решение для меня. Это моя ошибка, что я не показывал вам полный код, тогда вы бы догадались, что пошло не так. 🙂
В моем цикле я использую функцию substr()
, таким образом $cuttedDesc = (strlen($fullDesc) > 200) ? substr($fullDesc, 0, 200).'...' : $fullDesc;
$cuttedDesc = (strlen($fullDesc) > 200) ? substr($fullDesc, 0, 200).'...' : $fullDesc;
и после того, как я попробовал эхо в json и эту строку. Но как я понимаю, что функция неправильно отрезала мой русский текст, потому что русская буква – это 2-х битная английская буква, и эта функция сокращает одно русское письмо до половины. Это была ошибка.
Поэтому, если кто-то другой использует функцию для текста и имеет ту же проблему, найдите отключить и проверить скрипт без этих функций.
Спасибо всем за помощь.
Ваш json_encode кажется неудачным, вы получили бы уведомление, если бы вы включили его в своей конфигурации PHP. Есть другой способ решить, не сработал ли ваш json_encode, попробуйте получить значение json_last_error
Это сообщение об ошибке могло бы помочь решить, что пошло не так с кодировкой.
РЕДАКТИРОВАТЬ
На такие вопросы уже был дан ответ:
Вот
Попробуйте это, это определенно будет работать
function utf8ize($d) { if (is_array($d)) { foreach ($d as $k => $v) { $d[$k] = utf8ize($v); } } else if (is_string ($d)) { return utf8_encode($d); } return $d; }
а затем позвоните
echo json_encode( utf8ize( $array ) );
Пытаться
json_encode($result, JSON_UNESCAPED_UNICODE);
Проверьте второй параметр json_encode