Php 使用mysqli\u escape\u字符串函数获取错误
我在Php 使用mysqli\u escape\u字符串函数获取错误,php,mysql,escaping,Php,Mysql,Escaping,我在mysqli_escape_string($hash))的最后一行得到一个错误使用以下代码: $hash = md5( rand(0,1000) ); $stmt = $mysqli->prepare("INSERT INTO users (username, password, hash) VALUES (?, ?, mysqli_escape_string($hash))"); $password = md5($password); $stmt->bind_param('ss
mysqli_escape_string($hash))的最后一行得到一个错误代码>使用以下代码:
$hash = md5( rand(0,1000) );
$stmt = $mysqli->prepare("INSERT INTO users (username, password, hash) VALUES (?, ?, mysqli_escape_string($hash))");
$password = md5($password);
$stmt->bind_param('ss', $username, $password, mysqli_escape_string($hash));
它说,mysqli\u escape\u字符串($hash))
是一个非对象。
但是只使用$hash
也没有帮助
有人能帮忙吗?您的代码应该是
$hash = md5( rand(0,1000) );
$stmt = $mysqli->prepare("INSERT INTO users (username, password, hash) VALUES (?, ?, ?)");
$password = md5($password);
$stmt->bind_param('sss', $username, $password, $hash);
您不需要使用参数化查询进行转义
您遇到的问题,您的escape
函数不正确。在使用OO方法时,您需要具有该函数的对象
$mysqli->real_escape_string($hash);
会是你想要的
您还再次绑定了该值,但这会引发错误,并且没有在传递的变量类型中设置它
包含一个或多个字符的字符串,用于指定相应绑定变量的类型
所以
应该有三个,因为有三个字符串,不需要转义
另外md5
ing密码不再是最佳做法,请查看:
您的代码应该是
$hash = md5( rand(0,1000) );
$stmt = $mysqli->prepare("INSERT INTO users (username, password, hash) VALUES (?, ?, ?)");
$password = md5($password);
$stmt->bind_param('sss', $username, $password, $hash);
您不需要使用参数化查询进行转义
您遇到的问题,您的escape
函数不正确。在使用OO方法时,您需要具有该函数的对象
$mysqli->real_escape_string($hash);
会是你想要的
您还再次绑定了该值,但这会引发错误,并且没有在传递的变量类型中设置它
包含一个或多个字符的字符串,用于指定相应绑定变量的类型
所以
应该有三个,因为有三个字符串,不需要转义
另外md5
ing密码不再是最佳做法,请查看:
您的代码有太多错误,要通过修复现有问题来提供解决方案将非常困难
首先,MD5不再被认为可以安全地用于密码存储
咨询:
另外,您没有正确使用准备好的语句
- 咨询:
如前所述,mysqli\u escape\u string()
函数要求将数据库连接作为第一个参数传递:
帮你自己一个忙然后用这个,ircmaxell的答案之一
从他的回答中可以看出:
就用图书馆吧。认真地它们的存在是有原因的
- PHP5.5+:使用
- PHP5.3.7+:使用(上述的兼容包)
- 所有其他:使用
不要自己做。如果你自己制作盐,你做错了。您应该使用一个为您处理该问题的库
$dbh = new PDO(...);
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);
登录时:
$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST['username']]);
$users = $result->fetchAll();
if (isset($users[0]) {
if (password_verify($_POST['password'], $users[0]->password) {
// valid login
} else {
// invalid password
}
} else {
// invalid username
}
您的代码有太多错误,要通过修复现有代码来提供解决方案将非常困难
首先,MD5不再被认为可以安全地用于密码存储
咨询:
另外,您没有正确使用准备好的语句
- 咨询:
如前所述,mysqli\u escape\u string()
函数要求将数据库连接作为第一个参数传递:
帮你自己一个忙然后用这个,ircmaxell的答案之一
从他的回答中可以看出:
就用图书馆吧。认真地它们的存在是有原因的
- PHP5.5+:使用
- PHP5.3.7+:使用(上述的兼容包)
- 所有其他:使用
不要自己做。如果你自己制作盐,你做错了。您应该使用一个为您处理该问题的库
$dbh = new PDO(...);
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);
登录时:
$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST['username']]);
$users = $result->fetchAll();
if (isset($users[0]) {
if (password_verify($_POST['password'], $users[0]->password) {
// valid login
} else {
// invalid password
}
} else {
// invalid username
}
RTM>>string mysqli\u real\u escape\u string(mysqli$link,string$escapestr)
您真的不应该使用MD5密码哈希。请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用密码\u散列()
。参数化散列<代码>?,mysqli\u escape\u字符串($hash)
应该是?,?
。参数化时也不需要逃避。建议您在发布问题之前进行自己的研究。有关更多信息,请参阅。此代码有太多错误,很难提供解决方案。你最好自己找到一段工作代码,还有很多。RTM>>string mysqli\u real\u escape\u string(mysqli$link,string$escapestr)
你真的不应该使用MD5密码哈希。请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用密码\u散列()
。参数化散列<代码>?,mysqli\u escape\u字符串($hash)应该是?,?
。参数化时也不需要逃避。建议您在发布问题之前进行自己的研究。有关更多信息,请参阅。此代码有太多错误,很难提供解决方案。你最好自己找到一段工作代码,还有很多。你真的不想鼓励别人使用MD5进行密码哈希,是吗?OP应该真正使用PHP的内置密码功能。@chris85非常感谢,非常感谢。:)杰伊,我也会听从你的建议,谢谢@JayBlanchard对此并不鼓励,并补充了相关说明。不过,我更喜欢md5ing而不是纯文本,因此OP比我看到的许多问题有更好的开始方法。OP得到了他们的解决方案,这才是重要的;-)顺便说一句,我没有在你的回答中使用链接或其他任何东西来表达我的观点;-)cheers@chris85克里斯,你的书同样内容丰富,足以让他们深入研究。告诉一个人如何钓鱼…,我相信你知道其余的;-)干杯你真的不想鼓励别人使用