在while循环中执行查询.. MySQli

时间:2013-05-19 00:15:17

标签: php mysql mysqli

我正在尝试使用crypt()将我当前的数据库从纯文本密码更新为哈希密码..我正在尝试这样做而无需用户更改密码(这是一种不稳定的方法)我的代码是这样的:

$Query = $Database->prepare("SELECT ID,Username,Password FROM userlist");
$Query->execute();
$Query->bind_result($ID,$Username,$Password);
   while ($Query->fetch()){
      $Hashed = $FrameWork->Hash_Password($Password);
       $Secondary_Query = $Database->prepare("UPDATE userlist SET Password=?, Salt=? WHERE ID=?");
       $Secondary_Query->bind_param('ssi', $Hashed['Password'],$Hashed['Salt'],$ID);
       $Secondary_Query->execute();
       $Secondary_Query->close();
   }
$Query->close();

我收到了错误:

  

致命错误:在非对象中调用成员函数bind_param()   第24行的C:\ inetpub \ www \ AdminChangeTextPass.php

现在。我知道我的列名称与我的数据库名称是100%匹配。我也知道我的变量设置正确。

调试

调试:

$Query = $Database->prepare("SELECT ID,Username,Password FROM userlist");
$Query->execute();
$Query->bind_result($ID,$Username,$Password);
   while ($Query->fetch()){
      echo $Password."<br>";
   }
$Query->close();
// Returns: 
//test
//test

Then: 
$Query = $Database->prepare("SELECT ID,Username,Password FROM userlist");
$Query->execute();
$Query->bind_result($ID,$Username,$Password);
   while ($Query->fetch()){
      print_r($FrameWork->Hash_Password($Password));
   }
$Query->close();

/*
Returns: 
Array ( [Salt] => ÛûÂÒs8Q-h¸Ý>c"ÿò [Password] => Ûûj1QnM/Ui/16 )

Array ( [Salt] => ÛûÂÒs8Q-h¸Ý>c"ÿò [Password] => Ûûj1QnM/Ui/16 ) 

*/

数据库架构

CREATE TABLE IF NOT EXISTS `userlist` (
  `ID` int(255) NOT NULL AUTO_INCREMENT,
  `Username` varchar(255) NOT NULL,
  `Password` varchar(255) NOT NULL,
  `Salt` text NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

--
-- Dumping data for table `userlist`
--

INSERT INTO `userlist` (`ID`, `Username`, `Password`, `Salt`) VALUES
(1, 'test', 'test', ''),
INSERT INTO `userlist` (`ID`, `Username`, `Password`, `Salt`) VALUES
(2, 'test', 'test', '');

让我的代码看起来像这样:

$Secondary_Query = $Database->prepare("UPDATE userlist SET Password=? WHERE ID=?");
$Query = $Database->prepare("SELECT ID,Username,Password FROM userlist LIMIT 1");
    var_dump($Secondary_Query);
#$Query->execute();
#$Query->bind_result($ID,$Username,$Password);
#   while ($Query->fetch()){
#       $Hashed = $FrameWork->Hash_Password($Password);
#       $Secondary_Query = $Database->prepare("UPDATE userlist SET Password=? WHERE ID=?");
#             $Secondary_Query->bind_param('ssi', $Hashed['Password'],$Hashed['Salt'],$ID);
#       $Secondary_Query->execute();
      # $Secondary_Query->close();
#   }
#$Query->close();

var_dump($Secondary_Query);返回:

object(mysqli_stmt)#3 (10) { ["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(2)
     

[ “场计数”] =&GT; int(0)[“errno”] =&gt; int(0)[“error”] =&gt; string(0)“”   [ “error_list”] =&GT; array(0){} [“sqlstate”] =&gt; string(5)“00000”   [ “ID”] =&GT; int(1)}

var_dump($Query);返回:

  

object(mysqli_stmt)#4(10){[“affected_rows”] =&gt; INT(-1)   [ “INSERT_ID”] =&GT; int(0)[“num_rows”] =&gt; int(0)[“param_count”] =&gt; INT(0)   [ “场计数”] =&GT; int(3)[“errno”] =&gt; int(0)[“error”] =&gt; string(0)“”   [ “error_list”] =&GT; array(0){} [“sqlstate”] =&gt; string(5)“00000”   [ “ID”] =&GT; int(2)}


因为我还没有提交答案..我的工作代码如下:

$Query = $Database->prepare("SELECT ID,Username,Password FROM userlist");
$Query->execute();
$Query->bind_result($ID,$Username,$Password);
$Query->store_result();
   while ($Query->fetch()){
       $Hashed = $FrameWork->Hash_Password($Password);
       $Secondary_Query = $Database->prepare("UPDATE userlist SET Password=?, Salt=? WHERE ID=?");
       $Secondary_Query->bind_param('ssi', $Hashed['Password'],$Hashed['Salt'],$ID);
       $Secondary_Query->execute();
       $Secondary_Query->close();
   }
$Query->close();

1 个答案:

答案 0 :(得分:1)

修改:启用更详细的错误报告是帮助调试问题的关键:mysqli_report(MYSQLI_REPORT_ALL)

以下答案来自here发布的另一个SO问题。

您不能同时拥有两个查询,因为默认情况下mysqli使用无缓冲的查询(对于预准备语句;与vanilla mysql_query相反)。您可以将第一个获取到数组中并循环遍历,或者告诉mysqli缓冲查询(使用$Query->store_result())。

有关详细信息,请参阅here