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

您必须在表单中使用 GET 方法,而不是 POST。

mysql_num_rows 在这里没有意义。
如果您使用的是 limit,那么您已经知道 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 回答