【问题标题】:PDO::quote for oraclePDO::oracle 报价
【发布时间】: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 是否有效。
  • 这个功能没用。你应该改用参数。

标签: php mysql sql oracle pdo


【解决方案1】:

这是 mysql 示例中的不正确引用用法。

这里正确的:

$sql = 'SELECT modelID FROM statements
       WHERE modelID = ?
       AND subject = ?
       AND predicate = ?
       AND object = ?
       AND l_language= ?';

Oracle 也遵循此模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多