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克里斯,你的书同样内容丰富,足以让他们深入研究。告诉一个人如何钓鱼…,我相信你知道其余的;-)干杯你真的不想鼓励别人使用