这条线在PHP中出了什么问题?

时间:2014-05-12 12:11:28

标签: php oracle oci

代码

$stid = oci_parse($conn, "SELECT c1 FROM t1 WHERE c2 = " . $_POST['username'] . " AND c3 = " . $_POST['password'] . "");

问题

我得到ORA-00904ORA-24374

  

ORA-00904:字符串:无效的标识符
  ORA-24374:在获取或执行之前定义未完成并获取

使用$_POST返回的固定字符串替换代码中的$_POST会停止错误。它必须是$_POST或我在代码中包含它的方式。

例如,$_POST['username']Doe$_POST['username']使用Doe但无法使用{{1}}。

2 个答案:

答案 0 :(得分:2)

尝试制作引用查询变量。看起来你正在将字符串传递给db

$stid = oci_parse($conn, "SELECT c1 FROM t1 WHERE c2 = '" . $_POST['username'] . "' AND c3 = '" . $_POST['password'] . "'");

还要转义帖子数据以防止sql注入。

答案 1 :(得分:0)

您的代码行的主要问题在于它是SQL注入的一扇门;打电话让你的服务器入侵。在您已经使用的manual page for the oci_parse() function中,您有一个关于如何将参数传递给查询的示例:

$stid = oci_parse($conn, 'begin myproc(:p1, :p2); end;');
oci_bind_by_name($stid, ':p1', $p1);
oci_bind_by_name($stid, ':p2', $p2, 40);

oci_execute($stid);

您的代码可能如下所示:

$stid = oci_parse($conn, "SELECT c1 FROM t1 WHERE c2 = :username AND c3 = :password");
oci_bind_by_name($stid, 'username', filter_input(INPUT_POST, 'username');
oci_bind_by_name($stid, 'password', filter_input(INPUT_POST, 'password');
oci_execute($stid);

...尽管对返回值进行错误检查仍然是一个好主意。上面的所有三个函数都会在出错时返回FALSE,并且您有oci_error()来获取带有上一条错误消息的数组。