Php 当语句本身运行正常时,为什么会抛出致命错误
我遇到了一个致命错误:在“PROBLEM STATEMENT2”的布尔值上调用成员函数bind_param() 我已经做了什么: 1) 检查SQL是否有错误:我在phpmyadmin和php(自己)中运行了它,有``引号和没有``引号,两个问题语句都没有错误。我还尝试将它们简化为没有绑定的非常简单的SELECT*语句,但仍然失败 2) 已分配唯一变量,而不是重写$stmt:无错误更改 3) 已检查的列名、数据类型和限制字:它们都已签出 4) 有界变量的检查值:它们都存在 我的发现: 奇怪的是,如果我删除PROBLEM语句1,PROBLEM语句2将无错误地运行,类似地,如果我删除PROBLEM语句2,其余的代码函数将正常运行,如果我交换它们在代码中的位置,错误总是转到前导语句 有人知道为什么会发生这种情况吗?在这里找到了解决方案: 声明引述: 您可能会遇到这样的问题,即当上一条语句仍有结果/结果集挂起时,无法创建其他语句。 见:Php 当语句本身运行正常时,为什么会抛出致命错误,php,prepared-statement,Php,Prepared Statement,我遇到了一个致命错误:在“PROBLEM STATEMENT2”的布尔值上调用成员函数bind_param() 我已经做了什么: 1) 检查SQL是否有错误:我在phpmyadmin和php(自己)中运行了它,有``引号和没有``引号,两个问题语句都没有错误。我还尝试将它们简化为没有绑定的非常简单的SELECT*语句,但仍然失败 2) 已分配唯一变量,而不是重写$stmt:无错误更改 3) 已检查的列名、数据类型和限制字:它们都已签出 4) 有界变量的检查值:它们都存在 我的发现: 奇怪的是,如
关闭语句并打开一个新语句解决了问题。对于可能遇到此问题的任何其他人,一个好的做法可能是不要一个接一个地运行太多准备好的语句,而是为每个语句创建一个函数来处理它自己的执行和关闭。这应该可以防止潜在的结果累积。基于这里的其他线程,使用
$db->errorInfo()
和$db->errorCode()
来获取错误的原因。mysqli(在我的例子中是$connection)->errno和error在故障点分别返回0和“”
<?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();
?>