【发布时间】:2014-05-13 16:22:35
【问题描述】:
我正在尝试调试我准备好的语句代码,但遇到了一些问题。使用以下脚本时,我在浏览器中看到“测试一”和“测试二”回显,但没有“测试三”;我的 ->fetch() 语句似乎不起作用。没有错误。
if (empty($login_errors)) { // OK to proceed!
echo 'test one';
$pas = get_password_hash($p);
$loginQuery = $dbc->prepare("SELECT id, username, type FROM user WHERE (email=? AND pass=?)");
$loginQuery->bind_param('ss',$e,$pas);
$loginQuery->execute();
$loginQuery->bind_result($id,$username,$type);
echo 'test two';
while($loginQuery->fetch()){
echo 'test three';
$idRow = $id;
$usernameRow = $username;
$_SESSION['user_id'] = $idRow[0];
$_SESSION['username'] = $usernameRow[0];
}
echo 'test four';
}
我的第一个想法是当只有一个字段被选择(一个绑定结果)时使用->fetch()。我尝试使用while($loginQuery->fetch_all()){,因为我有三个($loginQuery->bind_result($id,$username,$type);),但这会带来 HTTP 500 错误。这种想法正确吗? fetch() 一个,fetch_all() 多个?
为什么两个 fetch 都不起作用?你能看出我的代码有什么问题吗?
显示“测试四”。这表明查询没有返回任何数据。这很令人困惑,因为在这个准备好的语句之前,我使用了连接并且下面的工作没有任何问题:
$q = "SELECT id, username, type, IF(date_expires >= NOW(), true, false) FROM user WHERE (email='$e' AND pass='" . get_password_hash($p) . "')";
$r = mysqli_query ($dbc, $q);
【问题讨论】:
-
您的语法看起来正确。为什么不在循环之后添加
echo 'test four';,这将表明您的查询没有返回任何结果?如果您没有看到额外的测试,那么这意味着您的脚本正在悄然死亡,您需要打开/打开error_reporting。此外,您应该至少检查prepare()和execute()的返回值,它们都可能在不停止脚本执行的情况下失败。 -
谢谢。显示“测试四”,并建议没有来自 SQL 查询的结果。这很令人困惑,因为我最初的未准备好的声明(如下)运行良好。我已经修改了问题以包括更新的工作。
标签: php prepared-statement fetch