Инструменты пользователя

Инструменты сайта


projects:yii:rasshirenie_phppdo

Расширение Yii PHPPDO - Разработка прекращена!

Yii PHPPDO Extension

Версия: 1.4

Лицензия: LGPL

Зависимости: PHPPDO Library (идёт в комплекте)

Описание

Данное расширение позволяет эмулировать модуль PDO при его отсутствии на хостинге.

Основу расширения представляет библиотека PHPPDO, огромное спасибо Николаю Ананиеву за неё, с маленьким патчем для корректировки поведения драйвера mysql от меня.

Установка

  1. Распаковать архив в каталог 'protected/extensions';
  2. Добавить/изменить 'config/main.php':
       ...
       'db'=>array(
          'class'=>'application.extensions.PHPPDO.CPdoDbConnection',
          'pdoClass'=>'PHPPDO',
          ...
          ),
       ...

История изменений

1.4

  • Обновление PHPPDO (спасибо rohit).

1.2-r5

  • Исправлена ошибка нахождения файла PDO.php при отсутствии на сервере расширения pdo.so (спасибо Swarog)

1.2-r4

  • Исправлен маленький баг, из-за которого всегда использовался класс PHPPDO (thanks to Ryuuzaki).

1.2-r3

  • Исправлена ошибка повторного определения класса PDO, если расширение pdo включено на сервере.

1.2-r2

  • Добавлена возможность принудительного использования эмуляции PDO через указания параметра компонента pdoClass в значение PHPPDO.

Дискуссия

Юрий, 07.06.2009 18:38

Здравствуйте,

имею проблему : хостинг снял родной PDO mysql driver, далее я поставил ваш PHPPDO в protected/extensions, получилось в confige:

'db'=>array(
'class'=>'application.extensions.PHPPDO.CPdoDbConnection',
'connectionString'=>'mysql:host=sql204.byetcluster.com;dbname=b7_2489444_yandexmaps',
'username'=>'b7_2489444',
'password'=>'pwd',
'charset'=>'utf8',
),

все равно при коннекте на базу выдается «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/

поможите Ю

Blake-R, 07.06.2009 20:29

На хостинге просто включён PDO, однако отсутствует драйвер MySQL. Обновил релиз (1.2-r2), добавив возможность принудительного использования библиотеки PHPPDO.

Юрий, 07.06.2009 23:01

поставил, менял даже $this→pdoClass = 'PHPPDO' без проверки условия. НЕ работает - та же ошибка «could not find driver»

Blake-R, 08.06.2009 08:20

Попробуйте тогда заменить следующую функцию в файле CPdoDbConnection.php:

protected function createPdoInstance()
{
    $this->pdoClass = 'PHPPDO';
 
    require_once('pdoabstract.php');
    require_once('phppdo.php');
    require_once('pdoexception.php');
    require_once('pdostatementabstract.php');
 
    if(($pos=strpos($this->connectionString,':'))!==false)
    {
        $driver=strtolower(substr($this->connectionString,0,$pos));
        require_once('drivers/base_statement.php');
        require_once('drivers/'.$driver.'_statement.php');
    }
    return new $this->pdoClass($this->connectionString,$this->username,
                    $this->password,$this->_attributes);
}
Юрий, 08.06.2009 18:00

у меня даже более того:

protected function createPdoInstance()        {
 
            $this->pdoClass='PHPPDO';
            require_once('pdoabstract.php');
            require_once('phppdo.php');
            require_once('pdoexception.php');
            require_once('pdostatementabstract.php');
 
        $driver='mysql';
        require_once('drivers/base_statement.php');
        require_once('drivers/'.$driver.'_statement.php');
        return new  $this->pdoClass($this->connectionString,$this->username,$this->password,$this->_attributes);
}

и все-таки «CDbConnection failed to open the DB connection: could not find driver»

Blake-R, 08.06.2009 18:19

Значит, класс по каким-то причинам не цепляется в Yii. Пришлите мне полный файл конфигурации config/main.php (пароли можно удалить совсем ;) ).

Юрий, 08.06.2009 19:11

config - http://yy73.byethost7.com/bbb/main.php.txt

Blake-R, 08.06.2009 19:43

Так, ладно. А если задать несуществующий класс для db - будет ошибка, или всё опять «свалится» на could not find driver?

Юрий, 09.06.2009 10:22

если в кофиге дать

'db'=>array(
				 'class'=>'application.extensions.PHPPDO.CPdoDbConnection2',
 ),

то все в порядке, выдает ошибку

require(/home/vol5/byethost7.com/b7_2489444/htdocs/bbb/protected/extensions/PHPPDO/CPdoDbConnection2.php) [<a href='function.require'>function.require</a>]: failed to open stream: No such file or directory
Blake-R, 09.06.2009 10:59

Вот этот код проверенно работает в Вашей ситуации. Однако, релиз r2 должен был выдавать сообщение, что класс PDO уже определён, а Вы говорите про драйвер…

<?php
 
/**
 * Project:        Yii::PHPPDO
 * File:        CPdoDbConnection.php
 *
 * This extension allow use PHPPDO library for emulate PDO functionality.
 * For use it add in config/main.php:
 *    ...
 *    'db'=>array(
 *       'class'=>'application.extensions.PHPPDO.CPdoDbConnection',
 *       ...
 *       ),
 *    ...
 *
 * @link http://oleg.in-da.ru/
 * @author Oleg Blednov
 * @version 1.2-r3
 */
 
class CPdoDbConnection extends CDbConnection
{
    public $pdoClass = NULL;
 
    protected $_attributes=array();
    protected $_active=false;
    protected $_pdo;
    protected $_transaction;
    protected $_schema;
 
    protected function createPdoInstance()
    {
        if (!$this->pdoClass) {
            if (extension_loaded('pdo')) $this->pdoClass = 'PDO';
            $this->pdoClass = 'PHPPDO';
        }
 
        if ($this->pdoClass == 'PHPPDO' ) {
            require_once('phppdo.php');
        }
 
        if(($pos=strpos($this->connectionString,':'))!==false)
        {
            $driver=strtolower(substr($this->connectionString,0,$pos));
 
            if ($this->pdoClass == 'PDO')
            {
                if($driver==='mssql' || $driver==='dblib')
                    $this->pdoClass='CMssqlPdoAdapter';
            }
            elseif ($this->pdoClass == 'PHPPDO')
            {
                require_once('drivers/base_statement.php');
                require_once('drivers/'.$driver.'_statement.php');
            }
 
        }
        return new $this->pdoClass($this->connectionString,$this->username,
                                    $this->password,$this->_attributes);
    }
}
 
?>

Если и это не сработает, попробуйте сами вручную подключить библиотеку PHPPDO - тот, кто использует Yii должет быть и сам программист. ;)

Blake-R, 11.06.2009 13:59

Если какие-нибудь успехи в отношении обхода PDO?

Юрий, 11.06.2009 14:09

пока нет, как будут - обязательно поделюсь рецептом.

Ryuuzaki, 13.06.2009 17:14

something is wrong with this code:

      if (!$this->pdoClass) {
          if (extension_loaded('pdo')) $this->pdoClass = 'PDO';
          **$this->pdoClass = 'PHPPDO';**
      }

the class will always be PHPPDO…

Blake-R, 15.06.2009 08:21

Very thanks for report.

Swarog, 15.09.2009 01:12

Блин вроде все подключил и прописал но эта зараза ругается: include(PDO.php) [<a href='function.include'>function.include</a>]: failed to open stream: No such file or directory Непойму, вроде бы должен использовать PHPPDO

Blake-R, 15.09.2009 09:01

М-да, действительно есть такая проблема если на хостинге совсем нет PDO. Чуть перестарались в Yii с автозагрузкой классов - «мешается» проверка class_exists('PDO').

Попробуйте следующее исправление:

--- a/protected/extensions/PHPPDO/CPdoDbConnection.php    2009-08-26 15:52:14.000000000 +0400
+++ b/protected/extensions/PHPPDO/CPdoDbConnection.php    2009-09-15 08:57:38.000000000 +0400
@@ -35,6 +35,11 @@
             else $this->pdoClass = 'PHPPDO';

         if ($this->pdoClass == 'PHPPDO') {
+            if (!class_exists('PDO', false)) {
+                require_once('pdoabstract.php');
+                require_once('pdostatementabstract.php');
+                require_once('pdoexception.php');
+            }
             require_once('phppdo.php');

Смотрите версию 1.2-r5.

Swarog, 15.09.2009 09:38

Blake-R спасибо большое! Заработало.

Blake-R, 15.09.2009 09:49

Вам спасибо. :)

assault, 27.11.2009 21:07

Всё подключено по инструкции, но всеровно выдаём ошибку: YiiBase::include(PHPPDO.php) [<a href='function.YiiBase-include'>function.YiiBase-include</a>]: failed to open stream: No such file or directory не подскажите че делать?

Blake-R, 29.11.2009 10:47

Файл PHPPDO.php находится в том же каталоге, что и CPdoDbConnection.php - проверьте.

assaul, 30.11.2009 19:09

да файлы находяться в одном каталоге (PHPPDO.php и CPdoDbConnection.php)

Blake-R, 30.11.2009 19:35

Попробуйте испортировать полностью каталог расширения:

...
'import' => array(
    ...
    'application.extensions.PHPPDO.*',
    ),
...

Также проверьте права доступа к файлам в этом каталоге.

assault, 30.11.2009 21:09

Но теперь выдаёт после импорта) YiiBase::include(phppdo_mysqli_statement.php) [<a href='function.YiiBase-include'>function.YiiBase-include</a>]: failed to open stream: No such file or directory

Blake-R, 30.11.2009 21:25

Что-то у вас с настройками PHP не то. Ну, попробуйте ещё испортировать application.extensions.PHPPDO.drivers.*. Но я бы уже на этом этапе посоветовал заняться php.ini.

assault, 30.11.2009 21:34

Пробывал импортировать 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 (на хостинге) выдаёт ошибки) Вот сам незнаю чё делать

assault, 30.11.2009 21:41

Етот файл phppdo_mysqli_statement.php должен лежать в drivers? А то самое интересно что его там нет Или я ошибаюсь)

Blake-R, 30.11.2009 21:43

Вообще такого файла действительно не должно быть, уж не знаю откуда он у вас запрашивается…

Рамазан, 24.11.2010 02:25

в файл phppdo.php в 350 строке вместо if(!class_exists('phppdo_' . $driver . '_statement')) вставить if(!class_exists('phppdo_' . $driver . '_statement', false))

и проблема решена

Blake-R, 30.11.2009 21:41

Вот с этого лучше и надо было начинать: 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 или новее.

assault, 01.12.2009 11:14

Но эту mysql версии 5.1.22-rc надо установить на хосте?

Blake-R, 01.12.2009 11:39

Разумеется.

StiLet, 04.07.2010 15:30

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!

Blake-R, 04.07.2010 22:04

Попробуйте использовать драйвер sqlite2.

StiLet, 04.07.2010 22:17

я верно поменял в настройках файла main.php - 'connectionString' ⇒ 'sqlite2:blog\protected\data\blog.db',???

если да, то теперь вышла вот такая ошибка:

CDbConnection failed to open the DB connection: could not find extension

тут в чем может быть дело?

Blake-R, 26.07.2010 09:57

Дело в несовпадении имени драйвера в PHPPDO и Yii. Можно попробовать вернуть имя драйвера в sqlite и переименовать файлы sqlite2_statement.php (и ещё те, которые PHPPDO ещё не сможет найти), убрав цифру 2.

К сожалению, у меня совсем нет времени. Так что если что-то получится, отпишитесь о результатах, пожалуйста.

miramir, 22.10.2010 16:34

В коде класса 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;

Так работает гораздо лучше.

Enter your comment
 
projects/yii/rasshirenie_phppdo.txt · Последние изменения: 22.10.2010 17:08 (внешнее изменение)

Инструменты страницы

power balance купить СПб