За последние 24 часа нас посетили 33173 программиста и 1317 роботов. Сейчас ищет 1201 программист ...

Serializing cUrl result

Тема в разделе "Прочие вопросы по PHP", создана пользователем shreck, 10 сен 2010.

  1. shreck

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

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    Приветствую!
    Существует такая проблема.

    Делаю cUrl запрос и в ответ получаю серилизованную строку с данными. Пытаюсь сделать unserialize($str) и получаю false.

    Хорошо. Пишем тест:
    PHP:
    1.  
    2. <?php
    3. //Пробелы поставлены методом "тыка" для "читабельности" поста.
    4. $str = 'a:33:{s:7:"user_id";i:199630;s:5:"login";s:10:"дщпшт";s:5:"alias";s:3:"bda";s:10:"isbusiness";i:0;s:7:"pn_r_id";i:230324
    5. ;s:11:"r_last_name";s:8:"ффф";s:6:"r_name";s:5:"ффф";s:13:"r_middle_name";s:9:"ффф";s:7:"pn_e_id";i:2525
    6. 73;s:11:"e_last_name";s:9:"qwerqwsda";s:6:"e_name";s:8:"sadfasdf";s:13:"e_middle_name";N;s:5:"em_id";i:186475;s:5:"e
    7. mail";s:19:"qwe@domain.ru";s:9:"em_upd_id";N;s:9:"email_upd";N;s:10:"ph_prim_id";i:97372;s:10:"phone_prim";s:10:
    8. "9878250690";s:9:"ph_sec_id";i:147605;s:9:"phone_sec";s:9:"123456";s:10:"ph_cell_id";N;s:10:"phone_cell";N;s:9:"ph_fa
    9. x_id";N;s:9:"phone_fax";N;s:8:"skype_id";i:147606;s:11:"phone_skype";s:8:"boldinov";s:7:"addr_id";i:159659;s:8:"zip_code"
    10. ;s:6:"150000";s:7:"country";s:2:"RU";s:8:"province";s:0:"";s:4:"city";s:6:"Москва";s:7:"address";s:15:"Россия,
    11. Саратов";s:8:"computed";i:1;}';
    12. var_dump(unserialize($str)); //false???? 0_o
    13. ?>
    14.  
    Выжимка из класса сервиса
    PHP:
    1.  
    2. <?php
    3. class A
    4. {
    5.     protected function _curlRequest($url, array $options = array())
    6.     {
    7.         $ch = curl_init();
    8.         curl_setopt($ch, CURLOPT_URL, $url);
    9.         curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    10.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    11.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    12.         curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    13.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    14.         if(!empty($options)) {
    15.             curl_setopt_array($ch, $options);
    16.         }
    17.         $result = curl_exec($ch);
    18.         $info = curl_getinfo($ch);        
    19.         if ( in_array($info['http_code'], $this->_validCodes) ) {
    20.             $data = iconv('windows-1251', 'UTF-8', $result);
    21.             return $data;
    22.         }
    23.         return false;
    24.     }
    25.  
    26.      function getProfile($userId)
    27.     {
    28.         $url = 'http://[адрес]'.intval($userId);
    29.         $result = $this->_curlRequest($url);
    30.         return $result;
    31.     }
    32. }
    33. ?>
    34.  
    Client.php listing:
    PHP:
    1.  
    2. <?php
    3. $client = new Zend_Soap_Client('[адрес]/server.php?wsdl',
    4.                                array('compression' => SOAP_COMPRESSION_ACCEPT));
    5. $str = $client->getProfile(199630);
    6. $arr = unserialize($str);
    7. var_dump($arr); //false???? 0_o
    8. ?>
    9.  
    Вопрос. Почему "false???? 0_o"?
     
  2. voxel

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

    С нами с:
    8 сен 2010
    Сообщения:
    19
    Симпатии:
    0
    Видно, что вы пытаетесь восстановить объект из строки в кодировке UTF-8, хотя сами используете windows-1251.
    Один из вариантов решения - пересчитать длины строк в новой кодировке.

    Код (Text):
    1. function mb_unserialize($string) {
    2.     $string = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $string);
    3.     return unserialize($string);
    4. }
    [/code]
     
  3. shreck

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

    С нами с:
    7 авг 2007
    Сообщения:
    479
    Симпатии:
    0
    Адрес:
    Россия, Саратов
    voxel, спасибо! Помогло!