Кнопки Next и previous

#php #mysql

#php #mysql

Вопрос:

Я знаю, что есть библиотеки и т.д., которые я мог бы использовать для сортировки, но я почти справился со своим кодом.

Немного о коде и о том, что он пытается сделать. У меня есть таблица mysql, в которой есть различные новостные статьи, сгруппированные по категориям новостей.

Мне удалось заставить кнопку forward работать. Таким образом, он ищет следующую новостную статью, которая находится в той же категории. Это работает, и код приведен ниже.

 //Gets the next story from the same story type in line. 
$query= "SELECT * FROM news WHERE storytype2 = '$storytype2' AND id > '$currentid'";
$result = mysql_query($query) or die ("Error in query: $query " . mysql_error());
$row = mysql_fetch_array($result); 
$num_results = mysql_num_rows($result);

if ($num_results > 0){ 
   echo "<td width="20%"align="right"><a href="news.php?id=".$row['id'].""><img title="Next News" src="webImg/forwardarrow.png"/></a></td></tr>";
}else{
   echo "<td width="20%"align="right"></td></tr>";
}
//End of the next button
 

Однако, когда я пытаюсь сделать то же самое для предыдущей кнопки. Все, что я когда-либо получал, — это первый идентификатор этой категории, независимо от того, где находится моя итерация. Например, если я нахожусь в новостной статье 10 и пытаюсь перейти к предыдущей, которая, скажем, имеет идентификатор 7, она автоматически покажет первую новостную статью в этой категории, скажем, id 4.

Ниже приведен код.

 //Gets the next story from the same story type in line. 
$query= "SELECT * FROM news WHERE storytype2 = '$storytype2' AND id < '$currentid'";
$result = mysql_query($query) or die ("Error in query: $query " . mysql_error());
$row = mysql_fetch_array($result); 
$num_results = mysql_num_rows($result);

if ($num_results > 0){ 
   echo "<td width="20%"align="left"><a href="news.php?id=".$row['id'].""><img title="Previous News" src="webImg/backarrow.png"/></a></td>";        
}else{
   echo "<td width="20%"align="left"></td>";
}
//End of the next button
 

Что я сделал не так?

Спасибо

Комментарии:

1. использовать $query= "SELECT * FROM news WHERE storytype2 = '$storytype2' AND id < '$currentid' order by id desc limit 1";

2. Они оба должны указывать на одну и ту же страницу. Зачем вам нужна одна страница с запросом < id и другим > id? Это так неправильно.

Ответ №1:

Ни один из ваших запросов не является правильным. Ваш «Следующий» код выбирает любую строку, идентификатор которой выше текущего, не обязательно следующую; если вы получаете следующую, это просто случайно.

Вы должны использовать ORDER BY и LIMIT для управления тем, какая строка выбрана:

Далее:

 SELECT * 
FROM news 
WHERE storytype2 = '$storytype2' AND id > '$currentid'
ORDER BY id
LIMIT 1
 

Предыдущая страница:

 SELECT * 
FROM news 
WHERE storytype2 = '$storytype2' AND id < '$currentid'
ORDER BY id DESC
LIMIT 1
 

Ответ №2:

Я не думаю, что без какой-либо дополнительной информации вы можете предположить, что первая строка ваших запросов будет идентификатором, который вы ищете. Заказ сначала по идентификатору, вероятно, решит вашу проблему; вы также можете ограничить свой запрос одной строкой, поскольку это единственная строка, на которую вы смотрите. Что-то вроде следующего, вероятно, решит вашу проблему (где x $storytype2 и y $currentid:

 SELECT * FROM news
WHERE storytype2 = x
 AND id < y
ORDER BY id DESC /* <-- THIS */
LIMIT 1
 

Используйте ORDER BY id ASC для другого случая.
Обратите внимание, что семейство PHP MySQL устарело, и его поддержка исчезнет, если еще не исчезла. Пожалуйста, загляните в PDO или MySQLi.

Также обратите внимание, что вы вставляете переменную непосредственно в код SQL, что никогда не является хорошей идеей. Я надеюсь, что у вас есть несколько хороших проверок ввода для ваших переменных.

Давайте посмотрим на способ PDO получить предыдущий идентификатор статьи:

 $dbh = new PDO(..);
// Use ? where dynamic input will come
$sql = $dbh->prepare('SELECT * FROM news
  WHERE storytype2 = ?
  AND id < ?
  ORDER BY id DESC
  LIMIT 1');

// Fill the ? safely with PDO's execute function
$sql->execute(array($storytype2, $currentid));
$result = $sql->fetch(PDO::FETCH_ASSOC);

if($result amp;amp; isset($result['id'])) {
   // Process previous ID
}