PHP字符串不像多变量插入吗?

时间:2010-03-03 20:04:23

标签: php sql oracle oci ora-00904

我正在使用PHP 5.2和Oracle Database 11.1。

代码

$query = oci_parse($conn, "SELECT * FROM COMMENTS WHERE PINID=$pinID and COMMENTID=$commentID");

导致此错误:

  

警告:oci_execute()[function.oci-execute]:ORA-00904:“COMMENTS”: C:\ IODwww \ hello.php 中的标识符无效 159 行   ^

但运行此工作正常:

$query = oci_parse($conn, "SELECT * FROM COMMENTS WHERE PINID=$pinID and COMMENTID=1");

这是我将多个变量注入查询字符串的结果,还是我犯了其他错误?

4 个答案:

答案 0 :(得分:3)

出于性能和SQL注入的原因,您应该使用placeholder variables,如下所示:

$query = oci_parse($conn, "SELECT * FROM COMMENTS WHERE PINID = :pinID and COMMENTID = :commentID");
oci_bind_by_name($query, ':pinID', $pinID, -1, SQLT_INT);
oci_bind_by_name($query, ':commentID', $commentID, -1, SQLT_INT);
oci_execute($query);

答案 1 :(得分:2)

oci_execute()的警告不是PHP警告。结果查询有问题。

打印出来并查看它。

答案 2 :(得分:1)

PHP字符串中的多个变量没有问题。

要调试此问题,您可以尝试:

var_dump("SELECT * FROM COMMENTS WHERE PINID=$pinID and COMMENTID=$commentID");

并查看输出是否真正匹配:

string(...) "SELECT * FROM COMMENTS WHERE PINID=1 and COMMENTID=1" 

我能想到的唯一事情就是commentID为空或者包含一个“\ n”或附加的东西导致错误。

数据库输出的错误代码,“输入的列名称丢失或无效。”,如果使用=1,对我来说没有多大意义。

答案 3 :(得分:0)

尝试将变量放在括号内:

$query = oci_parse($conn, "SELECT * FROM COMMENTS WHERE PINID={$pinID} and COMMENTID={$commentID}");

另外,请确保$commentID没有返回一个空白值,该值只会在结尾处留下COMMENTID=,并且在尝试运行查询时会导致错误。