0

テーブル内の行を数えようとすると問題が発生します。

変数 $username_me は、セッションのユーザー名と同じです。if または else ステートメントには含まれていません。

私が得るエラーは次のとおりです。

警告: mysql_num_rows() は、パラメーター 1 がリソースであると想定し、21 行目の /home/ * /public_html/ ** /sidebar.php で指定されたブール値です。

行 21 は、貼り付けたコード ビットの最後の行です。

//Count unread oneliners
$oneliners_sql = "SELECT * FROM oneliners WHERE to_user='$username_me' AND read=0";
$oneliners_query = mysql_query($oneliners_sql);
$oneliners_num = mysql_num_rows($oneliners_query);
4

3 に答える 3

3

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";

行の数が必要な場合、または行が存在するかどうかを知る必要がある場合は、どちらを使用するかによって異なります。一意のインデックスがある場合、計算上は非常に似ているはずです。

于 2011-10-14T14:36:05.413 に答える
1

.1. readmysql の予約語であり、バックティックで引用する必要があります。

$sql = "SELECT * FROM oneliners WHERE to_user='$username_me' AND `read`=0";

.2. SELECT * を使用して行をカウントしないでください。代わりに SELECT count(*) を使用してください。

.3. エラーが発生したかどうかを確認するには、常にこの方法ですべてのクエリを実行してください。

//Count unread oneliners
$sql = "SELECT count(*) FROM oneliners WHERE to_user='$username_me' AND `read`=0";
$result = mysql_query($sql) or trigger_error(mysql_error()." ".$sql);
$row = mysql_fetch_row($result);
$oneliners_num = $row[0];

die()これらのばかげた提案にもかかわらず、この目的には決して使用しないでください。

.4. このような通常のタスクの関数を作成します。

function getOne($sql) {
  $result = mysql_query($sql) or trigger_error(mysql_error()." ".$sql);
  if ($row = mysql_fetch_row($result)) {
    return $row[0];
  }
}

したがって、1行で数値を取得できます

$oneliners_num = getOne("SELECT count(*) FROM oneliners WHERE to_user='$username_me' AND `read`=0");
于 2011-10-14T14:44:32.460 に答える
-1

mysql_querymysql の結果のfalse instread を返しました。そのため、クエリまたは接続にいくつかのエラーがあります。エラーを読むことができますmysql_error

于 2011-10-14T14:35:41.690 に答える