Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Два в одном, постраничная навигация и поиск отладить код
 
 автор: dedev   (29.01.2007 в 13:05)   письмо автору
 
 

Это единственный вариант который у меня заработал, думаю ошибок в коде более чем достаточно, но его работа меня более меня устраивает, главное что он работает в отличии от всех предыдущих моих попыток.

Я хотел бы попросить специалистов помочь оптимизировать код т.е. убрать без чего в коде можно обойтись, и если есть дыры в безопасности по возможности их закрыть.

Надеюсь, Вы мне поможете

<form action="" method="GET">
<input type="text" name="zpr" size="50">
<input type="submit" value="&nbsp;&nbsp;поиск&nbsp;&nbsp;" name="goo"><br>
<input type="radio" name="radio" checked value="or">ИЛИ 
<input type="radio" name="radio" value="and">И
</form>
<ul class="ul">
<?php
// Получаем данные из формы
$rad = @$_GET["radio"];
$zapros = @$_GET["zpr"];

// Удаляем символы. Проверка формы на непустой ввод. Удаляет пробелы. Разбиваем строку на слова. Формируем запросы
$zapros = preg_replace("|[^a-zа-яё0-9 ]+|i", "", $zapros);
if(
strlen($zapros)<3)
 { 
echo(
"Введено недостаточное количество символов</ul>");
exit(include 
"../inc/footer.htm"); 
  }
  
$zapros = trim($zapros);
  
$words = preg_split("|[\s]+|",$zapros); 
  foreach(
$words as $wrd) 
  { 
    
$tmp[] = "title LIKE '%$wrd%'"; 
  } 
  if(!empty(
$tmp)) 
  { 
    
$query = "SELECT * FROM metadata WHERE ".implode(" $rad ", $tmp);
}
  
// Открыть базу данных 
  
$db = sqlite_open("sity.sdb");

// Определяем общее количество записей в таблице
$posts = sqlite_query($db, $query); 
$num_rows = sqlite_num_rows($posts); 
$num = 20; 
@
$page = $_GET['page']; 
//print("<br>".$page."<br>"); 
//print($num_rows); 
$total=$num_rows/$num; 
$total=ceil($total); 
//print($total); 
// Если значение $page меньше единицы или отрицательно 
// переходим на первую страницу 
// А если слишком большое, то переходим на последнюю 
if(empty($page) or $page < 0) $page = 1; 
  if(
$page > $total) $page = $total; 
  
$start = $page * $num - $num; 
  
$posts = sqlite_query($db, "$query ORDER BY id DESC LIMIT $start, $num");

print(
"<CENTER>по вашему запросу <font color='red'>".$zpr."</font><br> найдено страниц 
<font size='-1'>"
.$num_rows."</font></CENTER><br>");

if (
sqlite_num_rows($posts) == 0) 
{ 
   echo 
"Поиск не дал результатов";
   exit(include 
"../inc/footer.htm");
} 
else 
{ 
 

// Выводим сообщения
while (@$arr = sqlite_fetch_array($posts))
{ 
    echo(
"<li><a href=\"../".$arr['page'].".htm\">".$arr['title']."</a> ...</li>"); 
  } 
    } 
echo 
"</ul>";

//Теперь надо организовать навигацию. Формируем составляющие будущей навигации. 
//Коды стрелки «в начало» и «назад» поместим в одну переменную, также поступим и со стрелками «в конец» и «вперед». 
// Проверяем нужны ли стрелки назад 
if ($page != 1) $pervpage = "<a href=".$_SERVER['PHP_SELF']."?
zpr="
.$zpr."&radio=".$radio."&page=1>к началу</a> |
<a href="
.$_SERVER['PHP_SELF']."?zpr=".$zpr."&radio=".$radio."&page=". ($page - 1) .">предыдущая</a> "; 
// Проверяем нужны ли стрелки вперед 
if ($page != $total) $nextpage = " <a href=".$_SERVER['PHP_SELF']."?
zpr="
.$zpr."&radio=".$radio."&page=". ($page + 1) .">следующая</a> |
<a href="
.$_SERVER['PHP_SELF']."?zpr=".$zpr."&radio=".$radio."&page=" .$total. ">в конец</a>"; 
// Находим две ближайшие станицы с обоих краев, если они есть
if($page - 3 > 0) $page3left = " <a href=".$_SERVER['PHP_SELF']."?
zpr="
.$zpr."&radio=".$radio."&page=". ($page - 3) .">". ($page - 3) ."</a> | "; 
if(
$page - 2 > 0) $page2left = " <a href=".$_SERVER['PHP_SELF']."?zpr=".$zpr."&radio=".$radio."&page=". ($page - 2) .">". ($page - 2) ."</a> | "; 
if(
$page - 1 > 0) $page1left = " <a href=".$_SERVER['PHP_SELF']."?zpr=".$zpr."&radio=".$radio."&page=". ($page - 1) .">". ($page - 1) ."</a> | "; 
if(
$page + 3 <= $total) $page3right = " | <a href=".$_SERVER['PHP_SELF']."?
zpr="
.$zpr."&radio=".$radio."&page=". ($page + 3) .">". ($page + 3) ."</a>"; 
if(
$page + 2 <= $total) $page2right = " | <a href=".$_SERVER['PHP_SELF']."?
zpr="
.$zpr."&radio=".$radio."&page=". ($page + 2) .">". ($page + 2) ."</a>"; 
if(
$page + 1 <= $total) $page1right = " | <a href=".$_SERVER['PHP_SELF']."?
zpr="
.$zpr."&radio=".$radio."&page=". ($page + 1) .">". ($page + 1) ."</a>"; 
// Вывод меню 
@print("<table cellpadding='0' cellspacing='0' width='99%'><tr><td width='33%'>
<font size='-1'>"
.$pervpage."</font></td><td width='33%' align='center'><font size='-1'>".$page3left.$page2left.$page1left."<b>".$page."</b>".$page1right.$page2right.$page3right."
</font></td><td width='33%' align='right'><font size='-1'>"
.$nextpage."</font></td></tr></table>");
?>

   
 
 автор: dedev   (29.01.2007 в 16:20)   письмо автору
 
   для: dedev   (29.01.2007 в 13:05)
 

Специалисты, подскажите не все ли так плохо в коде?

   
 
 автор: cheops   (30.01.2007 в 00:44)   письмо автору
 
   для: dedev   (29.01.2007 в 13:05)
 

Лучше от греха поставить проверку
<?php
  $rad 
= @$_GET["radio"]; 
  
$zapros = @$_GET["zpr"];
  if (!
get_magic_quotes_gpc())
  {
    
$rad = mysql_escape_string($rad);
    
$zapros = mysql_escape_string($zapros);
  }
?>

Злоумышленику и без этого будет сложно провести SQL-инъекцию, но приведённая выше проверка исключит такую возможность вообще.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования