1

私はこの古いmysqlクエリを持っています:

$sql = mysql_query("SELECT id FROM nf_users 
    WHERE points > 
        (SELECT points FROM nf_users WHERE id = 1) 
    AND played > 0");
$row = mysql_fetch_array($sql);

$rank = mysql_num_rows($sql)+1;

これにより、$rankの値が得られます2578。今、次のように mysqli で同じことをしようとすると:

$sql = mysqli_query($connect,"SELECT id FROM nf_users 
    WHERE points > 
        (SELECT points FROM nf_users WHERE id = 1) 
    AND played > 0");
$row = mysqli_fetch_array($sql);

$rank = mysqli_num_rows($sql)+1;

$rankだけ言う1

私は何を間違っていますか?

助けてください、事前に感謝します:-)

4

2 に答える 2

3

さて、単純なタイプミスが原因である可能性が最も高い num_rows の問題は別として、言及すべきより重要なことがあります。

行数ではなく行を選択することは非常に悪い習慣であり、アプリケーションに不必要な負荷がかかります。APIではなく、常にデータベースにカウントを依頼してください

$sql = "SELECT count(*) FROM nf_users 
        WHERE points > (SELECT points FROM nf_users WHERE id = 1) 
        AND played > 0";
$res  = mysqli_query($connect,$sql) or trigger_error(mysqli_error($connect)." [$sql]");
$row  = mysqli_fetch_row($res);
$rank = $row[0]+1;
于 2013-01-04T08:27:13.203 に答える
3

あなたのmysql_xxx()コードもあなたのコードもmysqli_xx()エラーをチェックしません。

これはあなたの根本的な間違いです。エラーや予期しないイベントを適切に処理することは、堅牢なコードを記述するための鍵の 1 つです。

この場合、何が起こっているかは明らかです。オリジナルmysql_query()は機能していますが、mysqli_query()がエラーをスローしています。エラー ハンドラーがない場合、プログラムは num 行を取得し (これはfalseエラーが原因です)、1 を追加し、最終結果は 1 になります。

これだけは明らかです。問題は「何が起きているか」ではなく、「なぜ」なのか?

確かにコードが不十分ですが、2 つのコード スニペットの明らかな違いは、$connect変数の導入です。

すでにご存知のように、mysqli関数では接続オブジェクトを渡す必要がありますが、古いmysql関数では必要ありません (渡さない場合、デフォルトで非表示のグローバル接続になります。これは設計上の欠陥の 1 つです。古いmysql拡張機能は使用するのが悪いと見なされています)。

私の推測では、 を渡していますが$connect、接続変数は実際には設定されていません。私が考えることができる最も可能性の高い原因は、接続がプログラムの別の部分で行われ、$connectこの関数に渡されていない場合です。

しかし、エラー処理を追加すると、これが明らかになります。

于 2013-01-04T09:15:50.510 に答える