我已经将很多旧的 MySQL 内容转换为 PHP 中的 MySQLi,但在以下代码中遇到了问题:
### FETCH INCLUDES ###
$player=$_POST['player'];
$password=md5($_POST['password']);
#### DB CONNECTION ####
if(!$mysqli=new mysqli(DBHOST,DBUSER,DBPWD,DBNAME)) {$err=$mysqli->error; print($err); }
$sql="SELECT * FROM accounts WHERE name='?' AND passkey='?'";
if($stmt=$mysqli->prepare($sql)) {
//$stmt->bind_param('ss',$player,$password);
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows==1) {
$account=$stmt->fetch_assoc();
// purely for debugging
print_r($account);
if($_SESSION['account']=$account) $account=true;
} else {
echo "Failed. Row count: ";
print($stmt->num_rows);
echo "<br />";
$query=str_replace('?','%s',$sql);
printf($query,$player,$password);
$account=false;
}
$stmt->close();
} else {
$err=$mysqli->error;
print($err);
}
我已将故障范围缩小到查询本身。我返回 0 行,没有错误,所以我想我会输出查询(我要去那里的 str_replace 东西),我可以使用该查询使用来自 PHPMyAdmin 的相同查询从数据库返回一行
我哪里出错了?
编辑
我尝试将查询更改为基本查询而不绑定(bind)参数 - “SELECT * FROM table” 仍然没有返回任何行。所以这不是查询本身,而是我的准备、执行情况的顺序/格式中的内容
第二次编辑:我已将 $stmt->store_result() 添加到代码中,但仍然返回 0 行数。
第三次编辑: 我调查了连接和用户设置,看起来不错。我可以使用相同的用户和密码通过控制台连接到数据库,并且数据库名称相同。我真的很难过这个:(
最佳答案
在$stmt->execute();
之后添加一个$stmt->store_result();
,因为看起来它必须在$之前调用一次stmt->num_rows
...至少他们在示例中这样做(参见 http://php.net/manual/en/mysqli-stmt.store-result.php )。他们的意思是“num_rows”文档中的依赖关系。
其他想法:您检查 if($stmt->num_rows==1) {
,您确定 num_rows 是 0 吗?我不知道“帐户”表的数据库结构。 “名称”是主键(或至少是唯一索引)吗?如果不是,则可能有多个列匹配。这只是一个可能出现问题的快速想法,并导致您在源代码中查找问题数小时。虽然问题出在其他地方。
关于PHP MySQLi 准备语句无法返回行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11978423/