データベース行マッチングの問題の課題
P粉078945182
2023-08-13 16:46:45
<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 の回答を参照してください。
条件によって引き起こされる問題
条件を確認してください。
WHEREcol=1 ANDcol=2
など、相互に排他的な条件がいくつかあります。行は決して返されません。いくつかの行が返されるようになるまで条件を単純化してから、必要な結果が得られるように条件を調整してください。しかし、問題はありません。エラーはなく、条件は正しいので、クエリに一致するデータがテーブル内にあると断言できます。ただし、まだ落とし穴がいくつかあります:
データによって引き起こされる問題
まず、変数が関係する場合は、変数が存在し、実際に何らかの値が含まれていることを確認してください。
次に、値自体を確認します。入力データ (またはデータベース) には、変換された文字や印刷できない文字が含まれている可能性があります。たとえば、改行文字や特別にエンコードされた記号、または
<
や>
などの一部の文字は、HTML エンティティに変換されます。その結果、<abc@abcs.com>
を含むクエリは、テキスト<abc@abcs.com>
と一致しません。簡単に確認するには、rawurlencode()
関数を使用します。この関数は、すべての非ラテン文字をコードに変換し、表示できるようにします。問題は、これは単なる推測であり、実際の問題が何であるかを誰も教えてくれないということです。なぜなら、これは あなたの データベースであり、 あなたの 入力データであり、単なる だからです。あなたは問題を見つけることができます。
PDO の問題をデバッグする方法 を説明する記事を書きました。
特定の問題をデバッグするには、次のものが必要です:PDO と PHP の両方で完全なエラー報告が有効になっていることを確認してください。これは非常に便利で、時折発生するタイプミスやスペルミスなどを表示できます。-
データを注意深くチェックし、データベースに入力して相違点を見つけます。 - urlencode()
接続資格情報によって引き起こされる問題関数が役に立ちます。データベースおよび入力内の印刷不可能な文字と変換された文字をすべて表示します。
この質問 に似ているため、データ行があるテーブルのリストをチェックする代わりに、同じ手順に従ってチェックしてください。
文字セット/エンコーディングによって引き起こされる問題良い回答 のチェックリストに従ってください。