2

古い 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から同じクエリを使用してデータベースから行を返すことができます

どこが間違っていますか?

編集

パラメータをバインドせずにクエリを基本的なものに変更しようとしました-「SELECT * FROM table」はまだ行が返されません。したがって、それはクエリ自体ではなく、準備、実行状況の私の順序/形式の何かになります

2 番目の編集: $stmt->store_result() をコードに追加しましたが、まだ 0 行カウントが返されます。

3番目の編集:接続とユーザー設定を調査しましたが、問題ないようです。同じユーザーとパスワードを使用してコンソール経由でデータベースに接続でき、データベース名も同じです。私はこれに本当に困惑しています:(

4

3 に答える 3

4

前に一度呼び出す必要があるように見えるので、 $stmt->store_result();afterを追加します...少なくとも例ではこれを行います(http://php.net/manual/en/mysqli-stmt.store-result.phpを参照)。そして、それらは「num_rows」のドキュメントで依存関係を意味していました。$stmt->execute();$stmt->num_rows

その他のアイデア: を確認しif($stmt->num_rows==1) {ます。num_rows は 0 ですか? テーブル「アカウント」のデータベース構造がわかりません。「名前」は主キー (または少なくとも一意のインデックス) ですか? そうでない場合、一致する列が複数存在する可能性があります。これは何が間違っているのかを簡単に考えただけで、ソース コードの問題を探すのに何時間もかかることになります。問題は別の場所にありますが。

于 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 に答える