За последние 24 часа нас посетили 20642 программиста и 1826 роботов. Сейчас ищут 929 программистов ...

JSON и PHP кодировка

Тема в разделе "PHP и базы данных", создана пользователем Albinos4210, 24 окт 2016.

Метки:
  1. Albinos4210

    Albinos4210 Новичок

    С нами с:
    24 окт 2016
    Сообщения:
    7
    Симпатии:
    0
    Подскажите пожалуйста. Пишу программу для андроида, надо связать через JSON БД. Но столкнулся с кодировкой(наверное)
    Код (Text):
    1. $con = mysqli_connect ( HOST, USER, PASS, DB );
    2. mysql_query('SET CHARACTER SET utf8');
    3. $sql = "select * from s_products ORDER BY name LIMIT 1000,100";
    4. $res = mysqli_query ( $con, $sql );
    5. $result = array ();
    6. while($row = mysqli_fetch_array($res)){
    7. array_push($result, array('id'=>$row[0], 'name'=>$row[3]
    8. ));
    9. }
    10. $json=json_encode (array ("result" => $result) );
    11. echo $json;
    12. mysqli_close ( $con );
    Проблема только с кирилицей. Выдает
    Код (Text):
    1. {"result":[{"id":"30489","name":null},{"id":"34705","name":"Babyliss EP technology wet and dry 38mm 2073PE"},{"id":"12031","name":null},{"id":"11987","name":null},{"id":"11988","name":null},
    Помогите решить пожалуйста.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    почему null не понятно, но я когда конверчу, всегда юзаю JSON_UNESCAPED_UNICODE вторым параметром у функции json_encode
     
    denis01 нравится это.
  3. Albinos4210

    Albinos4210 Новичок

    С нами с:
    24 окт 2016
    Сообщения:
    7
    Симпатии:
    0
    я так делал. не то.
    сейчас сказали что надо
    перед array_push var_dump($row);
    но выдает хз что
    http://web.curl.com.ua/json2.php

    Код (Text):
    1. while($row = mysqli_fetch_array($res)){
    2.     var_dump($row);
    3. array_push($result, array('id'=>$row[0], 'name'=>$row[3]
    4. ));
    5. }
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    замени на mysqli_fetch_assoc
    --- Добавлено ---
    замени на
    PHP:
    1. $result[] = ['id' => (int)$row['id'], 'name' => $row['name']];
    --- Добавлено ---
    php поставь нормальной версии, не ниже 5.4
    --- Добавлено ---
    этого недостаточно
    дополни этим https://php.ru/manual/mysqli.set-charset.html

    и переходи на объекты уже.
     
  5. Albinos4210

    Albinos4210 Новичок

    С нами с:
    24 окт 2016
    Сообщения:
    7
    Симпатии:
    0
    спасибо попробую. я java учу. к PHP не добрался еще)
     
  6. Albinos4210

    Albinos4210 Новичок

    С нами с:
    24 окт 2016
    Сообщения:
    7
    Симпатии:
    0
    Код (Text):
    1. $mysqli = new mysqli(HOST, USER, PASS, DB);
    2.  
    3. mysqli_query('SET CHARACTER SET utf8');
    4. $sql = "select * from s_products ORDER BY name LIMIT 1000,100";
    5. $res = mysqli_query ( $mysqli, $sql );
    6. $result = array ();
    7. while($row = mysqli_fetch_assoc($res)){
    8. $result[] = ['id' => (int)$row['id'], 'name' => $row['name']];
    9. }
    10. $json=json_encode (array ("result" => $result), JSON_UNESCAPED_UNICODE );
    11. echo $json;
    12. /* изменение набора символов на utf8 */
    13. if (!$mysqli->set_charset("utf8")) {
    14.     printf("Ошибка при загрузке набора символов utf8: %s\n", $mysqli->error);
    15. } else {
    16.     printf("Текущий набор символов: %s\n", $mysqli->character_set_name());
    17. }
    18. mysqli_close ( $mysqli );
    тоже что и было
    http://web.curl.com.ua/json2.php
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а нафига тебе PHP? пиши backend на java.
     
    denis01 нравится это.
  8. Albinos4210

    Albinos4210 Новичок

    С нами с:
    24 окт 2016
    Сообщения:
    7
    Симпатии:
    0
    Для Java se, ee это не проблема. А для андроида есть нюансы. И сервер не впс, нельзя яву развернуть. Короче надо скрипт на пхп.
     
  9. Albinos4210

    Albinos4210 Новичок

    С нами с:
    24 окт 2016
    Сообщения:
    7
    Симпатии:
    0
    Может быть проблема в сервере? Был 5.4 поставил 5.6 еще есть 7.0
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    у тебя странный подход к программированию. Ты размещаешь код, устанавливающий кодировку соединения с бд после того, как всё уже сделал. Понимаешь, что не так?

    по урлу чета ща не пашет вообще.
     
    denis01 нравится это.
  11. Albinos4210

    Albinos4210 Новичок

    С нами с:
    24 окт 2016
    Сообщения:
    7
    Симпатии:
    0
    кодировка ничего не решает в данном случае. в цикле дело
    Код (Text):
    1. while($row = mysqli_fetch_assoc($res)){
    2. $result[] = ['id' => (int)$row['id'], 'name' => $row['name']];
    3. }
    не пашит потому что PHP 5.6 поставил.
    mbstring.internal_encoding:
    выключено было. Сейчас на 5.4 поменял
     
  12. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    я уже давно перестал мучиться с этой функцией - нашел и дополнил вот такую
    PHP:
    1. public static function to_json(array $data)
    2. {
    3.     //JSON
    4.     $isArray = true;
    5.     $keys = array_keys($data);
    6.     $prevKey = -1;
    7.  
    8.     // Необходимо понять — перед нами список или ассоциативный массив.
    9.     foreach ($keys as $key)
    10.         if (!is_numeric($key) || $prevKey + 1 != $key)
    11.         {
    12.             $isArray = false;
    13.             break;
    14.         }
    15.         else
    16.             $prevKey++;
    17.  
    18.     unset($keys);
    19.     $items = array();
    20.  
    21.     foreach ($data as $key => $value)
    22.     {
    23.         $item = (!$isArray ? "\"$key\":" : '');
    24.  
    25.         if (is_array($value))
    26.             $item .= self::to_json($value);
    27.         elseif (is_null($value))
    28.             $item .= 'null';
    29.         elseif (is_bool($value))
    30.             $item .= $value ? 'true' : 'false';
    31.         elseif (is_string($value))
    32.             $item .= '"' . preg_replace(
    33.                 '%([\\x00-\\x1f\\x22\\x5c])%e',
    34.                 'sprintf("\\\\u%04X", ord("$1"))',
    35.                 $value
    36.             ) . '"';
    37.         elseif (is_numeric($value))
    38.             $item .= $value;
    39.         else
    40.             throw new Exception('Wrong argument.');
    41.  
    42.         $items[] = $item;
    43.     }
    44.  
    45.     return
    46.         ($isArray ? '[' : '{') .
    47.         implode(',', $items) .
    48.         ($isArray ? ']' : '}');
    49. }