当语句本身运行良好时,为什么会抛出致命错误

时间:2017-03-06 07:05:44

标签: php prepared-statement

<?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”上调用boolean上的成员函数bind_param()

我已经做了什么:

1)检查SQL是否有错误:我在phpmyadmin和php(自己)中运行它,有或没有``引号,并且没有任何错误的问题语句。我也尝试将它们简化为非常简单的SELECT *语句而不使用bind,但它仍然失败。

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

3)检查了列名,数据类型和限制词:它们都签出了

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

我找到了什么:

奇怪的是,如果我删除问题STATEMENT1,问题STATEMENT2将运行没有错误,同样如果我删除问题STATEMENT2其余的代码函数正常,如果我在代码中交换他们的位置错误总是转到主要声明。< / p>

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

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

声明引用:

  

您可能遇到的问题是,如果上一个语句的结果/结果集仍未处理,则无法创建其他语句。   见http://docs.php.net/mysqli-stmt.close

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