PHP MySQLi准备语句无法返回行

时间:2012-08-15 22:46:44

标签: php mysqli mysql-num-rows prepare

我在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行计数。

第三编辑: 我调查了连接和用户设置似乎很好。我可以使用相同的用户和密码通过控制台连接到数据库,数据库名称相同。我真的很难过:(

3 个答案:

答案 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方法中离开之后它就可以了!