#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
}