php json_encode\decode

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

php json_encode\decode

Непрочитанное сообщение xaker1 » 2011-07-26 11:29:26

Здравствуйте.
Возникла проблема с ф-цией json_decode.
В MySQL базе (utf-8) хранится строка в формате json. Данная строка была сформирована с помощью json_encode в другом моем скрипте.

Код: Выделить всё

	 
$person="SELECT * FROM `person` WHERE `person` LIKE '".$_REQUEST['person']."'";
    $person=qmysql($person, __LINE__, __FILE__);
    $person=mysql_fetch_array($person);
$cont = $person['contacts'];
$contact=json_decode($cont,1);
Но $contacts = NULL.
Если же содержимое $cont вывести на экран, и полученную строку предварительно присвоить переменной $cont, то json_decode отрабатывает нормально. Так что json валидный.
Скрипт в utf8, база в utf8.
Прошу подсказать, в чем может быть проблема.
php 5.2.17.1

--------------
Проблема была в переводах строки. Костыль конечно, ну да ладно. Но теперь русский текст приходит в виде какой-то странной строки
u0412u0430u043bu0435u0440u0438u0439
вместо
Валерий.

Подскажите, как получить исходную строку

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

Re: php json_encode\decode

Непрочитанное сообщение xaker1 » 2011-07-27 15:35:34

json_encode тупит при работе с кирилицой. Как подсказали - лучше использовать

Код: Выделить всё

<?php
function json_encode_cyr($str) {
$arr_replace_utf = array('\u0410', '\u0430','\u0411','\u0431','\u0412','\u0432',
'\u0413','\u0433','\u0414','\u0434','\u0415','\u0435','\u0401','\u0451','\u0416',
'\u0436','\u0417','\u0437','\u0418','\u0438','\u0419','\u0439','\u041a','\u043a',
'\u041b','\u043b','\u041c','\u043c','\u041d','\u043d','\u041e','\u043e','\u041f',
'\u043f','\u0420','\u0440','\u0421','\u0441','\u0422','\u0442','\u0423','\u0443',
'\u0424','\u0444','\u0425','\u0445','\u0426','\u0446','\u0427','\u0447','\u0428',
'\u0448','\u0429','\u0449','\u042a','\u044a','\u042d','\u044b','\u042c','\u044c',
'\u042d','\u044d','\u042e','\u044e','\u042f','\u044f');
$arr_replace_cyr = array('А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е',
'Ё', 'ё', 'Ж','ж','З','з','И','и','Й','й','К','к','Л','л','М','м','Н','н','О','о',
'П','п','Р','р','С','с','Т','т','У','у','Ф','ф','Х','х','Ц','ц','Ч','ч','Ш','ш',
'Щ','щ','Ъ','ъ','Ы','ы','Ь','ь','Э','э','Ю','ю','Я','я');
$str1 = json_encode($str);
$str2 = str_replace($arr_replace_utf,$arr_replace_cyr,$str1);
return $str2;
}
?>
 

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: php json_encode\decode

Непрочитанное сообщение zg » 2011-08-30 19:11:52

xaker1 писал(а):json_encode тупит при работе с кирилицой.
в смысле????

Код: Выделить всё

zg-home% php -r 'echo json_encode("привет мир!"), PHP_EOL;'
"\u043f\u0440\u0438\u0432\u0435\u0442 \u043c\u0438\u0440!"
вроде нормальный юникод :unknown:
xaker1 писал(а):В MySQL базе (utf-8) хранится строка в формате json.
:smile: зачем сей бред?
xaker1 писал(а):Прошу подсказать, в чем может быть проблема.
скорее всего в экранировании. Запрос на сохранение данных кривой.

Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

Re: php json_encode\decode

Непрочитанное сообщение xaker1 » 2011-08-30 19:52:23

zg писал(а):
xaker1 писал(а):json_encode тупит при работе с кирилицой.
в смысле????

Код: Выделить всё

zg-home% php -r 'echo json_encode("привет мир!"), PHP_EOL;'
"\u043f\u0440\u0438\u0432\u0435\u0442 \u043c\u0438\u0440!"
вроде нормальный юникод :unknown:
Ну не знаю, у меня на 5.2.17 такая проблема имеет место. Да и не у меня одного
zg писал(а):
xaker1 писал(а):В MySQL базе (utf-8) хранится строка в формате json.
:smile: зачем сей бред?
За тем, что количество полей и их мена для записей в бд может отличаться (сколько - угадать практически невозможно, в json контактные данные, количество и имена практически динамически формируется).
zg писал(а):
xaker1 писал(а):Прошу подсказать, в чем может быть проблема.
скорее всего в экранировании. Запрос на сохранение данных кривой.
С экранированием и т.д. все нормально 100%. Проблема была именно в json))

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: php json_encode\decode

Непрочитанное сообщение zg » 2011-08-30 20:03:49

xaker1 писал(а): количество и имена практически динамически формируется)
есть функция serialize(), которая гораздо лучше подойдёт для хранения данных в базе
xaker1 писал(а):С экранированием и т.д. все нормально 100%
быть того не может :roll: твой код?
xaker1 писал(а):$person="SELECT * FROM `person` WHERE `person` LIKE '".$_REQUEST['person']."'";
экранирования нет... :-o тыкай инъекции скока влезет :smile:

json - псевдо-протокол передачи данных в JS посредством инъекции. Смысла в нём вне яваскрипта, имхо, мало.

Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

Re: php json_encode\decode

Непрочитанное сообщение xaker1 » 2011-08-30 20:15:24

json - метод хранения данных. Так же как и XML.
Если переменные вставляются из $_REQUEST, это не значит, что ранее они не проверяются)))

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: php json_encode\decode

Непрочитанное сообщение zg » 2011-08-30 20:19:52

xaker1 писал(а):Если переменные вставляются из $_REQUEST, это не значит, что ранее они не проверяются)))
:smile: покажи

Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

Re: php json_encode\decode

Непрочитанное сообщение xaker1 » 2011-08-30 20:28:48

zg писал(а):
xaker1 писал(а):Если переменные вставляются из $_REQUEST, это не значит, что ранее они не проверяются)))
:smile: покажи
Увы, но кода много под проверкой.
Схема работы такая: Есть список полей в отдельной таблице, дергаем поля принадлежащей определенной группе. Далее идем по каждому полю и проверяем, все ли условия соблюдены (обязательно ли поле, валидируем его, используя соответствующий класс). Если по какому либо полю произошла ошибка, переменной $error присваиваем 1.
После валидации идет простой
if(!$error)
{
... //тут выполняем действия.
}

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: php json_encode\decode

Непрочитанное сообщение zg » 2011-08-30 20:35:10

xaker1 писал(а):валидируем его, используя соответствующий класс
ммм и где происходит экранирование?

Код: Выделить всё

zg-home% mysql -uroot -p**** -e 'SELECT "\u043f\u0440\u0438\u0432\u0435\u0442 \u043c\u0438\u0440!";'
+-------------------------------------------------+
| u043fu0440u0438u0432u0435u0442 u043cu0438u0440! |
+-------------------------------------------------+
| u043fu0440u0438u0432u0435u0442 u043cu0438u0440! |
+-------------------------------------------------+
ничего странного не находишь?

Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

Re: php json_encode\decode

Непрочитанное сообщение xaker1 » 2011-08-30 20:38:37

Там же и происходит экранирование, оно совмещено с валидацией.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: php json_encode\decode

Непрочитанное сообщение zg » 2011-08-30 20:46:14

xaker1 писал(а):Там же и происходит экранирование, оно совмещено с валидацией.
xaker1 писал(а):Но теперь русский текст приходит в виде какой-то странной строки
u0412u0430u043bu0435u0440u0438u0439
в этой строке нет слешей, которые обязательно должны быть. Потеряться они могли только когда данные вставлялись в базу.

PHP, в отличие от MySQL, не опускает невалидные слеши:

Код: Выделить всё

zg-home% php -r 'echo "\u043f\u0440\u0438\u0432\u0435\u0442 \u043c\u0438\u0440!", PHP_EOL;'
\u043f\u0440\u0438\u0432\u0435\u0442 \u043c\u0438\u0440!

Аватара пользователя
xaker1
сержант
Сообщения: 204
Зарегистрирован: 2010-03-10 21:26:33

Re: php json_encode\decode

Непрочитанное сообщение xaker1 » 2011-08-30 21:18:26

Так при замене функции на вышепоказанную все работает. Изменялась только функция, так что отбросить MySQL можно.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: php json_encode\decode

Непрочитанное сообщение zg » 2011-08-31 20:35:47

xaker1 писал(а):Так при замене функции на вышепоказанную все работает.
эммм..

Код: Выделить всё

var_dump(json_encode_cyr("Привет мир!"));
string(22) ""Привет мир!""
это не функция работает, это данные подставляются без слешей, которые не экранируются.