【问题标题】:PHP throwing errors on simple select queries?PHP在简单的选择查询上抛出错误?
【发布时间】:2012-09-16 10:11:08
【问题描述】:

不知道发生了什么,我不断收到错误消息。我已将问题简化为一个很小的测试用例,见下文:


login.html

<form action="login.php" method="post">
    <input type="email" name="email" required />
    <input type="password" name="password" required />

    <input type="submit" value="Login"/>
</form>

login.php

$email    = $_POST["email"];
$password = sha1($_POST["password"]);

$stid2 = oci_parse($conn, 'SELECT EMAIL, PASSWORD FROM TUSERS where EMAIL =: email AND PASSWORD =: password');
oci_execute($stid2);

$nrows = oci_fetch($stid2);

print var_dump($nrows);

错误

警告:oci_execute(): ORA-01008: 并非所有变量都绑定在第 5 行的 login.php 中

警告:oci_fetch(): ORA-24374: 在第 7 行 bool(false) 上的 login.php 中获取或执行和获取之前定义未完成

【问题讨论】:

  • 它的 var_dump() 不是 vardump(),懒得解释其余的了。
  • 不用绑定邮箱和密码吗?

标签: php forms oracle11g oracle-call-interface


【解决方案1】:

您在查询中添加了变量占位符,但没有绑定任何东西

$stid2 = oci_parse($conn, 'SELECT EMAIL, PASSWORD FROM TUSERS where EMAIL =:email AND PASSWORD =:password');
oci_bind_by_name($stid2, ':email', $email);
oci_bind_by_name($stid2, ':password', $password);
oci_execute($stid2);

oci_bind_by_name

【讨论】:

  • 谢谢,绑定也有与消毒有关的作用吗? - 如果没有,我该怎么做?
  • 如您所见,查询字符串和变量内容是分开定义的,与db一起工作的库知道哪个是哪个。即使(如果 dbms 支持),查询和数据也可能在单独的查询中发送到 dbms。所以至少这样可以防止sql注入。
  • 我也很怀疑;不幸的是,我在这里没有代表,否则我会支持您的回答和评论:)
【解决方案2】:

您需要将变量 $email 和 $password 绑定到 oracle 占位符。见oci_bind_by_name。此外,占位符应为​​:email:password。冒号 (:) 和占位符名称(emailpassword)之间有一个空格。

【讨论】:

    猜你喜欢
    • 2019-09-21
    • 2015-06-09
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2014-08-26
    相关资源
    最近更新 更多