在PHP中将使用mysql password()函数的mysqli_query转换为预处理语句

3

我正在使用mysql或mysqli的password()函数在SELECT查询中对用户进行身份验证。

select * from users where u_name='$username' and u_pword = password('$password');

我想将这个内容转换成带参数的预处理语句(prepared statement),但如何处理password()函数呢?password()函数是放在预处理语句中,例如password(?),还是放在参数中,例如password($var)
我之前遇到过类似的问题(Convert from mysqli_query to mysqli prepared statement using mysql PASSWORD function),但没有得到答案。
这可能是一个普遍的问题,也许是时候再次提出了。有人能提供帮助吗?

那个函数已经被弃用了,我认为你应该使用PHP哈希函数。自MySQL 5.7.6起,此函数已被弃用,并将在未来的MySQL版本中删除。http://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_password然而我不知道如何使用带参数的查询来使用mysql函数。如果你在绑定值中使用`'password( ' . $password . ')',它只会被视为字符串引用。还请注意,PASSWORD()`由MySQL服务器中的身份验证系统使用;你不应该在你自己的应用程序中使用它。 - chris85
我会看一下这两个网址:https://dev59.com/yHRC5IYBdhLWcg3wJNYN 和 https://dev59.com/t3I-5IYBdhLWcg3wpaB1。另外,在参数化查询中,使用mysql函数中的占位符也是可行的。例如:`SELECT * FROM Table where name = md5(?)`。 - chris85
谢谢,Chris,这些是有用的参考资料。 - SnowyOwl
您可以在任何允许表达式的地方使用 ? 作为占位符。您认为 PASSWORD() 的参数与查询的其他部分有什么不同吗? - Barmar
假设您的意思是将 ? 放在预处理语句中,那么绑定参数应该是 password($password),但这样不起作用。如果预处理语句包含 password(?),而参数是 $password,也不起作用。 - SnowyOwl
显示剩余2条评论
1个回答

0
我需要更多的代码,你应该像这样做了些什么。
<?php
$link = new mysqli( /* connect */);
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno .") "$mysqli->connect_error;
}

/* Prepared statement, stage 1: prepare */
if (!($stmt = $mysqli->prepare("SELECT * FROM `users` WHERE u_name=? AND u_pword=password(?)"))) {
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

if (!$stmt->bind_param("ss", $username, $password )) {
    echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}

if (!$stmt->execute()) {
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}

?>

希望这有所帮助。如果是的话,请接受为答案。 无论如何,正如有人建议的那样,您不应该使用PASSWORD()函数,而且我会说您应该使用PDO。它值得。只要SQL兼容,切换数据库非常容易。即使不兼容,仍然相对容易。


感谢您的帮助。这段代码与我之前使用的代码类似,只是增加了错误消息。然而它并没有抛出任何错误消息,事实上,它也没有返回任何结果。我添加了printf("%d Rows found.\n", $stmt->affected_rows); 但是没有任何返回。 - SnowyOwl
你确定之前使用 password() 函数正确地存储了密码吗? - Ronnie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接