<?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>有谁知道为什么会这样?
答案 0 :(得分:0)
此处找到了解决方案:MySQLi failing to prepare a statement
声明引用:
您可能遇到的问题是,如果上一个语句的结果/结果集仍未处理,则无法创建其他语句。 见http://docs.php.net/mysqli-stmt.close:
关闭声明并打开新声明解决了问题。对于可能遇到此问题的任何其他人来说,一个好的做法可能不是一个接一个地运行太多准备好的语句,而是为处理它自己的执行和关闭的每个语句创建一个函数。这应该可以防止潜在的结果积累。