2012-01-24 28 views
1

我一直在尋找一個解決方案,允許負載數據的查詢與像Zend框架:禁止的Zend PDO_MYSQL LOAD DATA

LOAD XML LOCAL INFILE '$dbFile' INTO TABLE mytable ROWS IDENTIFIED BY '<object>'; 

當我嘗試執行此查詢,我得到以下錯誤:

Warning: PDO::exec() [pdo.exec]: LOAD DATA LOCAL INFILE forbidden 

但是,如果我輸出查詢並將其複製/粘貼到像HeidiSQL這樣的編輯器中,查詢就可以工作。 我搜索的答案,發現我應該設置驅動器選項PDO :: MYSQL_ATTR_LOCAL_INFILE,但它似乎並沒有工作。

我想用的application.ini設置驅動器選項:

resources.multidb.mydb.adapter = "Pdo_Mysql" 
resources.multidb.mydb.dbname = "mydb" 
resources.multidb.mydb.username = "myuser" 
resources.multidb.mydb.password = "mypass" 
resources.multidb.mydb.driver_options.PDO::MYSQL_ATTR_LOCAL_INFILE = true 
resources.multidb.mydb.driver_options.1001 = true 

我嘗試過以下方式,但得到了同樣的錯誤:

$config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', 'testing'); 
$dbParams = $config->resources->multidb->mydb->toArray(); 
$dbParams['driver_options'] = array(PDO::MYSQL_ATTR_LOCAL_INFILE => '1'); 
$db = Zend_Db::factory($config->resources->multidb->mydb->adapter, $dbParams); 

我俯瞰的東西嗎?或者可能設置選項錯誤?我還讀到,必須使用--enable-load-data編譯mysql,但查詢與sql編輯器一起工作,所以它應該通過php工作。

+0

您連接的用戶的權限是什麼?同樣,服務器和客戶端都可以通過.ini來配置,以禁用infile的東西,因爲它可能存在安全風險:http://dev.mysql.com/doc/refman/5.1/en/load-data-local .html –

+1

我正在使用本地wamp設置進行開發。我沒有通過使用root用戶連接。所有設置都是默認設置與HeidiSQL(執行加載數據)連接時,我使用相同的root用戶。我發現關鍵字'本地'是麻煩製造者,我不需要它。省略此關鍵字不會再產生錯誤。它現在適用於我,但我仍然想知道如何啓用'LOCAL'。我認爲,它必定是一件微不足道的事情。 – toonevdb

回答

0

我發現當地infiles的interesting implementation在撕裂(快速的Zend)框架。

基本上,文件具有PDO對象的類,有這樣的方法:

/** 
* Set the local infile flag 
* 
* @param boolean $allowLocalInfile 
* @return Rend_Factory_Database_Pdo_Mysql 
*/ 
public function setAllowLocalInfile($allowLocalInfile) 
{ 
    $this->_options["driver_options"][PDO::MYSQL_ATTR_LOCAL_INFILE] = $allowLocalInfile; 
    return $this; 
} 

我敢肯定,在開源庫更多的瀏覽就會發現一些技巧來解決你的問題。