你的问题是与MySQL语法相关,而不是与哈希相关。
好会的做法是这样的:
$password = md5($password.$global_salt.$_COOKIE['LALA_ID']);
$password = mysql_real_escape_string($password);
$lala_id = mysql_real_escape_string($_COOKIE['LALA_ID']);
$query = "SELECT emails_password,emails_id FROM lala.in_emails
WHERE emails_password ='$password'
AND emails_id='$lala_id'";
$result = mysql_query($query) or trigger_error(mysql_error().$query);
if(mysql_num_rows($result)>0){echo "same pass";}
感谢斯特凡和伊姆雷L用他们的伟大的意见,使这个代码更好
附录: 人们在评论指责我使用转义的MD5 ()函数结果。
我觉得这是为未来的读者解释的好点:
如果您想到每个特定变量的数据源 - 您正在混合图层。
MD5()不做任何“消毒”。这只是一个巧合,它的结果不包含特殊字符。 但是一个人不应该想到这一点!
数据库层应该独立于上下文。它必须是完全抽象的。不管你如何验证你的数据 - MD5,只有拉丁字母,数字等 - 所有这些与数据库层无关。 DB层应该知道数据源和表单的注释。它应该只是执行正确语法的SQL的职责。有一天,验证规则可能会更改 - 对于普通密码,或者某些二进制格式可能包含空字节等。验证规则可能会更改,但数据库规则必须保持不变。
以准备好的语句为例:
您是否决定每个变量,它是否需要绑定?不,你无条件地做,无论它是什么形式。所以,引号中的数据转义应该是。
是的正确,在这里犯了一个错误..感谢 – tetris 2010-06-28 06:15:30
...但增加了'$ password'' – 2010-06-28 06:17:21
''md5'($ password)''=>'md5('$ password')',但你应该散列在PHP中的密码不在SQL中:如果出现问题,明文密码将不会在MySQL转储中。请参阅@Babiker答案。 – 2010-06-28 06:18:54