mysql_num_rows ошибка в PHP с mysql_query - PullRequest
0 голосов
/ 03 апреля 2011

Привет, я тоже новичок в 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; для установки первой записи на этой странице. Я думаю, что проблема здесь, но я не могу ее решить. (

Ответы [ 3 ]

4 голосов
/ 03 апреля 2011

Ваш запрос, вероятно, содержит ошибку, и в этом случае 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(). В идеале вы должны сравнивать список разрешенных имен столбцов, чтобы предотвратить внедрение.

2 голосов
/ 03 апреля 2011

вы должны использовать метод GET в вашей форме, а не POST.

mysql_num_rows здесь не имеет смысла.
Если вы используете лимит, вы уже знаете число *.
Если вы хотите узнать число, вы не должны использовать лимит или запрашивать строки, а должны выбирать само число.

// 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 для дальнейшего использования.

1 голос
/ 03 апреля 2011

Этот тип ошибки обычно указывает на наличие ошибки в вашем запросе 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
}
...