我在PHP中将很多旧的MySQL内容转换为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使用相同的查询从数据库返回一行
我哪里错了?
我尝试将查询更改为基本的查询而不绑定参数 - “SELECT * FROM table” 仍然没有返回任何行。所以这不是查询本身,它将是我的准备,执行情况的订单/格式
第二次编辑:我已将$ stmt-&gt; store_result()添加到代码中,但仍返回0行计数。
第三编辑: 我调查了连接和用户设置似乎很好。我可以使用相同的用户和密码通过控制台连接到数据库,数据库名称相同。我真的很难过:(
答案 0 :(得分:3)
在$stmt->store_result();
之后添加$stmt->execute();
,因为它似乎必须在$stmt->num_rows
之前调用一次......至少他们在示例中执行此操作(请参阅http://php.net/manual/en/mysqli-stmt.store-result.php) 。它们意味着“num_rows”文档中的依赖关系。
其他想法:你检查if($stmt->num_rows==1) {
,你确定num_rows是0吗?我不知道表“帐户”的数据库结构。 “name”是主键(或至少是唯一索引)吗?如果没有,可能有多个匹配的列。这只是一个简单的想法,可能是错误的,并导致您在源代码中查找问题的时间。虽然问题出在其他地方。
答案 1 :(得分:1)
好的,我确实检查了你的代码。首先,您应该在连接时修复错误处理。不要检查“$ mysqli”是否为真,但检查mysqli_connect_errno()是这样的:
$mysqli=new mysqli(DBHOST,DBUSER,DBPWD,DBNAME);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
在我的服务器上,您的代码使用正确的凭据(例如,需要替换DBHOST,DBUSER,DBPWD,DBNAME)。
声明$account=$stmt->fetch_assoc();
无效。 $ stmt对象中没有fetch_assoc()函数。 fetch_assoc()用于通过使用普通查询(非预处理语句)获得的mysqli :: result对象。你需要使用$ stmt-&gt; bind_result();然后$ stmt-&gt; fetch();您还应该在查询中放置所有列名称的列表而不是“*”,这定义了一个字段顺序......
答案 2 :(得分:0)
我得到了它的工作,我最终需要$ stmt-&gt; store_result();
但我也注意到我在周围添加了单引号?在准备声明中导致问题。
在拿出那些并在store_result方法中离开之后它就可以了!