【问题标题】:oci_bind_by_name not working when unescaped worksoci_bind_by_name 在未转义工作时不起作用
【发布时间】:2018-04-03 23:30:31
【问题描述】:

处理 Oracle 数据库的 UPDATE 查询。有问题的字段是NCHAR(25) 类型,它接受25 个字符的UTF-8 字节字符串。我的输入值在ASCII 中应该没问题。

下面的sn-p使用oci_bind_by_name函数将WHERE子句中的变量转义,插入到占位符变量:herp中。

$sql = "UPDATE MYTABLE SET OPT = '1' WHERE FIELD = :herp";
$stmt = oci_parse($this->conn, $sql);
oci_bind_by_name($stmt, ":herp", $record['value'], -1, SQLT_CHR);

下一个 sn-p 不使用 oci_bind_by_name 函数,而是将变量插入到 SQL 语句 未转义 (YOLO)。

$sql = "UPDATE MYTABLE SET OPT = '1' WHERE FIELD = '".$record['value']."'";
$stmt = oci_parse($this->conn, $sql);

我的问题

第一个 sn-p 不起作用,而第二个工作正常,即 UPDATE 语句在第二种方法上每次都成功,而在第一种方法上每次都失败。

UPDATE 的两个版本都应该可以工作。但是,当我对几个字段使用oci_bind_by_name 函数时,不知何故变量正在发生变化。 (我在实际代码中做了更严格的错误检查)。

我的问题

这里发生了什么?我怎样才能仍然使用oci_bind_by_name 而不是直接将变量连接到 SQL 语句中?

【问题讨论】:

  • PHP OCI8 不支持 NCHAR、NVARCHAR 等。请参阅 stackoverflow.com/questions/45369299/…
  • @ChristopherJones 感谢您的链接。我想我将手动构建查询,并希望在生产中获得最佳效果(不处理用户输入)。缺乏对 NCHAR 的支持非常严重。

标签: php oracle


【解决方案1】:

the developers:

PHP OCI8 或 PDO_OCI 都不支持 NVARCHAR、NCHAR 或 NCLOB 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 2011-08-20
    • 1970-01-01
    相关资源
    最近更新 更多