mysqli prepare()返回一个布尔值true而不是一个语句对象

时间:2016-05-13 05:26:10

标签: php mysql database mysqli return

我在互联网上看过这个问题,但其他人的解决方案都没有解决我的错误。我有以下PHP代码:

  $err = false;
  $mysqli = getMysqlConnection();
  if ($stmt = $mysqli->prepare("INSERT INTO users (username, email, regtime, emailverified, type) values (?,?,?,?,?);"))
  {
      date_default_timezone_set("America/New_York");
      $dateStr = date("m-d-Y h:i:s");
      $emailverified = 0;
      $type = 0;

      $stmt->bind_param('sssii', $username, $email, $dateStr, $emailverified, $type);
      $rc = $stmt->execute();
      $err = $rc ? $err : true;

      $userId = $stmt->insert_id;    

      if ($stmt = $mysqli->prepare("INSERT INTO usercreds (user_id, username, hash) VALUES (?,?,?);") && $err === false)
      {
          //
          //right here, for some reason, $stmt is true (boolean), not an object
          //

          $stmt->bind_param('iss', $userId, $username, $hash);
          $rc = $stmt->execute();
          $err = $rc ? $err : true;
      }
      else {
        $err = true;
      }
  }

第一个查询运行没有问题,但第二个查询在对bind_params的调用中断。我收到了错误

  

致命错误:未捕获错误:在布尔值上调用成员函数bind_param()

这意味着(我已经确认)我第二次$stmt = $mysqli->prepare(),它返回一个布尔值而不是一个对象。此外,它回归真实,我觉得很奇怪。

我有四倍检查我的查询,它是完全正确和有效的。然而由于某种原因我第二次尝试准备一个语句,他的prepare方法返回一个布尔值而不是一个语句对象。

另一个注意事项,在第二个prepare()之后回显$ mysqli->错误。

如何解决此问题?

有感:

部分我感觉这是因为我连续两次使用相同的mysqli对象?或者因为我连续两次使用相同的语句对象?是否有某种"关闭"或者"重置"为了执行第二个查询需要进行其中一个对象?

另一个编辑:

我的第二个查询有效的其他证明。我复制并粘贴了它并用值替换了它们,在mysql工作台中执行它,它运行得非常好。

INSERT INTO usercreds (user_id, username, hash) VALUES (1234567890,'testusr','hashhashhash');

2 个答案:

答案 0 :(得分:1)

您要将$mysqli->prepare(..) && $err === false的结果分配给$stmt。这是一个布尔表达式。您需要以下任何一种变体:

if (($stmt = $mysqli->prepare(...)) && $err === false)
if ($err === false && $stmt = $mysqli->prepare(...))

答案 1 :(得分:1)

您的问题是由基本上错误的错误处理方式引起的。也就是说,除了产生错误之外,还会使代码膨胀。

以下是您真正需要的唯一代码:

date_default_timezone_set("America/New_York");
// below is the only line you need for the error handling
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = getMysqlConnection();

$dateStr = date("m-d-Y h:i:s");
$emailverified = 0;
$type = 0;

$stmt = $mysqli->prepare("INSERT INTO users (username, email, regtime, emailverified, type) values (?,?,?,?,?)");
$stmt->bind_param('sssii', $username, $email, $dateStr, $emailverified, $type);
$stmt->execute();
$userId = $mysqli->insert_id;

$stmt = $mysqli->prepare("INSERT INTO usercreds (user_id, username, hash) VALUES (?,?,?)");
$stmt->bind_param('iss', $userId, $username, $hash);
$stmt->execute();

其余部分取决于您在发生错误时将采取的措施。