2

我一直在用 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->store_result() 添加到代码中,但仍返回 0 行数。

第三次编辑:我调查了看起来不错的连接和用户设置。我可以通过控制台使用相同的用户和密码连接到数据库,并且数据库名称相同。我真的很难过:(

4

3 回答 3

4

Add a $stmt->store_result(); after $stmt->execute();, as it seem's it must be called once before $stmt->num_rows... At least they do this in the examples (see http://php.net/manual/en/mysqli-stmt.store-result.php). And they meantion a dependency in the documentation of "num_rows".

Other ideas: You check for if($stmt->num_rows==1) {, are you sure num_rows is 0? I don't know your database structure for the table "accounts". Is "name" the primary key (or at least a unique index)? If not, there could be multiple columns that match. That's just a quick idea what could be wrong, and cause you looking hours for the problem in your source code. While the problem is somewhere else.

于 2012-08-15T23:06:16.543 回答
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->bind_result(); 然后 $stmt->fetch(); 此外,您应该在查询中放置所有列名的列表而不是“*”,这定义了字段顺序...

于 2012-08-16T00:07:33.167 回答
0

我让它工作了,我最终需要 $stmt->store_result();

但我也注意到我在 ? 周围添加了单引号。在导致问题的准备语句中。

在将它们取出并离开 store_result 方法后,它就可以工作了!

于 2012-08-16T00:06:09.653 回答