PDA

Просмотр полной версии : Ограничение в запросе к sql


Eisenheim
16.03.2010, 22:39
Задача такова:
Мне нужно сделать деление страницы с новостями на страницы (1, 2, 3, и т.д.).
Новости выводятся из таблицы sql. Новости с hidden=1 не выводятся.
То есть мне нужно сделать так, что бы скажем на первой странице показывало первый десяток новостей с hidden=0, на второй странице показывало второй десяток с hidden=0.

Так как это сделать?

SergiK_KilleR
16.03.2010, 23:29
SELECT ..... LIMIT 10*(n-1),10;
где n от 1 до ceil(количество_новостей/10)

вот пример:

# @n - номер текущей страницы
SET @limit = 10;
SET @page_seek = @limit*(@n-1);

SELECT
*
FROM
`news_tbl`
WHERE
`hidden`='0'
ORDER BY `id` ASC LIMIT @page_seek,@limit;

Eisenheim
17.03.2010, 06:39
Ошибка выходит.. Ему не нравится fetch_array..
"Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in x:\home\**.*.*.***\www\****\pages\main.php on line 22"


<?php
$con = mysql_connect("$host","$user","$pass");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}

mysql_select_db("$db1", $con);

//$result = mysql_query("SELECT * FROM news WHERE hiden=0 ORDER BY newsid DESC LIMIT 5,2");
$result = mysql_query("
# @n - номер текущей страницы
SET @limit = 10;
SET @page_seek = @limit*(@n-1);
SELECT
*
FROM
`news`
WHERE
`hiden`='0'
ORDER BY `newsid` ASC LIMIT @page_seek,@limit;");
while($row = mysql_fetch_array($result))
{
echo "<br /><div class=\"date\"><center> ";
echo $row['date'];
echo " </center></div><div class=\"title\"><a href=\"index.php?p=news&k=".$row['newsid']."\"> ";
echo $row['title'];
echo " </a></div><br /><div class=\"spacer\">&nbsp;</div><div style=\"padding: 5px 0;\">автор: ";
echo $row['autor'];
echo " &nbsp; </div><div class=\"content\">";
echo $row['short'];
echo "</div><div class=\"spacer-bottom\"></div><br><br><br><br>";
}

mysql_close($con);
?>


Я так понял, нельзя с таким запросом делать fetch_array..
Помоги пожалуйста ^^

Eisenheim
17.03.2010, 06:48
В общем я сделал код..
$result = mysql_query("SELECT * FROM news WHERE hiden=0 ORDER BY newsid DESC LIMIT 0,3");

Где 0 - строка с которой начать, где 3 - сколько взять последующих строк..
Страница на сайте будет определятся по переменной
$n=$_GET['n'];
Как теперь сделать вывод по 10 новостей на каждей странице..

P.S. В запросе обязательно должно быть DESC LIMIT, а не ASC LIMIT.. Мне же нужно выводить не самую старую новость первой, а самую новую новость.

SergiK_KilleR
17.03.2010, 07:24
<?php
$n=(int) $_GET['n'];
$limit = 10;
$page_seek = $limit*($n-1);
$result = mysql_query("SELECT * FROM news WHERE hiden=0 ORDER BY newsid DESC LIMIT $page_seek,$limit");
?>

DESC относится не к LIMIT, а к ORDER BY

Eisenheim
17.03.2010, 13:02
Теперь ошибка такова:
Notice: Undefined index: n in x:\home\10.0.1.199\www\rock\pages\main.php on line 9

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in x:\home\10.0.1.199\www\rock\pages\main.php on line 27

Сам код:
$n=(int) $_GET['n'];
if (isset($n)) {
$limit = 10;
$page_seek = $limit*($n-1);
} else { $pageseek=1; $limit=10; }

$result = mysql_query("SELECT * FROM news WHERE hiden=0 ORDER BY newsid DESC LIMIT $page_seek,$limit");

SergiK_KilleR
17.03.2010, 14:18
Notice: Undefined index: n in x:\home\10.0.1.199\www\rock\pages\main.php on line 9
этим всё сказанно)) кто за вас будет передовать параметр $_GET['n'] ?

замените
$n=(int) $_GET['n'];
на

$n=(isset($_GET['n'])) ? (int) $_GET['n'] : 1;

Eisenheim
17.03.2010, 16:01
Ну ошибка с фетчем не решилась..
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in x:\home\10.0.1.199\www\rock\pages\main.php on line 27

Вот код:


$n=(isset($_GET['n'])) ? (int) $_GET['n'] : 0;

$limit = 10;
$page_seek = $limit*($n-1);

$result = mysql_query("SELECT * FROM news WHERE hiden=0 ORDER BY newsid DESC LIMIT $page_seek,$limit");

while($row = mysql_fetch_array($result))
{
echo "<br /><div class=\"date\"><center> ";
echo $row['date'];
echo " </center></div><div class=\"title\"><a href=\"index.php?p=news&k=".$row['newsid']."\"> ";
echo $row['title'];
echo " </a></div><br /><div class=\"spacer\">&nbsp;</div><div style=\"padding: 5px 0;\">автор: ";
echo $row['autor'];
echo " &nbsp; </div><div class=\"content\">";
echo $row['short'];
echo "</div><div class=\"spacer-bottom\"></div><br><br><br><br>";
}

LordJZ
17.03.2010, 16:07
Добавь выделенное красным$n=(isset($_GET['n'])) ? (int) $_GET['n'] : 0;

$limit = 10;
$page_seek = $limit*($n-1);

$result = mysql_query("SELECT * FROM news WHERE hiden=0 ORDER BY newsid DESC LIMIT $page_seek,$limit");

if(!$result)
exit('SQL query failed!');

while($row = mysql_fetch_array($result))
{
echo "<br /><div class=\"date\"><center> ";
echo $row['date'];
echo " </center></div><div class=\"title\"><a href=\"index.php?p=news&k=".$row['newsid']."\"> ";
echo $row['title'];
echo " </a></div><br /><div class=\"spacer\">&nbsp;</div><div style=\"padding: 5px 0;\">автор: ";
echo $row['autor'];
echo " &nbsp; </div><div class=\"content\">";
echo $row['short'];
echo "</div><div class=\"spacer-bottom\"></div><br><br><br><br>";
}

Eisenheim
17.03.2010, 16:20
Да, выдало ошибку с запросом.. Странно.. Чё не так?

Eisenheim
17.03.2010, 16:25
Вот ещё кое что:
Только что вместе с ошибкой написал
if(!$result)
echo $page_seek."<br><br>";
echo $limit;
exit('SQL query failed!');


Получилось, что
$page_seek = -10 (так не должно быть)
$limit = 10 (всё правильно)

Eisenheim
17.03.2010, 16:29
Ну так всё правильно..
Получается $n=0
И при выполнении уравнения $page_seek = $limit*($n-1);
Получается
$page_seek = 10*(0-1) = 10*(-1) = -10

SergiK_KilleR
17.03.2010, 16:35
ну наверно надо внимательней быть, иногда и в чужом коде бывают ошибки.недочёты


$n = (isset($_GET['n'])) ? (int) $_GET['n'] : 0; // тут надо 0 заменить на 1 - т.е. 1-ая страница
$limit = 10;
$page_seek = $limit*($n-1);

если $n=0,то $page_seek=-10, следовательно будет LIMIT -10,10 -> запрос возвращает null или false (точно не помню), поэтому ошибка с mysql_fetch_array()


ADD: уже сам решил проблему))

Eisenheim
17.03.2010, 16:41
SQL query failed!

И $page_seek не хочешь показывать. Всё стало норм.. $limit=10, $n=1, но $page_seek не выводит.. Его просто навсего не существует.. Как так?) Даже если ставить 2, то его не выводит

Eisenheim
17.03.2010, 17:31
А нет.. С page_seek всё в норме.. Простите меня, виноват. Но ошибка с sql запросом не решена. SQL query failed!

ADD:
Всё работает! Просто нужно было убрать
if(!$result)
exit('SQL query failed!');

=))) Всем спасибо за помощь..

P.S. Мну ещё поиск и регистрацию делать.. Думаю на долго не прощаемся ;)