MySQLI准备语句没有正确绑定

时间:2010-05-27 21:27:27

标签: php mysqli

以下代码无效的原因是什么?

$dbconnection = db::getInstance();  //this is a singleton db class

$stmt = $dbconnection->prepare("SELECT `id` from `table` where `username`=?");
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->bind_result($uid);
$stmt->fetch();

echo $uid;

在其他地方使用相同的连接方法,它在那里工作。它工作的其他页面的唯一区别是提取了多行,而不仅仅是一行。

编辑:我没有收到任何错误消息。 echo $uid只是输出任何内容。它应该从数据库回显用户的ID(是的,来自数据库的查询正常工作,测试它)。

如果您不能立即发现问题,是否可以建议一种调试方法?

修改 尝试转换execute() and bind_result()位置,没有区别。

修改 我终于得到了错误/警告:

  

警告:mysqli_stmt :: mysqli_stmt()[mysqli-stmt.mysqli-stmt]:无法获取数据库

解决

好。我解决了我的问题。我猜你在使用单例类时不应该关闭数据库连接?我没有意识到这一点。问题是,在调用“登录”函数后,我执行了$dbconn->close();后来我抓住了同一个实例,因此数据库连接已关闭。

2 个答案:

答案 0 :(得分:0)

我尝试始终检查每个数据库调用的返回值...大多数返回至少一个成功/失败布尔值。如果返回值不符合您的预期,您可以使用mysqli->错误来发出可理解的内容。这是一个例子:

  $stmt->bind_result($uid)
     or die("Error binding result - ".$stmt->error) ;

关于这样做的最好的事情是你可以保留调试代码,如果有任何奇怪的数据库连接问题,它将有助于缩小问题。

答案 1 :(得分:0)

<强>解决

好。我解决了我的问题。我猜你在使用单例类时不应该关闭数据库连接?我没有意识到这一点。问题是,在调用“登录”功能后,我做了一个$ dbconn-&gt; close();后来我抓住了同一个实例,因此数据库连接已关闭。