Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 产生意外结果的查询(sha1)_Php_Mysql - Fatal编程技术网

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()
(两次),那么是的,但之后您将它存储在一个变量中,它只是一个数字。尝试在mysql
INSERT
之后输出
$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);