【问题标题】:Convert from mysqli_query to mysqli prepared statement using mysql PASSWORD function使用 mysql PASSWORD 函数从 mysqli_query 转换为 mysqli 准备语句
【发布时间】:2012-08-02 16:04:42
【问题描述】:

我已将我的网站从 mysql 转换为 mysqli 准备语句,但一个查询除外。我想不通的查询是:

$sql = "SELECT customerID FROM customer WHERE customerEmail = '$loginEmailAddress' AND customerPassword = PASSWORD('$loginPassword');";
$result = mysqli_query($mysqli, $sql);

这很好用。当我尝试制作 mysqli 准备好的语句时,问题出在 mysql PASSWORD 函数上。甚至可以转换它吗?

我尝试过这样的事情:

$loginPassword = PASSWORD($loginPassword);

$stmt = $mysqli -> prepare("SELECT customerID from customer WHERE customerEmail = ? AND customerPassword =  ? ");
$stmt -> bind_param("ss", $loginEmailAddress,$loginPassword);
$stmt -> execute();
$stmt->store_result();
$stmt -> bind_result($customerID);
$stmt -> close();

当然没有成功。我也尝试过:

$loginPassword  = '" . PASSWORD('$loginPassword') . "';

我正在努力使用 phpass,但与此同时,我需要继续为现有客户使用 PASSWORD,直到他们登录并且我可以将他们移至新哈希。

【问题讨论】:

  • 在您执行$stmt->close(); 之前,$stmt->fetch() 在哪里?
  • 无需“转换” PASSWORD() 函数。不管你是使用mysql_、mysqli_还是PDO来访问mysql服务器。
  • 错过了 $checkRow = $stmt->num_rows();如果只检查 num_rows,不要认为我需要 fetch。我想我不明白如何在准备好的语句中使用 mysql 函数。 loginPassword 是文本,数据库中的密码是散列的,那么如何比较它们?在旧的 mysql 查询中,我做了 PASSWORD('$loginPassword') 所以我不知道如何在准备好的语句中做到这一点。

标签: php mysql mysqli prepared-statement


【解决方案1】:

PASSWORD() 是一个 MySQL 函数。它是 SQL 的一部分。你只需要参数化你传递给这个函数的参数。

$stmt = $mysqli -> prepare("SELECT customerID 
    FROM customer 
    WHERE customerEmail = ? AND customerPassword = PASSWORD(?) ");
$stmt -> bind_param("ss", $loginEmailAddress,$loginPassword);
$stmt -> execute();

警告:
仅存储使用 PHP 的 password_hash() 创建的密码哈希,然后您可以使用 password_verify() 进行验证。看看这篇文章:How to use password_hash 并了解更多关于bcrypt & password hashing in PHP

警告:

从 MySQL 5.7.6 开始不推荐使用此函数,并将在未来的 MySQL 版本中删除。

PASSWORD() 被 MySQL Server 中的认证系统使用;您不应该在自己的应用程序中使用它。

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2015-11-01
    • 2012-08-23
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多