2012-06-18 50 views
0

我想要在代碼點火器2.1.1中運行新的PDO驅動程序(以開始)本地(Mac OS 10.7)副本應用程序。 我最初使用Active Record對所有數據庫操作進行了編碼,現在我想在我的模型文件中使用PDO準備的語句。代碼點火器 - 嘗試配置database.php使用PDO驅動程序時出錯

我修改 '的application/config/database.php中' 像這樣: (注意幾個小的嵌入式問題)

[snip] 

$active_group = 'local_dev'; 

$active_record = TRUE;//<---BTW, will this need to stay TRUE to make CI sessions work? For better security, don't we want db-based CI sessions to use PDO too? 
//http://codeigniter.com/user_guide/database/configuration.html: 
    //Note: that some CodeIgniter classes such as Sessions require Active Records be enabled to access certain functionality. 

//this is the config setting that I am guessing (?) is my main problem: 

$db['local_dev']['hostname'] = 'localhost:/tmp/mysql.sock'; 

// 1.) if $db['local_dev']['dbdriver']='mysql', then here ^^^ 'localhost:/tmp/mysql.sock' works, 2.) but if $db['local_dev']['dbdriver']='pdo', then it fails with error msg. shown below. 

$db['local_dev']['username'] = 'root'; 
$db['local_dev']['password'] = ''; 
$db['local_dev']['database'] = 'mydbname'; 
$db['local_dev']['dbdriver'] = 'pdo'; 
$db['local_dev']['dbprefix'] = ''; 
$db['local_dev']['pconnect'] = TRUE; 
$db['local_dev']['db_debug'] = TRUE;//TRUE 
$db['local_dev']['cache_on'] = FALSE; 
$db['local_dev']['cachedir'] = ''; 
$db['local_dev']['char_set'] = 'utf8'; 
$db['local_dev']['dbcollat'] = 'utf8_general_ci'; 
$db['local_dev']['swap_pre'] = ''; 
$db['local_dev']['autoinit'] = TRUE; 
$db['local_dev']['stricton'] = FALSE; 
[snip] 

通過以上的配置,只要我打開一個控制器,我得到。此錯誤消息:

Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in 
/Library/WebServer/Documents/system/database/drivers/pdo/pdo_driver.php:114 Stack trace: #0 
/Library/WebServer/Documents/system/database/drivers/pdo/pdo_driver.php(114): PDO->__construct('localhost:/tmp/...', 'root', '', Array) #1 /Library/WebServer/Documents/system/database/DB_driver.php(115): CI_DB_pdo_driver->db_pconnect() #2 
/Library/WebServer/Documents/system/database/DB.php(148): CI_DB_driver->initialize() #3 
/Library/WebServer/Documents/system/core/Loader.php(346): DB('', NULL) #4 
/Library/WebServer/Documents/system/core/Loader.php(1171): CI_Loader->database() #5 
/Library/WebServer/Documents/system/core/Loader.php(152): CI_Loader->_ci_autoloader() #6 
/Library/WebServer/Documents/system/core/Con in 
/Library/WebServer/Documents/system/database/drivers/pdo/pdo_driver.php on line 114 

我試圖從github上一個換出「pdo_driver.php」文件,按照這樣的: http://codeigniter.com/forums/viewthread/206124/ ......但只是產生其他錯誤,更何況是d如果可能的話,不要觸摸系統文件的新手。

此線程似乎也暗示需要被盜號了「pdo_driver.php」系統文件: CodeIgniter PDO database driver not working 這似乎很奇怪對我來說,雖然,(有人認爲)一個黑客對系統文件是需要在CI v.2.1.1中使PDO工作,是吧?

感謝您的任何建議,我可以嘗試。

+0

在這裏讀到:http://stackoverflow.com/questions/5884761/how-can-i-use-pdo-in-codeigniter-2 –

+0

感謝嚴,(我所見到的)。 ..但它看起來像是一個老對話開始的人試圖安裝一個*自定義PDO hack *代碼點火器,反對編輯到我正在嘗試做的 - 只是得到支持(開箱即用)PDO驅動程序運行...所以不幫助我。 – govinda

回答

1

我不知道這是否對您有幫助,因爲您已經開始使用CI函數,但是我使用sqlite爲PDO創建了自己的庫,並自動加載它。我的需求很簡單,所以它的目的就在於此。

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

/** 
* CodeIgniter PDO Library 
* 
* 
* @author Michael Cruz 
* @version 1.0 
*/ 

class Sqlite_pdo 
{ 
    var $DB; 

    public function connect($path) { 
     try { 
      $this->DB = new PDO('sqlite:' . $path); 
     } 
     catch(PDOException $e) { 
      print "Error: " . $e->getMessage(); 
      die(); 
     } 
    } 

    public function simple_query($SQL) { 

     $results = $this->DB->query($SQL) 
      or die('SQL Error: ' . print_r($this->DB->errorInfo())); 

     return $results; 
    } 

    public function prepared_query($SQL, $bind = array()) { 

     $q = $this->DB->prepare($SQL) 
      or die('Prepare Error: ' . print_r($this->DB->errorInfo())); 

     $q->execute($bind) 
      or die('Execute Error: ' . print_r($this->DB->errorInfo())); 

     $q->setFetchMode(PDO::FETCH_BOTH);   

     return $q; 
    } 

    public function my_prepare($SQL) { 

     $q = $this->DB->prepare($SQL) 
      or die('Error: ' . print_r($this->DB->errorInfo()));    

     return $q; 
    } 

    public function my_execute($q, $bind) { 
     $q->execute($bind) 
      or die('Error: ' . print_r($this->DB->errorInfo())); 

     $q->setFetchMode(PDO::FETCH_BOTH); 

     return $q; 
    } 

    public function last_insert_id() { 
     return $this->DB->lastInsertId(); 
    } 
} 

/* End of file Sqlite_pdo.php */ 
+0

感謝邁克,我很欣賞看到有知識的人在幹什麼..(我喜歡看你的代碼),但正如你所指出的,我最感興趣的就是運行PDO驅動程序,就像Code Igniter支持的那樣,開箱即用。 – govinda

+0

沒問題,我沒有真正注意到他們試圖用PDO修復一些事情(包括假定讓sqlite工作)。不過,我在2.10中沒有追加它的原因是,他們添加了驅動程序,CI實際上並沒有使用準備好的查詢(包括查詢綁定方法),我也不相信添加PDO驅動程序會改變它。 – MikeCruz13

+0

是啊..我正在閱讀這篇文章......因爲我教育自己瞭解所發生的一切。此外,(我還沒有看過自己確認),但我最近幾天在某處讀到CodeIgniter-3現在在開發中......並且他們已經進行了大量修改......包括對PDO驅動程序的重大改進。因此,我猶豫與我自己的自定義的東西瘋狂(加上我仍然有點新的SQL)。 同時,我很樂意讓pdo驅動程序在這裏運行。我不知道爲什麼這麼簡單的東西到目前爲止是如此難以捉摸。 – govinda