【发布时间】:2017-08-28 11:50:56
【问题描述】:
我有以下代码
if (isset($_POST['change'])) {
$current = mysqli_real_escape_string($con, $_POST['current']);
$password = mysqli_real_escape_string($con, $_POST['password']);
$cpassword = mysqli_real_escape_string($con, $_POST['cpassword']);
if(strlen($password) < 6) {
$error = true;
$password_error = "Password must be minimum of 6 characters";
}
if($password != $cpassword) {
$error = true;
$cpassword_error = "Password and Confirm Password doesn't match";
}
if(mysqli_fetch_field(mysqli_query($con, "SELECT password FROM users WHERE id = '" . $_SESSION['usr_id'] . "' LIMIT 1")) != md5($current)) {
$error = true;
$confirm_error = "Your actual password is not correct";
}
}
问题出在这里:
mysqli_fetch_field(mysqli_query($con, "SELECT password FROM users WHERE id = '" . $_SESSION['usr_id'] . "' LIMIT 1"))
它给了我错误
PHP 可捕获的致命错误:第 27 行 /.../password.php 中的 stdClass 类的对象无法转换为字符串
我试过了
mysql_result(mysqli_query($con, "SELECT password FROM users WHERE id = '" . $_SESSION['usr_id'] . "' LIMIT 1"), 0)
但它不起作用,它给了我
PHP 致命错误:未捕获的错误:调用 /.../password.php:27 中未定义的函数 mysql_result()
我不想使用mysqli_fetch_array() 和while 循环。我搜索了一个函数或类似的东西,我找到了一些东西,但对我没有用。
【问题讨论】:
-
mysqli_real_escape_string($con, $_POST['password'])你知道那会适得其反。 -
可能与
mysqli_fetch_field无关。转储$_SESSION['usr_id'],并将您的 mysqli_query 和 mysqli_fetch_field 语句分开。当然 mysql_result 不会起作用,它不是 mysqli 函数。 -
I don't want to use mysqli_fetch_array() and a while loop..... 为什么? -
您的代码使用不安全;尤其是您使用的密码功能
md5($current)。请勿不要将此放在网上。我称这是您的代码失败的“因祸得福”。 -
确保在散列之前don't escape passwords或对它们使用任何其他清理机制。这样做会更改密码并导致不必要的额外编码。