【问题标题】:Execute query inside a while loop.. MySQli在while循环中执行查询.. MySQli
【发布时间】:2013-05-13 20:59:04
【问题描述】:

我正在尝试使用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() C:\inetpub\www\AdminChangeTextPass.php 第 24 行

现在。我知道我的列名和我的数据库名 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)

["field_count"]=> int(0) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> 数组(0) { } ["sqlstate"]=> 字符串(5) "00000" ["id"]=> int(1) }

var_dump($Query); 返回:

object(mysqli_stmt)#4 (10) { ["affected_rows"]=> int(-1) ["insert_id"]=> int(0) ["num_rows"]=> int(0) ["param_count"]=> int(0) ["field_count"]=> int(3) ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> 数组(0) { } ["sqlstate"]=> 字符串(5) "00000" ["id"]=> 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();

【问题讨论】:

  • 你调试错了。问题是$Secondary_Query 似乎不是一个对象。 print_r($Secondary_Query);$Secondary_Query = $Database-&gt;prepare("UPDATE userlist SET Password=?, Salt=? WHERE ID=?"); 之后返回什么?
  • 另外,用户应该有不同的ID值。
  • @rtcherry Print_r($Secondary_Query);返回空白.. Var_dump($Secondary_Query); 返回:bool(false)
  • @rtcherry 已更改。由于未导出插入,我手动编写了插入查询
  • @rtcherry 有什么想法..?

标签: php mysql mysqli


【解决方案1】:

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

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

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

详情请见here

【讨论】:

  • 这帮助我找到了解决问题的方法。我不知道 mysqli_report 函数。将此添加到我的脚本后,我看到了一条可搜索的错误消息。因此找到解决方案。这包含在我的问题中。
  • 我遇到了类似的问题,我试图在 while 语句的另一个查询中运行一个查询。在第一个 $query-&gt;execute(); 之后添加 $query-&gt;store-result(); 通过允许它通过存储第一个结果来运行第二个查询来修复它。至少这是我认为正在发生的事情,也许有人可以验证这一点?
猜你喜欢
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
相关资源
最近更新 更多