我一直在寻找一种允许使用zend框架进行加载数据查询的解决方案,如:
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);
我忽略了什么吗?或者可能设置选项错误?我还读到mysql必须使用--enable-load-data或者其他东西编译,但查询可以使用sql编辑器,所以它应该通过php工作。
答案 0 :(得分:0)
我在Rend(Rapid Zend)框架中发现了interesting implementation个本地infiles。
基本上,该文件有一个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;
}
我确信在开源存储库中进行更多浏览会揭示一些解决问题的技巧。