magic_quotes_gpc が有効になっていない場合 (有効にすべきではありません。マジック クォートは PHP の多くの設計ミスの 1 つであり、現在は廃止されています)、ハッカー (またはおそらくボット!) がクエリを自由に変更して、あらゆる種類の問題を引き起こす可能性があります。あなたのサイトに。
この深刻な問題を修正する適切な方法は、たとえば PDO を使用して、Prepared Statementsを使用することです。あるいは、mysql_real_escape_string を使用できます。
$sql = "SELECT COUNT(*) FROM oneliners WHERE to_user='" .
mysql_real_escape_string($username_me) . "' AND `read`=0";
問題mysql_real_escape_string
は、常にそれを使用することを覚えておく必要があることですが、準備されたステートメントを使用すると、これらの問題が処理されます。また、準備されたステートメントを使用していない場合はintval
、整数入力をきれいにするために使用できます。
もう一度強調させてください。入力をサニタイズすることは非常に重要です。ユーザーからの情報は一切信用しないでください。
問題は、クエリが失敗したときに mysql_query が FALSE を返すことが原因です。クエリが失敗した場合、mysql_queryはリソースの代わりに FALSE を返します。FALSE ではなく、リソースで mysql_num_rows を呼び出すことができます。(マニュアルから: mysql_query() は成功するとリソースを返し、エラーで FALSE を返します)。
read
フィールド名は予約語であるため、エラーの原因はフィールド名です。バッククォート (`) で引用するか、名前を変更してください。
行が存在するかどうかを確認するには、COUNT(*)
またはを使用できますSELECT 1
もちろん、クエリが失敗した場合を除いて、COUNT
クエリでは常に0または1の値が返されます( に一意のインデックスがあると思います)。to_user
$sql = "SELECT COUNT(*) FROM oneliners WHERE to_user='" .
mysql_real_escape_string($username_me) . "' AND `read`=0";
クエリを使用SELECT 1
すると、行が存在する場合は 1 が返され、そうでない場合は行が返されません。
$sql = "SELECT 1 FROM oneliners WHERE to_user='" .
mysql_real_escape_string($username_me) . "' AND `read`=0 LIMIT 1";
行の数が必要な場合、または行が存在するかどうかを知る必要がある場合は、どちらを使用するかによって異なります。一意のインデックスがある場合、計算上は非常に似ているはずです。