X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Скрипт постраничного вывода
EnterBack
EnterBack
Topic Starter сообщение 24.3.2010, 0:00; Ответить: EnterBack
Сообщение #1


В общем есть скрипт постраничного вывода, в нем нужно сделать
не просто вывод страниц а вывод такого типа
"1 2 3 4 5 6...287" где 287 - последняя страница
"1...234 235 236 237" где 1 - первая страница
"1...54 55 56 57 58 59...287" где 1 - первая страница, 287 - последняя страница

Как это сделать не знаю

[php]
<?
//////////////////////////////////////////////////////////////////////////////////////////////// начало mysql
/* Соединяемся с базой данных */
include "config/config.php";

/* Создаем соединение */
mysql_connect($hostname, $username, $mysqlpassword) or die ("Не могу создать соединение");

// Будем выводить по 2 записи на листе:
$number = 32;
// Читаем сдвиг из GET-массива:
$offset = isset($_GET['offset']) ? (int)$_GET['offset'] : 0;
// Коннект до базы данных
include "config/config.php";
if (!$link) die('Не могу соединиться с базой данных');
// Выбираем базу данных
mysql_select_db($dbName, $link);
mysql_query("SET NAMES cp1251");
// Выполняем запрос 'посчитать число записей'
$result = mysql_query("SELECT COUNT(*) FROM `prikoli`", $link);
// Теперь в переменной $total общее число записей
$total = mysql_result($result, 0);
$menu = getMenuofPages($total, $number, $offset);


function getMenuofPages($total, $number, $offset) {
// Подфункция определяет есть ли уже в текущем url get-данные
// и дописывает соответственно нужный offset:
function getGoodUrl($url, $cur) {
if ($_SERVER['QUERY_STRING'] == "") {
return $url."?offset=".$cur;
}else {
if (substr_count($_SERVER['QUERY_STRING'], "offset=") > 0) {
$url = preg_replace("/offset=\d+/i", "offset=".$cur, $url);
return $url;
}else {
return $url."&offset=".$cur;
}
}
}
// Если общее число меньше числа записей, которые мы должны вывести на
// странице, то ничего не делаем:
if ($total <= $number) {
return;
}
$url = $_SERVER['REQUEST_URI'];
$int = intval($total / $number); // Целая часть от деления
$rest = $total % $number; // Остаток от деления
$menu = "";
// Сначала перебираем целые части
for ($i = 0; $i < $int; $i++) {
$cur = $i * $number;
if ($cur == $offset) { // Проверка на текущую страницу
$menu .= "<span>".($cur / $number)."</span>";
}else {
$menu .= "<a href=\"".getGoodUrl($url, $cur)."\">".
($cur / $number)."</a>";
}
}
// Потом остаток (если есть)
if ($rest > 0) {
$cur += $number;
if ($cur == $offset) { // Проверка на текущую страницу
if ($rest == 1) {
$menu .= "<span>".($cur / $number)."</span>";
}else {
$menu .= "<span>".($cur / $number)."</span>";
}
}else {
if ($rest == 1) {
$menu .= "<a href=\"".getGoodUrl($url, $cur)."\">".($cur / $number)."</a>";
}else {
$menu .= "<a href=\"".getGoodUrl($url, $cur)."\">".
($cur / $number)."</a>";
}
}
}else {
$menu .= "";
}
return $menu;
}



if ($sorti == "3") {
$result = mysql_query("SELECT * FROM `prikoli` WHERE `chaloba` ='0' LIMIT $offset, $number", $link);

} else {


if ($sorti == "2") {

$result = mysql_query("SELECT * FROM `prikoli` ORDER BY sigrano DESC LIMIT $offset, $number", $link);
} else {

$result = mysql_query("SELECT * FROM `prikoli` ORDER BY id DESC LIMIT $offset, $number", $link);
}
}

// Читаем из базы $number записей начиная с $offset:

// Распечатываем результат:

if ($menu == "") {} else {
print "<h1><center>Прикольные картинки, приколы</center></h1><br>";
print "<Center><span class=R>$menu</span></center><br>";}

$x="";
while ($row = mysql_fetch_array($result)) {

$t++;
$x++;
$N++;
if ($t =="1") {print "<table border=0 CELLPADDING=5>";}

$rfail=$row['fail'];
$id=$row['id'];
$rtext=$row['text'];
$altopisanie=$row['text'];
if ($rtext == "") {$rtext = "<br><br>";} else {$rtext = "$rtext<br>";}


print "<td ALIGN=center valign=top><a href=prikolprosmotr.php?img=$id&offset=$offset$sortmodul><img border=0px width=150px height=112px src=prikoly/small$rfail alt='Приколы, прикольные картинки. $altopisanie' title='Приколы, прикольные картинки $altopisanie' align=center hspace=0 vspace=0><br>$rtext</a></td> ";


if ($t=="4") {print "</tr>"; $t="0";}

if ($N=="17") {
print "<center><br>";
include "config/reklama.php";
print "
<br><br>";
}

if ($x=="4") {$x="";}
}

print "</table>";

if ($menu == "") {} else {print "<br><Center><span class=R>$menu</span></center>";print "<br><br><center>"; include "config/googlepodmenu.html"; print "</center>";}

?>
[/php]
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
сообщение 24.3.2010, 1:30; Ответить: ZhukV
Сообщение #2


Я вот так лажу по форуму, и частенько бываю в шоке от таких скриптов!!! Зачем столько перекручивать?

ElectriK, я ж те давал толковый скрипт, даже с поиском по базе, чем он плох. А просто лень разобратся!!!

Так вот, немного раскажу об этой ПОСТРАНИЧНОЙ НАВИГАЦИИ!!!!

Для начала нам нужно вытаскатьтолько те зписи из базы, которые определенны в адресной строке.
Пусть в адресной строке будет две переменных:
$page -- какая именно страница
$view_case (у тя это $offset) -- количество выводимых записей.

Для начала нужно сложыть один запрос, без там всяких лимитов, сортировок, прочего:
[PHP]
$sql="SELECT * FROM table";
[/PHP]
Ну а теперь приступим к интересному. У тя делается сортировка. Так зачем еще й так портить кодик? Вот мы и сортировку вынесем в отделбную переменную:
[PHP]
$sorted=" ORDER BY ".$_POST['sorted']." DESC";
[/PHP]
Здесь мы сразу вытасккали вместе с сортировкой. (В форме просто укажиш верное название радиобатона)
Ну что ж а теперь нужно сделать сам ЛИМИТ:
Для начала нужно узнать, с какой записи будем начинать выводить:
[PHP]
$start=$page*$view_case-$view_case;
[/PHP]
Думаю что в этом сложного нет.
А вот теперь и сложим сам код для запроса:[PHP]
$limit=" LIMIT $start,$view_case";
[/PHP]
А теперь нужно сгрупировать весь запрос:
[PHP]
$sql_query=$sql.$sorted.$limit;
[/PHP]
После этого мы получим строку типа:
[PHP]
$sql="SELECT * FROM table ORDER BY data DESC LIMIT 15,15";
[/PHP]
Где сортировка, страница и количество выводимых записей берется из адресной строки.
Осталось их вывести. Это уж сами се думайте как их выводить. Но вот тем, кто не очень знает:
[PHP]
$ires=mysql_query($sql_query);
while($ires_result=mysql_fetch_array($ires)){
echo $ires_result['text']."<br>\r\n";
}
[/PHP]
Ну что ж, а сейчас самое интересное!!!
Как верно вывести нумерацию страниц.
Для начала нужно проверить, надо ли выставлять нумерацию (бывают случае, когда выводится менше записей, чем указано в выводе на странице)
Сначала, мы сложили один из запросов на базу, без сортировок, без лимита, который сейчас на будет в яблочко:
Узнаем количество строк:
[PHP]
$count_comm=mysql_num_rows(mysql_query($sql));
[/PHP]
Ну и теперь, чтоб вывод страниц был по одинаковым критериям, нам нужно вытащить всю адресную строку, чтб потом создать ссылку, НО НЕ ВЫТАСКИВАТЬ НОМЕР СТРАНИЦЫ
Это можно сделать вот так:
[PHP]
if($_GET)$ssulka="http://freeboard.km.ua/?page=view&type=poisk";
for($i=0;$i<count($_GET);$i++){
$t=each($_GET);
if($t['key']!=="page"){$ssulka.="&".$t[key]."=".$t['value'];}
}
[/PHP]
Ну вот, в перемнной $ssulka будет все из массива $_GET, кроме элемента с индексом "page".

Ну а теперь сам вывод:
Проверим количество стриниц:
[PHP]
$count_page=ceil($count_comm);//ПЕРЕМЕННАЯ $count_comm, МОЖЕТ ИМЕТЬ ДРОБНУЮ ЧАСТЬ, ТО МЫ ЕЕ ОКРУГЛИМ К БОЛЬШЕМУ
[/PHP]
Проверим, нужно ли нам показывать самую первую страницу
[PHP]
if($_GET['page']>3 && $count_page>5){$text_list="[<a href='$ssulka'>1</a>] .....";}
[/PHP]
А теперь просчитаем, с какой нумерации начинать:
[PHP]
if($_GET['page']>3 && $count_page>5){
$st_page=$_GET['page']-2;//ТОЕСТЬ НА ДВЕ СТРАНИЦЫ НАЗАД ОТ ТЕКУЩЕЙ
}
else{
$st_page=1;//значит с первой
}
if($count_page>5)$count_pc=5;else $count_pc=$count_page;//ЕСЛИ СТРАНИЦ МЕНЬШЕ ЧЕМ 5, ТО НУЖНО УСТАНОВИТЬ ФИКСИРОВАНИЫЙ ЦЫКЛ
[/PHP]
нУ И НАКОНЕЦ САМ ВЫВОД:
[PHP]
for($i=$st_page;$i<$st_page+$count_pc;$i++){
if($i==$_GET['page']){//если это текущая страница, то лучше не делать ее ссылкой
echo' [ <span style="color:red;text-decoration:none"><b>'.$i.'</b></span> ]';
}
else{
echo '[<a href="'..$ssulka.'&page='.$i.'">'.$i.'</a>]';
}
}
[/PHP]
И в самом конце, посмотрим, нужно ли выдавать последнюю страницу:
[PHP]
if($_GET['page']<$count_page-3 && $count_page>5)echo '.....[<a href="'.$ssulka.'&page='.$count_page.'">'.$count_page.'</a>';
[/PHP]
Ну и вроде ВСЕ. Пример работы даного скрипта есть здесь

ElectriK, и накручивать здесь сильно не нужно. Нужно просто верно понять суть вывода.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
r3ntg3n
r3ntg3n
сообщение 24.3.2010, 1:51; Ответить: r3ntg3n
Сообщение #3


ZhukV,ты крут, если в sql-запрос без обработки пихаешь данные, полученные из массива $_POST[]...

а если я тебе в элемент $_POST['sorted'] запихну sql-injection, как ты тогда запляшешь? скажеш, что значение элемента sorted ограничены radio button'ами? а если я тебе через ajax кину POST-запрос на твой обработчик и вставлю в sorted свой sql-запрос?...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
сообщение 24.3.2010, 1:56; Ответить: ZhukV
Сообщение #4


(r3ntg3n @ 24.3.2010, 03:51) *
ZhukV,ты крут, если в sql-запрос без обработки пихаешь данные, полученные из массива $_POST[]...

а если я тебе в элемент $_POST['sorted'] запихну sql-injection, как ты тогда запляшешь? скажеш, что значение элемента sorted ограничены radio button'ами? а если я тебе через ajax кину POST-запрос на твой обработчик и вставлю в sorted свой sql-запрос?...

А ты попробуй......... Обломаешся..... :)
Я здесь просто показал суть постраничной навигации, а проверять нужно всегда, в любом случае. Если бы здесь еще писал скрипт на проверки, то это было б в раза два три больше!!!!
А вообще-то, на мой взглад, адресная строка, и все другие возможности втулить нечисть на сайт (глобальные массивы), должны бить еще проверены до подключение всех модулей и файлов, и если че, редирект на страницу взлома :).
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Licoric
Licoric
сообщение 24.3.2010, 2:31; Ответить: Licoric
Сообщение #5


http://www.html.by/showthread.php?t=3641&page=2
Мой вариант. 32 и 33 сообщение. Кода немного. Там оформление в основном. А если подумать - чистая математика.
Можешь в принципе его скопировать изменив:
- Запрос на количество строк всего (другие таблицы)
- подставить в своем запросе к лимиту $x
index.php заменить на свою страницу, если она отличная от индекса.
Вроде как все. Все работает как надо (у меня, по крайней мере).
- // переменная из ссылки
$page=$_GET['page'];

заменить на
// переменная из ссылки
$page=(int)$_GET['page'];
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ghostik32
ghostik32
сообщение 24.3.2010, 12:23; Ответить: ghostik32
Сообщение #6


(Licoric @ 24.3.2010, 04:31) *
http://www.html.by/showthread.php?t=3641&page=2
Мой вариант. 32 и 33 сообщение. Кода немного. Там оформление в основном. А если подумать - чистая математика.
Можешь в принципе его скопировать изменив:
- Запрос на количество строк всего (другие таблицы)
- подставить в своем запросе к лимиту $x
index.php заменить на свою страницу, если она отличная от индекса.
Вроде как все. Все работает как надо (у меня, по крайней мере).
- // переменная из ссылки
$page=$_GET['page'];

заменить на
// переменная из ссылки
$page=(int)$_GET['page'];


гдето видел что (int) неочень защищает, например (int)$_GET['id']; и в строке браузера ввести чтото вроде http://mysait.ru?id=1'UNION и т.д
может ли он обезопасить от инъекции?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Winlook
Winlook
сообщение 24.3.2010, 14:51; Ответить: Winlook
Сообщение #7


дето видел что (int) неочень защищает, например (int)$_GET['id']; и в строке браузера ввести чтото вроде http://mysait.ru?id=1'UNION и т.д
может ли он обезопасить от инъекции?


Верно. Поэтому для определения числа лично я использую is_numeric
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Licoric
Licoric
сообщение 24.3.2010, 17:42; Ответить: Licoric
Сообщение #8


http://vfat.ru/maks/
ну попробуйте. Самому интересно стало (если прокатит - не трите таблицы).
Там выбираешь год и вылазят категории (пока в стадии разработки). Если чего - дайте знать)))
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
сообщение 24.3.2010, 18:28; Ответить: ZhukV
Сообщение #9


Могу сказть только одно:
Много говорят, ято сейчас sql-инекции в рабочем состояние. Но увы!!! Пару лет назад, когда их только изобрели хакеры, это было самое уязвимое место на сервере, если не проверялись переданные даные. А теперь, когда земля увидила очень много "потопченых" сайтов, задумалась, и решила экранизировать все спец символы, которые идут в адресную строку!!!!
Много кто прочитав это, скажет типа, что я лунь.... Ну и пусть. Но раз так говорите, так это на себя!!!!
Можна привести такой пример:
Создаем файл пхп, такого содержания:
[PHP]
<form action="">
<textarea name="zh" cols="100" rows="20"></textarea>
<input type="submit" />
</textarea>
<br />
<br />
<?php
if($_GET['zh'])echo $_GET['zh'];
?>
[/PHP]
Если не дурак, то поймет, что оброботчик этот самый файл, который вывеоди текст, который введен в адресную строку.
Запускаем на хосте, либо на денвере и пытаемся внести какой-то код. Вот к примеру я вносил вот так:
SELECT * FROM table WHERE id='122'

В результате я увидил:
SELECT * FROM table WHERE id=\'122\'

Пробывал также вот так:
INSERT INTO table (name,email) VALUES('ZhukV','_puma_.91@mail.ru')

В результате получил:
INSERT INTO table (name,email) VALUES(\'ZhukV\',\'_puma_.91@mail.ru\')

Что ж получается? Все спец символы экранизированы!!!!! В результате чего, никогда не получится сделать какую-то операцию с базой (кроме вывода -- SELECT * FROM table) при помощи иньекции.
Если хотите, попытайтесь сами на денвере, но все же будет пустой ноль.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
r3ntg3n
r3ntg3n
сообщение 25.3.2010, 0:45; Ответить: r3ntg3n
Сообщение #10


ZhukV, во-первых, я тебе сделал замечание по поводу дыры в коде, ты начинаешь тут ерничать - обмаешься, не обломаешься. ты заведомо дал человеку дырявый код, хорошо, что он это на денвере тестит, или на локальном хосте. а если потом он это зальет на сервер работающий? если какому-то кулхацкеру просто ради интереса захочиться в инъекциях поупражнятся?

обломаюсь? а ты пробовал аяксом передать данные в пост-запросе? почитай книжечку, там как раз написано, как это делать.

говоришь, все символы заэкранированны? это так, если у тебя в php.ini magic_quotes_gpc = On. а ты не пробовал в качестве значения $_GET передать что-то вида
*/ SHOW TABLES /*
или что-либо другое? в итоге ты комментируешь первую и последнюю часть запроса (точно не помню, но по-ходу так пишется). Почитай для начала инфу о sql injection, а потом начинай фыркать своей некомпетентностью.

говоришь, если бы писал еще и проверку, было бы в 3 раза больше кода? не вешай людям макароны! давно, еще с 2007 года в инете была 100500 раз описана функция от Жилинского, которая кроме очистки данных от sql injection еще и исключала возможность xss атаки. если не знаешь что это - википедия или гугл тебе друг.

один раз функцию прописал либо в parent class для всех модулей, либо в каком-либо lib.php.
В config.php впиши код вида:
[php]
/* используется глобальный массив $_REQUEST,
* так как он содержит в себе данные переданные обеими методами
* POST и GET
*/
foreach ($_REQUEST as $key => $value) {
$_REQUEST[$key] = clean_input($value); // clean_input() - функция очистки
}[/php]и будет тебе счастье, и никакого кода в 3 раза большего
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Скрипт поисковика видео StrongTube
3 3josoft 1574 14.8.2023, 14:45
автор: 3josoft
Открытая тема (нет новых ответов) Скрипт приема платежей p2p с карты на карту card2card
Скрипт приема платежей p2p с карты на карту card2card
15 zladey1986 7832 26.3.2023, 8:54
автор: Palundra
Горячая тема (нет новых ответов) Superobmen.biz - сервис ручного ввода и вывода Приват24 (грн) <--> WM, ЯД, QIWI
удобство, низкие комиссии, скидки постоянным клиентам!
52 Sostavitel 38711 10.2.2023, 1:04
автор: Sostavitel
Открытая тема (нет новых ответов) Продам скрипт перевода постов и комментариев
4 Tutich 787 19.1.2023, 17:23
автор: Tutich
Открытая тема (нет новых ответов) Битрикс скрипт нативной установки
3 Nemo 2451 20.11.2022, 10:09
автор: Webmaster24


 



RSS Текстовая версия Сейчас: 19.4.2024, 11:29
Дизайн