【问题标题】:why is a fatal error being thrown when the statements run fine on their own为什么当语句自己运行良好时会引发致命错误
【发布时间】:2017-03-06 07:05:44
【问题描述】:
<?php 
require_once 'functions.php';
try{
  $stmt=$connection->prepare("
    SELECT ACT_ID, NAME, COST, DESCRIPTION, EXTRA_DETAILS, REFID,IMAGE
    FROM ACTIVITIES
    WHERE ACT_ID = ?
  "); 
  $stmt->bind_param("i",$_GET['id']);
  $stmt->execute();
  $result=$stmt->get_result();
  $actData=getAllData($result);

  if ( isset($_SESSION["user_id"]) && $_SESSION["user_id"] != "" ){

      $stmt=$connection->prepare("
        SELECT id
        FROM google_users 
        WHERE id=? AND gender IS NOT NULL
      ");
      $stmt->bind_param("i",$_SESSION['user_id']);
      $stmt->execute();
      if ($stmt->fetch()){
        $actData[0]["HAS_USER_INFO"]=TRUE;
      }

      //PROBLEM STATEMENT1##############################
      $stmt=$connection->prepare("        
        SELECT `REG_ID` 
        FROM `ACTIVITY_REGISTRATION` 
        WHERE `USER_ID` = ? AND `ACTIVITY` =?
      ");
      $stmt->bind_param("ii",$_SESSION['user_id'],$_GET['id']);
      $stmt->execute();
      if ($stmt->fetch()) {
        $actData[0]["REGISTERED"]=TRUE;
      }  
    }

    //PROBLEM STATEMENT2#########################3
    $stmt=$connection->prepare("        
      SELECT O.`COST`, O.`DESCRIPTION`, O.`OPTION_ID` 
      FROM `ACTIVITIES` A, `ADD_OPTIONS` O 
      WHERE `ACT_REF` = `REFID` AND `ACT_REF` = ?
    ");
    $stmt->bind_param("s",$actData[0]["REFID"]);
    $stmt->execute();
    $result=$stmt->get_result();
    $opData=getAllData($result);
  }catch(Exception $e){
      echo $e->getMessage();
  }

  $stmt->close();
?>

我遇到了致命错误:在“问题状态 2”上调用布尔值的成员函数 bind_param()

我已经做了什么:

1) 检查 SQL 是否有错误:我在 phpmyadmin 和 php(单独)中运行它,带和不带 `` 引号,两个问题语句都没有错误。我还尝试将它们简化为没有绑定的非常简单的 SELECT * 语句,但它仍然失败。

2) 分配唯一变量而不是覆盖 $stmt:错误没有变化

3) 检查列名、数据类型和限制字:它们都签出

4) 有界变量的检查值:它们都存在

我发现了什么:

奇怪的是,如果我删除 PROBLEM STATEMENT1,PROBLEM STATEMENT2 将毫无错误地运行,类似地,如果我删除 PROBLEM STATEMENT2,其余代码正常运行,如果我交换它们在代码中的位置,错误总是出现在前导语句。

有人知道为什么会这样吗?

【问题讨论】:

  • 根据此处的其他线程,使用$db-&gt;errorInfo()$db-&gt;errorCode() 获取错误原因。
  • mysqli(在我的例子中是 $connection)->errno 和 error 在故障点分别返回 0 和 ""

标签: php prepared-statement


【解决方案1】:

在此处找到解决方案:MySQLi failing to prepare a statement

声明引用:

您可能遇到了无法创建其他语句的问题,而前一条语句仍有待处理的结果/结果集。 见http://docs.php.net/mysqli-stmt.close:

关闭语句并打开一个新语句解决了这个问题。对于可能遇到此问题的其他任何人,一个好的做法可能是不要一个接一个地运行太多准备好的语句,而是为每个语句创建一个函数来处理它自己的执行和关闭。这应该可以防止潜在的结果累积。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2019-08-13
    • 2019-04-12
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多