首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在语句本身运行良好时引发致命错误?

为什么在语句本身运行良好时引发致命错误?
EN

Stack Overflow用户
提问于 2017-03-06 07:05:44
回答 1查看 62关注 0票数 0
代码语言:javascript
复制
<?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();
?>

我收到了致命的错误:对布尔值上的成员函数bind_param()进行"PROBLEM STATEMENT2“调用

我已经做了什么:

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

2)分配唯一变量而不是重写$stmt:没有错误更改

3)选中的列名、数据类型和限制词:它们都签出了

4)有界变量的校验值:它们都存在。

我发现了什么:

奇怪的是,如果我删除了PROBLEM STATEMENT1,那么问题STATEMENT2就会在没有错误的情况下运行,类似地,如果我删除了PROBLEM STATEMENT2,其余的代码函数将正常运行,并且如果我交换了它们在代码中的位置,那么错误总是会出现在前面的语句中。

有人知道为什么会发生这种事吗?

EN

回答 1

Stack Overflow用户

发布于 2017-03-06 09:32:31

在这里找到了解决方案:MySQLi failing to prepare a statement

声明引述:

您可能遇到了这样的问题:您无法创建其他语句,而前面的语句仍有结果/结果集挂起。请参见http://docs.php.net/mysqli-stmt.close

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42619463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档