非转义工作时,oci_bind_by_name无法正常工作

时间:2018-01-31 14:56:19

标签: php oracle

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

以下代码段使用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);

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

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

我的问题

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

UPDATE的两个版本都应该有效。但是,当我在一些字段中使用oci_bind_by_name函数时,变量会以某种方式变化。 (我在实际代码中进行了更严格的错误检查)。

我的问题

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

1 个答案:

答案 0 :(得分:1)

the developers

  

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