在另一个关闭之前可以执行MySQLi预处理语句吗?

时间:2011-09-11 13:34:29

标签: mysqli prepared-statement php

假设我有一份准备好的声明。它准备的查询无关紧要。我取得上面的结果(我无法显示实际代码,因为这是我不想炫耀的。请专注于问题,而不是示例无意义)我得到了

致命错误:在...中的非对象上调用成员函数bind_param()。在被调用对象中引起的错误。

<?php
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

class table2Info{
    private $mysqli;

    public function __construct($_mysqli){
        $this->mysqli = $_mysqli;
    }

    public function getInfo($id)
    {
        $db = $this->mysqli->prepare('SELECT info FROM table2 WHERE id = ? LIMIT 1');
        $db->bind_param('i',$db_id);

        $db_id  = $id;

        $db->bind_result($info);
        $db->execute();
        $db->fetch();

        $db->close();

        return $info;
    }

}
$t2I = new table2Info($mysqli);

$stmt->prepare('SELECT id FROM table1 WHERE name = ?');
$stmt->bind_param('s',$name);

$name = $_GET['name'];

$stmt->bind_result($id);
$stmt->execute();

while($stmt->fetch())
{
    //This will cause the fatal-error
    echo $t2I->getInfo($id); 
}
$stmt->close();
?>

问题是:有没有办法做另一个准备好的陈述,而另一个仍在开放?它会简化我的代码。我不能用SQL JOIN或类似的东西解决这个问题,它必须是这样的。现在我在数组中收集获取的数据并在$stmt->close();之后循环遍历它,但这不是一个好的解决方案。当一个更好时,我为什么要做两个循环?

1 个答案:

答案 0 :(得分:0)

从您收到的错误中看来,您的陈述准备失败了。 mysqli::prepare会在失败时返回MySQLi_STMT个对象或false

检查导致错误的语句准备中的返回值。如果它是假的,您可以通过查看mysqli::error来查看更多详细信息。