データベース内の行の照合で問題が発生しました。
P粉005105443
2023-07-25 10:47:08
<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 コードを含む $email_f 変数にあります。 </p>
<pre class="brush:php;toolbar:false;">SELECT count(*) FROM inbox WHERE uid = "6961"
かつ from_email = "abc オファー <abc@abcs.com>"</pre>
<p>これは $sql から出力したクエリ ステートメントです。phpMyAdmin で直接実行すると正常に動作し、3 行数が返されますが、execute メソッド経由では 0 が返されます。 </p>
まず第一に、データが正しいと断言できても、クエリで行が見つからない場合は、一致するものが存在しないことを意味するという事実を受け入れる必要があります。クエリが行を返さない場合、基準に一致する行はありません。したがって、その理由を調べる必要があります。ただし、その前に、クエリが正しいことを確認する必要があります。
SQL エラーによって引き起こされる問題
まず、クエリに実際にエラーがないことを確認する必要があります。 「クエリにエラーがあることを意味する場合があります。」詳細については、pdo および mysqli の回答を参照してください。
条件によって引き起こされる問題
条件を確認してください。 WHERE Col=1 AND Col=2 など、相互に排他的な条件がいくつかあります。行は決して返されません。いくつかの行が返されるようになるまで条件を単純化してから、必要な結果が得られるように条件を調整してください。
しかし、問題はありません。エラーはなく、条件は正しいので、クエリに一致するデータがテーブル内に存在すると断言できます。ただし、まだ落とし穴がいくつかあります:
データによって引き起こされる問題
まず、変数が関係する場合は、変数が存在し、実際に何らかの値が含まれていることを確認します。
次に、値自体を確認します。入力データ (またはデータベース) には、変換された文字や印刷できない文字が含まれている可能性があります。たとえば、改行や特別にエンコードされた記号、または < や > などの特定の文字は HTML エンティティに変換されます。その結果、<abc@abcs.com> を含むテキストをクエリしても、テキスト <abc@abcs.com> とは一致しません。 rawurlencode() 関数を使用すると、簡単なチェックを行うことができます。この関数は、すべての非ラテン文字をコードに変換し、表示できるようにします。
問題は、これは単なる推測であり、実際の問題が何であるかを誰も教えてくれないということです。これはデータベースであり、入力データであり、問題を見つけられるのはあなただけであるためです。
PDO の問題をデバッグする方法を説明する記事を書きました。特定の問題をデバッグするには、次のものが必要です:
接続資格情報によって引き起こされる問題
もう 1 つの一般的な問題は、複数のデータベースがあり、要求されたデータが含まれていない間違ったデータベースに接続する場合です。この質問は前の質問と似ているので、テーブルのリストをチェックする代わりにデータ行をチェックする点を除いて、同じ手順に従ってください。
文字セット/エンコーディングによって引き起こされる問題
これはまれなケースですが、念のため、これに従ってください 良い回答