我正在使用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");
这是我将多个变量注入查询字符串的结果,还是我犯了其他错误?
答案 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=
,并且在尝试运行查询时会导致错误。