Php 产生意外结果的查询(sha1)
我有一个更新用户数据的表单。它将发布到此页面:Php 产生意外结果的查询(sha1),php,mysql,Php,Mysql,我有一个更新用户数据的表单。它将发布到此页面: <?php //Update user table session_start(); include 'sql_connect_R.inc.php'; $id = mysql_real_escape_string($_POST['userID']); $password = mysql_real_escape_string($_POST['user_passwrd']); $salt = t
<?php
//Update user table
session_start();
include 'sql_connect_R.inc.php';
$id = mysql_real_escape_string($_POST['userID']);
$password = mysql_real_escape_string($_POST['user_passwrd']);
$salt = time();
$hash = sha1($password . $salt);
mysql_query("UPDATE users SET user_passwrd = '$hash', stamp = '$salt', pending = 'yes'
WHERE userID = '$id'");
mysql_close($con);
?>
当我回显$num时,它返回一个值0。
我想知道是否有办法确保$salt的值在$hash中使用时保持不变,然后在更新字段“stamp”时保持不变。
有人能帮我做这件事吗,或者给我指出正确的方向吗?提前谢谢。
干杯更多想法,因此我已将我的评论更改为答案 值得注意的是,存储时使用PHP的SHA1函数,而检索时使用mysql函数。它们应该是一样的,但这是我第一个调试这个的地方。尝试使用mysql的sha函数存储散列或基于登录检索记录,读取salt并在PHP中对其进行散列以进行比较 您如何存储时间戳?是否有可能以某种方式将其转换/取整/剪裁/视为日期字符串?只是为了进行合理性检查,在两个步骤中将输入sha1函数的字符串都取下,并检查它们是否相同
除了您的评论之外,您可以发布表中相关字段的架构吗?您的查询不正确。您需要连接字符串中的变量,而不是使用单引号。使用1键``左侧的引号。这是大多数MySQL读取查询的方式。例如:
<?php
//Update user table
session_start();
include 'sql_connect_R.inc.php';
$id = mysql_real_escape_string($_POST['userID']);
$password = mysql_real_escape_string($_POST['user_passwrd']);
$salt = time();
$hash = sha1($password . $salt);
mysql_query("UPDATE `users` SET `user_passwrd` = '".$hash."', `stamp` = '".$salt."', `pending` = 'yes' WHERE `userID` = '".$id."'");
mysql_close($con);
?>
$qry="SELECT * FROM `users` WHERE `userlogin` = '".$login."' AND `user_passwrd` = '".sha1(CONCAT($password, stamp))".'";
$result=mysql_query($qry);
$row = mysql_fetch_assoc($result);
$num = mysql_num_rows($result);
谢谢您的评论。我想报告我已经“解决”了这个问题。一天深夜,我更改了密码输入字段的名称,但忽略了更改$u POST值。当然,这并没有为$hash提供$password值。虽然我对此感到尴尬,但我认为我有必要分享我的疏忽,以举例说明检查所有可能发生错误的地方是多么重要。我没有仔细检查每件事,对问题的性质做出了错误的假设。代码运行良好,是键盘前面的螺丝松动导致了问题。Cheers检查PHP是否插入了错误的散列,或者MYSQL是否正在查找错误的散列。这会将问题空间一分为二。正在插入错误的哈希。我认为对密码进行哈希运算时$salt的值与将其插入数据库时$salt的值之间存在差异,但是我不太确定。user\u passwrd
的列定义是什么?当我在数据库中的密码字段太短时,我遇到了一个问题-由于字段长度的原因,插入时它切断了加密字符串的一部分。但是查询正在检查完全加密的密码字符串是否匹配。第二个代码中的$password是什么?user_passwrd varchar(60)No/stamp int(50)No。。。$salt的值是否可能在密码被散列的时间和它被插入“stamp”字段的时间之间有所不同?它不应该是-如果您直接调用time()
(两次),那么是的,但之后您将它存储在一个变量中,它只是一个数字。尝试在mysqlINSERT
之后输出$salt
,然后将其与已检查的DbI中存储的值进行比较,更新函数前后的值相同。现在我真的被难住了。试着用PHP和MySQL做SHA1(“Test”)
——你得到了相同的结果吗?谢谢你的评论。我想报告我已经“解决”了这个问题。一天深夜,我更改了密码输入字段的名称,但忽略了更改$u POST值。当然,这并没有为$hash提供$password值。虽然我对此感到尴尬,但我认为我有必要分享我的疏忽,以举例说明检查所有可能发生错误的地方是多么重要。我没有仔细检查每件事,对问题的性质做出了错误的假设。这不是真的。反勾号是绝对没有必要的(见鬼,我甚至建议不要使用它们),而且在使用双引号时不必连接。在过去,这样做对我很有帮助。我不完全确定为什么,但是,当我将它改为backticks并连接变量时,一切都正常了。所以,我这样做已经有一段时间了。谁说这对他没有帮助?我看你没有回答这个问题。我只是想帮忙。你当然是,但你必须知道你在做什么。我不是想揍你什么的。反勾号的目的基本上是“转义”列、表或数据库名称。这允许您在结构名称中使用特殊字符,如空格,或使用保留关键字。在这种情况下,显式连接将不起任何作用,因为它与OP的代码做完全相同的事情。查询本身是有效的,问题是数据不正确。(1) 如果我没有给出答案,很可能是因为这些问题超出了我的控制范围。我不能测试OP的代码,也不能测试他的数据。我完全依赖他做我可能要求他做的任何事情,而这不是我喜欢做的。(2) 谢谢你的评论。我想报告我已经“解决”了这个问题。一天深夜,我更改了密码输入字段的名称,但忽略了更改$u POST值。当然,这并没有为$hash提供$password值。虽然我对此感到尴尬,但我认为我有必要分享我的疏忽,以举例说明检查所有可能发生错误的地方是多么重要。我没有仔细检查每件事,对问题的性质做出了错误的假设。干杯
<?php
//Update user table
session_start();
include 'sql_connect_R.inc.php';
$id = mysql_real_escape_string($_POST['userID']);
$password = mysql_real_escape_string($_POST['user_passwrd']);
$salt = time();
$hash = sha1($password . $salt);
mysql_query("UPDATE `users` SET `user_passwrd` = '".$hash."', `stamp` = '".$salt."', `pending` = 'yes' WHERE `userID` = '".$id."'");
mysql_close($con);
?>
$qry="SELECT * FROM `users` WHERE `userlogin` = '".$login."' AND `user_passwrd` = '".sha1(CONCAT($password, stamp))".'";
$result=mysql_query($qry);
$row = mysql_fetch_assoc($result);
$num = mysql_num_rows($result);