Данное расширение позволяет эмулировать модуль PDO при его отсутствии на хостинге.
Основу расширения представляет библиотека PHPPDO, огромное спасибо Николаю Ананиеву за неё, с маленьким патчем для корректировки поведения драйвера mysql от меня.
... 'db'=>array( 'class'=>'application.extensions.PHPPDO.CPdoDbConnection', 'pdoClass'=>'PHPPDO', ... ), ...
1.4
1.2-r5
1.2-r4
1.2-r3
1.2-r2
Дискуссия
Здравствуйте,
имею проблему : хостинг снял родной PDO mysql driver, далее я поставил ваш PHPPDO в protected/extensions, получилось в confige:
все равно при коннекте на базу выдается «CDbException Description
CDbConnection failed to open the DB connection: could not find driver Source File
/home/vol5/byethost7.com/b7_2489444/htdocs/yii/framework/db/CDbConnection.php(233)»
phpinfo - http://yy73.byethost7.com/ requirements - http://yy73.byethost7.com/yii/requirements/
поможите Ю
На хостинге просто включён PDO, однако отсутствует драйвер MySQL. Обновил релиз (1.2-r2), добавив возможность принудительного использования библиотеки PHPPDO.
поставил, менял даже $this→pdoClass = 'PHPPDO' без проверки условия. НЕ работает - та же ошибка «could not find driver»
Попробуйте тогда заменить следующую функцию в файле CPdoDbConnection.php:
у меня даже более того:
и все-таки «CDbConnection failed to open the DB connection: could not find driver»
Значит, класс по каким-то причинам не цепляется в Yii. Пришлите мне полный файл конфигурации config/main.php (пароли можно удалить совсем ;) ).
config - http://yy73.byethost7.com/bbb/main.php.txt
Так, ладно. А если задать несуществующий класс для db - будет ошибка, или всё опять «свалится» на could not find driver?
если в кофиге дать
то все в порядке, выдает ошибку
Вот этот код проверенно работает в Вашей ситуации. Однако, релиз r2 должен был выдавать сообщение, что класс PDO уже определён, а Вы говорите про драйвер…
Если и это не сработает, попробуйте сами вручную подключить библиотеку PHPPDO - тот, кто использует Yii должет быть и сам программист. ;)
Если какие-нибудь успехи в отношении обхода PDO?
пока нет, как будут - обязательно поделюсь рецептом.
something is wrong with this code:
the class will always be PHPPDO…
Very thanks for report.
Блин вроде все подключил и прописал но эта зараза ругается:
include(PDO.php) [<a href='function.include'>function.include</a>]: failed to open stream: No such file or directory
Непойму, вроде бы должен использовать PHPPDOМ-да, действительно есть такая проблема если на хостинге совсем нет PDO. Чуть перестарались в Yii с автозагрузкой классов - «мешается» проверка class_exists('PDO').
Попробуйте следующее исправление:
Смотрите версию 1.2-r5.
Blake-R спасибо большое! Заработало.
Вам спасибо. :)
Всё подключено по инструкции, но всеровно выдаём ошибку: YiiBase::include(PHPPDO.php) [<a href='function.YiiBase-include'>function.YiiBase-include</a>]: failed to open stream: No such file or directory не подскажите че делать?
Файл PHPPDO.php находится в том же каталоге, что и CPdoDbConnection.php - проверьте.
да файлы находяться в одном каталоге (PHPPDO.php и CPdoDbConnection.php)
Попробуйте испортировать полностью каталог расширения:
Также проверьте права доступа к файлам в этом каталоге.
Но теперь выдаёт после импорта) YiiBase::include(phppdo_mysqli_statement.php) [<a href='function.YiiBase-include'>function.YiiBase-include</a>]: failed to open stream: No such file or directory
Что-то у вас с настройками PHP не то. Ну, попробуйте ещё испортировать application.extensions.PHPPDO.drivers.*. Но я бы уже на этом этапе посоветовал заняться php.ini.
Пробывал импортировать application.extensions.PHPPDO.drivers.* но выдаёт ошибку самую первую опять (YiiBase::include(PHPPDO.php) [<a href='function.YiiBase-include'>function.YiiBase-include</a>]: failed to open stream: No such file or directory) Я пробываю на локалке и пробывал на хостинге. Вот на локальмом без PDO идёт работает фрем а когда пытаешься подключить PDO он не хоче. Когда начал тестить на хосте там вот ети ошибки. Самое интересно что они говорят что у них (на хостинге ) подключен PDO, но как начанаешь тестить без подключке PDO выдаёт: CDbException SQLSTATE[HY000]: General error: 2030 This command is not supported in the prepared statement protocol yet Пытаешься подключить PDO (на хостинге) выдаёт ошибки) Вот сам незнаю чё делать
Етот файл phppdo_mysqli_statement.php должен лежать в drivers? А то самое интересно что его там нет Или я ошибаюсь)
Вообще такого файла действительно не должно быть, уж не знаю откуда он у вас запрашивается…
в файл phppdo.php в 350 строке вместо if(!class_exists('phppdo_' . $driver . '_statement')) вставить if(!class_exists('phppdo_' . $driver . '_statement', false))
и проблема решена
Вот с этого лучше и надо было начинать: http://forums.mysql.com/read.php?52,117710,117710#msg-117710
В кратце - нет поддержки SHOW в prepared-запросах. Предлагаемое решение - «please use mysql version 5.1.22-rc or greater than this» - использовать mysql версии 5.1.22-rc или новее.
Но эту mysql версии 5.1.22-rc надо установить на хосте?
Разумеется.
CPdoDbConnection::require_once(drivers/sqlite_statement.php) [<a href='function.CPdoDbConnection-require-once'>function.CPdoDbConnection-require-once</a>]: failed to open stream: No such file or directory
почему выходит такая ошибка?
я проверил, в папке drivers действительно нет файла sqlite_statement.php!
Попробуйте использовать драйвер sqlite2.
я верно поменял в настройках файла main.php - 'connectionString' ⇒ 'sqlite2:blog\protected\data\blog.db',???
если да, то теперь вышла вот такая ошибка:
CDbConnection failed to open the DB connection: could not find extension
тут в чем может быть дело?
Дело в несовпадении имени драйвера в PHPPDO и Yii. Можно попробовать вернуть имя драйвера в sqlite и переименовать файлы sqlite2_statement.php (и ещё те, которые PHPPDO ещё не сможет найти), убрав цифру 2.
К сожалению, у меня совсем нет времени. Так что если что-то получится, отпишитесь о результатах, пожалуйста.
В коде класса phppdo_oci в методе connect кодировка соединения определяется как:
$charset = isset($this→dsn['charset']) ? $this→dsn['charset'] : (isset($_ENV['NLS_LANG']) ? $_ENV['NLS_LANG'] : 'WE8ISO8859P1');
это неверно, так как в переменной $_ENV['NLS_LANG'] если и будет содержаться значение, то оно будет неверным по формату для использования в функции oci_new_connect. Лучше оставить определение локали если она не задана переменной $this→dsn['charset'] на усмотрение самого драйвера oci, он справляется с этим лучше. Вот мой вариант определения:
$charset = isset($this→dsn['charset']) ? $this→dsn['charset'] : null;
Так работает гораздо лучше.