我有一个数据库,其中包含使用代码生成密码的用户:
UPDATE users SET password = SUBSTRING(MD5(RAND()) FROM 1 FOR 8)
我使用用户电子邮件/密码创建了另一个表格以供快速参考
我现在想要加密主用户表上的密码。我尝试使用以下代码,但它不起作用。怎么了?
$query = "SELECT * FROM usersreference";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) {
$password = $row['password'];
$email = $row['email'];
$encrypted_password = md5($password);
}
$query = 'UPDATE users SET password = "' . $encrypted_password . '" WHERE email = "' . $email . '"';
$result = mysql_query($query);
if (mysql_affected_rows() == 1) {
header('Location: index.php?page=Admin');
} else {
die("there was a problem");
}
mysql_close();
答案 0 :(得分:3)
您可以使用SQL加密所有密码:
UPDATE users SET `password` = MD5(`password`)
之间,PHP代码中的SQL查询不起作用,因为password
是MySQL中的保留字,因此您需要对其进行反引号引用。
答案 1 :(得分:0)
首先:“不起作用”没有帮助。你应该确定哪些不起作用。您应该自己定义您期望看到的内容以及您在程序的每个点上实际获得的内容。然后你可以确定这两件事的分歧。
问题1:您遍历选择查询的所有用户,但只将最后一个保存到您的变量中。此外,如果您的选择不返回任何行,那么您将使用未初始化的变量执行更新。
问题2:您的表有一个名为“password”的列。这是一个带有mysql的保留关键字。您可以使用该名称,但您应该像这样引用它:
... SET `password` = ...
它可以在没有引号的情况下工作,但为什么要冒险......
除此之外,您的更新查询看起来是正确的。如果它没有更新任何东西你应该测试使用mysql命令行或像phpmyadmin这样的管理工具运行它。
答案 2 :(得分:0)
其他人已经提供了解决方案。但是你的代码似乎也错了。您只是更新最后的结果。您应该将更新查询放在while循环中:
$query = "SELECT * FROM usersreference";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) {
$password = $row['password'];
$email = $row['email'];
$encrypted_password = md5($password);
$updatequery = 'UPDATE users SET password = "' . $encrypted_password . '" WHERE email = "' . $email . '"';
$updateresult = mysql_query($updatequery);
...
}