データベース内の行の一致に関する問題
P粉852114752
2023-08-25 20:51:42
<p>同じメールがデータベースにすでに存在するかどうかを確認するために行数を取得したいと考えています。いくつかのメカニズムを試しましたが成功しませんでした。データベース内でクエリを直接実行すると行数が得られますが、PDO 経由で実行すると 0 が得られます。 </p>
<p>fetchAll メソッドを使用して手動でカウントしましたが、rowCount メソッドを使用しても機能しません</p>
<pre class="brush:php;toolbar:false;">$sql = 'SELECT count(*) FROM inbox WHERE uid = ? AND from_email = ?';
$result = $link->prepare($sql);
$result->execute([$email_number,$email_f]);
$number_of_rows = $result->fetchColumn();</pre>
<p>問題は、html</p> を含むこの $email_f にあります。
<pre class="brush:php;toolbar:false;">SELECT count(*) FROM inbox WHERE uid = "6961"
かつ from_email = "abc オファー <abc@abcs.com"</pre>
<p>これは $sql から出力したクエリで、phpmyadmin のデータベースで直接実行すると正常に動作します。数値 3 が与えられていますが、実行すると 0 が得られます。 </p>
まず、クエリで行が見つからない場合は、たとえデータが正しいと断言できるとしても、 一致するものが存在しないということを意味するという事実を受け入れる必要があります えー>。クエリが行を返さない場合は、条件に一致する行が存在しないことを意味します。したがって、その理由を調べなければなりません。ただし、最初にクエリが正しいことを確認する必要があります: SQL エラーによって引き起こされる問題
まず、「結果がない」ということはクエリにエラーがあることを意味する可能性があるため、クエリが実際にエラーなしで実行されることを確認する必要があります。詳細については、
pdoおよび mysqli の回答を参照してください。 状況によって引き起こされる問題
条件を確認してください。
WHEREcol=1 ANDcol=2などの相互に排他的な条件があります。行は決して返されません。いくつかの行が返されるようになるまで条件を単純化してから、必要な結果が得られるように条件を調整してください。
しかし、問題はありません。エラーはなく、条件は正しいので、テーブル内のデータがクエリと一致すると確信できます。ただし、落とし穴がいくつかあります:データによって引き起こされる問題
まず、変数が関係している場合は、その変数が
存在し、実際に何らかの値が含まれていることを確認します。次に、値自体を確認します。入力データ (またはデータベース) には、変換された文字や印刷できない文字が含まれている可能性があります。改行や特別にエンコードされた記号、または HTML エンティティに変換される特定の文字 (
# や>
データベース、など)。したがって、
を含むクエリはテキスト
と一致しません。簡単に確認するには、rawurlencode() 関数を使用します。この関数は、すべての非ラテン文字をコードに変換し、表示できるようにします。
問題は、これは単なる推測であり、実際の問題が何であるかを誰も教えてくれないということです。なぜなら、問題は
あなたのあなたの 入力データ、そして あなただけだからです。 問題を見つけることができます。 PDO の問題をデバッグする方法 を説明する記事を書きました。
必要な特定の問題をデバッグするには
PDO と PHP の両方で完全なエラー報告が有効になっていることを確認してください。これは非常に役立ち、時折発生するタイプミスやスペルミスなどを表示できます。urlencode()- 関数は、データベースおよび入力内のすべての印刷不可能な文字と変換可能な文字を表示するのに役立ちます。
-
もう 1 つの一般的な問題は、複数のデータベースがあり、要求されたデータが含まれていない間違ったデータベースに接続する場合です。この質問は
この質問接続資格情報によって引き起こされる問題
に似ているため、同じルーチンに従い、テーブル リストではなくデータ行のみをチェックしてください。
文字セット/エンコーディングによって引き起こされる問題 これはまれな状況ですが、念のため、この
良い回答 のチェックリストに従ってください。