【问题标题】:PHP Prepared Statement IssuesPHP 准备好的语句问题
【发布时间】:2014-06-30 07:01:45
【问题描述】:

我在执行以下准备好的语句时遇到了麻烦。 我使用了相同的准备好的语句代码,并使其在其他地方工作,所以不确定我哪里出错了。我在没有使用串联的准备好的语句的情况下启动并运行了以下脚本,因此我知道我的 SQL 或初始电子邮件/密码验证没有问题。

数据库查询只返回一行,我认为这不会影响我的 while 数组获取吗? 电子邮件地址和密码设置为 prepared statement ('ss') 中的字符串,假设没有问题。

我在最初的查询连接中使用了get_password_hash($p),它起作用了。也许我应该像这样将它包含在绑定参数中:

$loginQuery->bind_param('ss',$e,get_password_hash($p));

而不是下面...

任何建议将不胜感激。

// Array for recording errors:
$login_errors = array();


// Validate the email address:
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$e = $_POST['email'];
} else {
$login_errors['login'] = 'Please enter a valid email address!';
}

// Validate the password:
if (!empty($_POST['pass'])) {
$p = $_POST['pass'];
} else {
$login_errors['pass'] = 'Please enter your password!';
}


if (empty($login_errors)) { // OK to proceed!
// Query the database:

/************NO ISSUES WITH ABOVE; THIS WORKED FINE BEFORE I TRIED CONVERTING TO PREPARED STATEMENTS************/

    $pas = get_password_hash($p);
    $loginQuery = $dbc->prepare("SELECT id, username, type, IF(date_expires >= NOW(), true, false) FROM user WHERE (email= ? AND pass= ?)");
    $loginQuery->bind_param('ss',$e,$pas);
    $loginQuery->execute();
    $loginQuery->bind_result($l);

        while(loginQuery->fetch()){
        $login = $l;
        $_SESSION['user_id'] = $login[0];
        $_SESSION['username'] = $login[1];
        } 

}  

【问题讨论】:

  • 使用准备好的语句时不需要转义任何内容。
  • 另外,你有什么问题?
  • Mihai - 不确定,把这个放上来看看我的代码是否有任何明显的问题。
  • 尝试 --- fetch_all --- 而不是 --- fetch --- php.net/manual/en/mysqli-result.fetch-all.php
  • 运气不好。我目前没有收到任何错误。调用脚本的页面只是空白,页面源中没有任何内容。

标签: php sql prepared-statement


【解决方案1】:

您在顶部使用变量$p,但在下方使用$pas。

无论如何,你不应该用准备好的语句做任何 mysql_escape_blahblahblah 的事情。直接这样做:

$loginQuery->bind_param('ss',$_POST['email'],$_POST['pass']);

【讨论】:

  • 谢谢。我摆脱了转义并编辑了原始问题。 $p 是实际密码,我将哈希值存储在数据库中。 $pas 是散列版本。如果电子邮件格式不正确或未输入密码,我还会在顶部创建一些 IF 语句来创建登录错误,这些错误会显示在页面上。在获取我的数组时看不到任何问题?
  • $pas = get_password_hash($p);
  • 过失,我错过了get_password_hash()。但重点仍然是你不应该做任何 mysql 逃逸 hoohah。
猜你喜欢
  • 2011-06-02
  • 1970-01-01
  • 2011-06-21
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
相关资源
最近更新 更多