【发布时间】: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 的支持非常严重。