0

こんにちは、私はあまりにも php と mysql に慣れていないため、ユーザーが行った検索のためにメンバー番号をカウントしたいと考えています。ただし、機能しmysql_num_rowsません。

mysql_num_rows(mysql_query("SELECT * FROM members WHERE $title LIKE '%$_POST[search]%' LIMIT $start,$member_number"));

「 mysql_num_rows (): 提供された引数は有効な MySQL 結果リソースではありません ...」と表示されます。

注: $title は、ユーザーが検索する場所を選択する選択メニューです。LIMIT は、ご存知のように :)、ページに表示されるメンバーの数です。

また$start= ($page-1)*$member_number; 、そのページの最初のエントリを設定するためにも。問題はここにあると思いますが、解決できません。:(

4

3 に答える 3

4

クエリにエラーがある可能性があります。その場合、mysql_queryはを返しfalseます。

このため、このようなコマンドをグループ化しないでください。このようにしてください:

$result = mysql_query("...");

if (!$result)
 { echo mysql_error(); die(); } // or some other error handling method
                                // like, a generic error message on a public site

$count = mysql_num_rows($result);

また、コードにはSQLインジェクションの脆弱性がいくつかあります。$search入ってくる変数をサニタイズする必要があります:

$search = mysql_real_escape_string($_POST["search"]);

... mysql_query(".... WHERE $title LIKE '%$search%'");

$start外部から来た場合は、条項$endで使用する前にそれらをサニタイズする必要もあります。数値であるため、ここでLIMITは使用できません。数字のみが含まれていることを確認するためにmysql_real_escape_string()使用します。intval()

動的な列名を使用することも、衛生の観点から困難です。ここでも適用できませんmysql_real_escape_string()。インジェクションを防ぐために、許可されている列名のリストと比較するのが理想的です。

于 2011-04-03T11:59:50.667 に答える
2

POSTではなく、フォームでGETメソッドを使用する必要があります。

mysql_num_rows はここでは意味がありません。
limit を使用している場合は、すでに number を知っています*
数値を知りたい場合は、 limit や request rows を使用せず、number 自体を選択してください。

// get your $title safe
$fields = array("name","lastname");
$key = array_search($_GET['title'],$fields));
$title = $fields[$key];

//escape your $search
$search = mysql_real_escape_string($_GET['search']);

$sql = "SELECT count(*) FROM members WHERE $title LIKE '%$search%'";
$res = mysql_query($query) or trigger_error(mysql_error()." in ".$sql); 
$row = mysql_fetch_row($res);

$members_found = $row[0]

ページに表示するのに 5 つのレコードだけが必要な場合は、再度 mysql_num_rows() は必要ありません:

// Get LIMIT params
$member_number = 5;
$start = 0;
if (isset($_GET['page'])){
  $start = abs($_GET['page']-1)*$member_number;
}
// get your $title safe
$fields = array("name","lastname");
$key = array_search($_GET['title'],$fields));
$title = $fields[$key];

//escape your $search
$search = mysql_real_escape_string($_GET['search']);

$sql = "SELECT count(*) FROM members 
          WHERE `$title` LIKE '%$search%' 
          LIMIT $start, $member_number";
$res = mysql_query($query) or trigger_error(mysql_error()." in ".$sql);
while($row = mysql_fetch_assoc($res){
  $data[] = $row;
}

これで、さらに使用するために $data の行が選択されました。

于 2011-04-03T12:33:35.600 に答える
1

この種のエラーは通常、SQLクエリにエラーがあることを示します。したがって、エラーは成功mysql_query()せず、有効なリソースを返しません。したがって、のパラメータとして使用することはできませんmysql_num_rows()

ビルドに問題がないかどうかを確認するには、SQLクエリをエコーする必要があります。

および/または、がmysql_query()返さfalseれた場合は、エラーメッセージを取得するために使用できmysql_error()ます:クエリのデバッグに役立ちます;-)


通常、コードは次のようになります。

$query = "select ...";  // note : don't forget about escaping your data

$result = mysql_query($query);
if (!$result) {
    trigger_error(mysql_error()." in ".$query); 
} else {
    // use the resultset
}
于 2011-04-03T11:58:35.580 に答える