2011-09-11 24 views
-1

可以说我有一个准备好的声明。它准备的查询无关紧要。我拿到上面的结果(我不能显示实际的代码,因为它是我不想炫耀的东西,请专注于问题,而不是示例没有意义),我得到在关闭另一个之前可以执行MySQLi准备好的语句吗?

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

<?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

[参考 - 此错误在PHP中意味着什么?](http://stackoverflow.com/q/12769982/367456) – hakre

+0

[mysqli bind \ _param()致命错误](http:// stackoverflow .com/questions/6582512/mysqli-bind-param-fatal-error) – Jocelyn

回答

0

从您收到的错误看来,您的语句准备失败。 mysqli::prepare返回一个MySQLi_STMT对象或false失败。

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

+0

只有在$ stmt-> close()之前它才会失败。问题是我没有看到一种方法来做另一个准备好的陈述,而另一个是开放的。 table2Info对象内的bind_param()尝试使用已打开的语句,而不是对象内的语句。 –