【发布时间】:2014-01-03 20:33:32
【问题描述】:
我有 pdo_oci 驱动,成功 pdo 连接到 oracle 数据库。我有一个需要双引号的查询,所以我的问题是:为什么 pdo_oci::quote 不起作用?
例子:
$dsn = 'oci:dbname=' . $dbUrl . '/' . $dbName . ';charset=utf8';
$options = array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_BOTH,
PDO::ATTR_PERSISTENT => false,
PDO::ATTR_EMULATE_PREPARES => false);
$conn = new PDO($dsn,$db_username,$db_password,$options);
$tmp = 'temp';
var_dump('select * from' . $conn->quote($tmp));
result: string(13) "select * from"
我问这个是因为我的课程很少,使用 pdo::quote()。当我只使用 MySQL 时一切都很好,但现在我需要 oracle。因此,如果我无法弄清楚为什么 pdo_oci quote() 不起作用,我将不得不将每个引用方法更改为我自己的一些方法,或者覆盖 pdo::quote ?虽然我不想那样做。
编辑:因为有些人认为这个例子是理所当然的,所以我可以给你一个使用 mysql 并且有适当的 quote() 用法的例子:
$sql = 'SELECT modelID FROM statements
WHERE modelID = ' .$this->modelID .'
AND subject =' .$this->dbConn->quote($row[0]) .'
AND predicate =' .$this->dbConn->quote($row[1]) .'
AND object =' .$this->dbConn->quote($row[2]) .'
AND l_language=' .$this->dbConn->quote($row[3]);
明白我的意思了吗?如果无法使 quote() 工作,这只是我需要更改的众多查询之一。
【问题讨论】:
-
手册上说“并非所有 PDO 驱动程序都实现此方法”并且 Oracle 驱动程序是实验性的(Oracle 不支持它并且社区不活跃)。是否可以只切换到准备好的语句?
-
你很清楚这个功能是做什么的吗?从您发布的代码中可以看出您没有。
-
好点...引用表名只会破坏查询。我忽略了这一点。
-
这只是一个例子,我知道这不是你使用 quote() 的方式,我的意思是它不起作用。我想知道这是否是驱动程序问题以及是否有人有一些解决方案,而不是告诉我我的示例是错误的。还不如编写简单的字符串而不是查询......我所需要的只是检查 pdo_oci::quote 是否有效。
-
这个功能没用。你应该改用参数。