$stid = oci_parse($conn, "SELECT c1 FROM t1 WHERE c2 = " . $_POST['username'] . " AND c3 = " . $_POST['password'] . "");
我得到ORA-00904
和ORA-24374
:
ORA-00904:字符串:无效的标识符
ORA-24374:在获取或执行之前定义未完成并获取
使用$_POST
返回的固定字符串替换代码中的$_POST
会停止错误。它必须是$_POST
或我在代码中包含它的方式。
例如,$_POST['username']
为Doe
,$_POST['username']
使用Doe
但无法使用{{1}}。
答案 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()来获取带有上一条错误消息的数组。