Проблема с Zend Oauth и записью токена доступа в базу данных mySQL - PullRequest
1 голос
/ 27 августа 2010

Я использую Zend Oauth для подключения моего приложения к Twitter, как описано здесь: http://framework.zend.com/manual/en/zend.oauth.introduction.html

Он отлично работает, сохраняя токен запроса Twitter и токен доступа Twitter в сеансе, используя сериализацию и десериализацию, как это (сокращенно):

1: $consumer = new Zend_Oauth_Consumer($config);
2: $token = $consumer->getRequestToken();
3: $_SESSION['TWITTER_REQUEST_TOKEN'] = serialize($token); //write Request Token

... и ...

4: $consumer = new Zend_Oauth_Consumer($config);
5: $token = $consumer->getAccessToken($_GET,
unserialize($_SESSION['TWITTER_REQUEST_TOKEN']));
6: $_SESSION['TWITTER_ACCESS_TOKEN'] = serialize($token); //write Access Token

... и ...

7: $token = unserialize($_SESSION['TWITTER_ACCESS_TOKEN']);
8: $client = $token->getHttpClient($configuration);

Теперь я хочу сохранить доступТокен в моей базе данных MySQL после строки 6. Проблема в том, что как только я делаю это, запись в БД содержит странные символы, подобные этому:

O:23:"Zend_Oauth_Token_Access"?:{s:10:"�*�_params";a:4:{s:11:"oauth_token";s:50:"64658798-xOvsSyC83P2lhZRVvvaQLQddaifKO2qmN2KL91eaI";s:18:"oauth_token_secret";s:42:"R4nBLeWhNRXleKsN6H3crubYd2FEmfHFRtLbEh8gos";s:7:"user_id";s:8:"64658798";s:11:"screen_name";s:13:"MyTwitterAccount";}}

, что приводит к уведомлению (Ошибка по смещению 30 от280 байт) в строке 7 и фатальная ошибка в строке 8, поскольку $ token не является объектом.Поэтому я попытался выяснить ошибку и уже опубликовал проблему на форуме Zend, но никто не мог мне помочь ... Я думаю, что это ошибка кодирования.База данных и все мои документы правильно кодируются в utf-8, хотя у меня никогда не было таких проблем, как раньше ... var_dump ($ token) в строке 3 показывает мне, что там уже есть зашифрованные символы.Вот выдержка:

"Accept-Encoding" ["Content-encoding"]=>  string(4) "gzip" ["Content-length"]=>  string(3) "146" ["Connection"]=>  string(5) "close" } ["body":protected]=>  string(146) "�������E˹� ��п��J;80���4(,9��� ��.M��ؖ�"K���H���Q��a|;W����d2��.�׸Je�-���-y.���3��〺  object(Zend_Oauth_Http_Utility)#89 (0)

Является ли проблема с gzip в кодировке контента?Или проблема вызвана Zend и методом getRequestToken ()?Любая помощь высоко ценится.Заранее спасибо

1 Ответ

1 голос
/ 28 сентября 2010

Взятый из справки php.net по сериализации

добавлены проводные символы при сериализации для защищенных и закрытых переменных, это нулевой байт

Если сериализация объектов будет сохранена в базе данных postgresql«нулевой байт», введенный для закрытых и защищенных членов, добавляет ключ в систему.Даже pg_escape_bytea () для значения и сохранение значения в виде двоичного типа завершается неудачно при определенных обстоятельствах.

Для грязной работы:

$ serialized_object = serialize ($ my_object);$ safe_object = str_replace ("\ 0", "~~ NULL_BYTE ~~", $ serialized_object);

?>

это также позволяет хранить объект в читаемом текстовом формате,При чтении данных обратно:

$ serialized_object = str_replace ("~~ NULL_BYTE ~~", "\ 0", $ safe_object);$ my_object = unserialize ($ serialized_object);

?>

Единственный метод с этим методом состоит в том, что имена или значения членов вашего объекта могут как-то содержать нечетную строку "~~ NULL_BYTE ~~",Если это так, то str_replace () для строки, которую вы гарантированно не найдете где-либо еще в строке, которую возвращает serialize ().Также не забудьте определить класс перед вызовом unserialize ().

Если вы храните данные сеанса в базе данных postgresql, то этот обходной путь является обязательным, поскольку $ data, передаваемые в функцию записи сеанса, уже сериализованы..

...