Помощник
|
Скрипт постраничного вывода |
EnterBack
|
Сообщение
#1
|
||
|
|
||
|
|||
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 |
24.3.2010, 1:51;
Ответить: r3ntg3n
Сообщение
#3
|
|
ZhukV,ты крут, если в sql-запрос без обработки пихаешь данные, полученные из массива $_POST[]...
а если я тебе в элемент $_POST['sorted'] запихну sql-injection, как ты тогда запляшешь? скажеш, что значение элемента sorted ограничены radio button'ами? а если я тебе через ajax кину POST-запрос на твой обработчик и вставлю в sorted свой sql-запрос?... |
|
|
ZhukV |
24.3.2010, 1:56;
Ответить: ZhukV
Сообщение
#4
|
|
ZhukV,ты крут, если в sql-запрос без обработки пихаешь данные, полученные из массива $_POST[]... а если я тебе в элемент $_POST['sorted'] запихну sql-injection, как ты тогда запляшешь? скажеш, что значение элемента sorted ограничены radio button'ами? а если я тебе через ajax кину POST-запрос на твой обработчик и вставлю в sorted свой sql-запрос?... А ты попробуй......... Обломаешся..... :) Я здесь просто показал суть постраничной навигации, а проверять нужно всегда, в любом случае. Если бы здесь еще писал скрипт на проверки, то это было б в раза два три больше!!!! А вообще-то, на мой взглад, адресная строка, и все другие возможности втулить нечисть на сайт (глобальные массивы), должны бить еще проверены до подключение всех модулей и файлов, и если че, редирект на страницу взлома :). |
|
|
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 |
24.3.2010, 12:23;
Ответить: ghostik32
Сообщение
#6
|
|
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 |
24.3.2010, 14:51;
Ответить: Winlook
Сообщение
#7
|
|
дето видел что (int) неочень защищает, например (int)$_GET['id']; и в строке браузера ввести чтото вроде http://mysait.ru?id=1'UNION и т.д может ли он обезопасить от инъекции? Верно. Поэтому для определения числа лично я использую is_numeric |
|
|
Licoric |
24.3.2010, 17:42;
Ответить: Licoric
Сообщение
#8
|
|
http://vfat.ru/maks/
ну попробуйте. Самому интересно стало (если прокатит - не трите таблицы). Там выбираешь год и вылазят категории (пока в стадии разработки). Если чего - дайте знать))) |
|
|
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 |
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 раза большего |
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
Продам скрипт rtb exchange suite - система перепродажи трафика dsp/ssp в реальном времени. | 5 | buypushplatform | 4182 | Сегодня, 21:02 автор: 100ftd |
|
Скрипт поисковика видео StrongTube | 3 | 3josoft | 1575 | 14.8.2023, 14:45 автор: 3josoft |
|
Скрипт приема платежей p2p с карты на карту card2card Скрипт приема платежей p2p с карты на карту card2card |
15 | zladey1986 | 7839 | 26.3.2023, 8:54 автор: Palundra |
|
Superobmen.biz - сервис ручного ввода и вывода Приват24 (грн) <--> WM, ЯД, QIWI удобство, низкие комиссии, скидки постоянным клиентам! |
52 | Sostavitel | 38720 | 10.2.2023, 1:04 автор: Sostavitel |
|
Продам скрипт перевода постов и комментариев | 4 | Tutich | 788 | 19.1.2023, 17:23 автор: Tutich |
Текстовая версия | Сейчас: 23.4.2024, 21:13 |