Профи прошу помощи

Статус
Закрыто для дальнейших ответов.

Salikhoff

Well-Known Member
Регистрация
04.04.2011
Сообщения
88
вот код
Код:
<?php
require_once ('main/config.php');
  if (!isset($_GET['catalog'])) {
    header('Location: /');
    exit;
  }
  else {
    $request  = trim ($_GET['catalog']);
    $request  = preg_replace ('|[^a-zA-Zа-яА-Я]|siu', '', $request);
	$section  = isset ($_GET['category']) ? trim ($_GET['category']) : '';


  if (strlen ($request)>2){
  if (isset ($_GET['category'])){
    $counter = @mysql_query("SELECT COUNT(*) FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '%$request%') OR (`url` LIKE '%$request%')) AND `category`='$category' ORDER BY `id` ASC");
  }
  else {
    $counter = @mysql_query("SELECT COUNT(*) FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '%$request%') OR (`url` LIKE '%$request%')) ORDER BY `id` ASC");
  }
    $counter = mysql_result($counter, 0);
    $total   = (($counter-1)/10)+1; 
    $total   = round($total);
	$list    = isset ($_GET['list']) ? (int)$_GET['list'] : '';
  if ($list == 0 or $list < 0)  
    $list    = 1;
  if ($list > $total) 
    $list    = $total;
    $start   = $list*10-10;
  if ($start < 0){$start = 0;}
  if (isset ($_GET['category'])) {
    $result  = @mysql_query("SELECT * FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '$request%') OR (`url` LIKE '%$request%')) AND `category`='$category' ORDER BY `id` ASC LIMIT $start, 10");
  }
  else {
    $result  = @mysql_query("SELECT * FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '$request%') OR (`url` LIKE '%$request%')) ORDER BY `id` ASC LIMIT $start, 10");
  }
  if (!$result){exit(mysql_error());}
    $n       = 1 + $start;
  if ($counter > 0) {
    function counter($counter, $reply)
    {
      $cases = array (2, 0, 1, 1, 1, 2);
      return $counter."</strong> ".$reply[ ($counter%100>4 && $counter%100<20)? 2 : $cases[min($counter%10, 5)] ];
    }
    echo ("<strong class='font'>Найдено <strong style='color:#999999'>".counter($counter, array('ответ', 'ответа', 'ответов'))." по вашему запросу.</strong>");
  while ($row = mysql_fetch_array($result)){
    echo ("<div id='block'>");
    echo ("<div class='number'>".$n."</div>");
	echo ("<div id='result'>");
	echo ("<a href=".$row['url']." target='_blank' class='title'>".$row['title']."</a>");
	echo ("<div class='content_result'>".$row['description']."</div>");
	echo ("<a href=".$row['url']." target='_blank' class='url'>".$row['url']."</a>");
	echo ("</div></div>");
	$n ++;
  }
  if ($total > 1){Error_Reporting(E_ALL & ~E_NOTICE);
  if (isset($_GET['section'])) {
  if ($list!=1) $page1="<div class=arrows>&larr;</div> <a href='search.php?category=".$_GET['category']."&list=".($list - 1)."&catalog=".$request."'>влево</a> | ";
  if ($list!=$total) $npage=" | <a href='search.php?category=".$_GET['category']."&list=".($list + 1)."&catalog=".$request."'>вправо</a> <div class=arrows>&rarr;</div>";
  if ($list-3>0) $p3l=" <a href='search.php?category=".$_GET['category']."&list=".($list - 3)."&catalog=".$request."'>".($list-3)."</a> | ";
  if ($list-2>0) $p2l=" <a href='search.php?category=".$_GET['category']."&list=".($list - 2)."&catalog=".$request."'>".($list-2)."</a> | ";
  if ($list-1>0) $p1l=" <a href='search.php?category=".$_GET['category']."&list=".($list - 1)."&catalog=".$request."'>".($list-1)."</a> | ";
  if ($list+3<=$total) $p3r=" | <a href='search.php?category=".$_GET['category']."&list=".($list + 3)."&catalog=".$request."'>".($list+3)."</a>";
  if ($list+2<=$total) $p2r=" | <a href='search.php?category=".$_GET['category']."&list=".($list + 2)."&catalog=".$request."'>".($list+2)."</a>";
  if ($list+1<=$total) $p1r=" | <a href='search.php?category=".$_GET['category']."&list=".($list + 1)."&catalog=".$request."'>".($list+1)."</a>";
  }
  else {
  if ($list!=1) $page1='<div class=arrows>&larr;</div> <a href="search.php?list='.($list - 1).'&catalog='.$request.'">влево</a> | ';
  if ($list!=$total) $npage=' | <a href="search.php?list='.($list + 1).'&catalog='.$request.'">вправо</a> <div class=arrows>&rarr;</div>';
  if ($list-3>0) $p3l=' <a href="search.php?list='.($list - 3).'&catalog='.$request.'">'.($list-3).'</a> | ';
  if ($list-2>0) $p2l=' <a href="search.php?list='.($list - 2).'&catalog='.$request.'">'.($list-2).'</a> | ';
  if ($list-1>0) $p1l=' <a href="search.php?list='.($list - 1).'&catalog='.$request.'">'.($list-1).'</a> | ';
  if ($list+3<=$total) $p3r=' | <a href="search.php?list='.($list + 1).'&catalog='.$request.'">'.($list+3).'</a>';
  if ($list+2<=$total) $p2r=' | <a href="search.php?list='.($list + 2).'&catalog='.$request.'">'.($list+2).'</a>';
  if ($list+1<=$total) $p1r=' | <a href="search.php?list='.($list + 1).'&catalog='.$request.'">'.($list+1).'</a>';
  }
    echo ("<div class='list' align='center'>");
    echo ($page1.$p3l.$p2l.$p1l.'<div class="this">'.$list.'</div>'.$p1r.$p2r.$p3r.$npage);
	echo ("</div>");
  }
} 
  else {
    echo ("<strong class='error'>К сожалению по вашему запросу, в этой категории ничего не найдено...</strong>");
  }
}    
  else {
    echo ("<strong class='error'>Задан пустой поисковый запрос или строка поиска содержит менее 3 символов...</strong>");
  }
}
?>
пожалуйста помогите его максимально почистить и отредактировать где листалка страниц не предлагать сделать циклами, т.к. я не умею, но если сделаете буду благодарен!

в общем еще откопал косяк, считает не правильно, по факту один сайт в БД а выводит 2, переменная $counter
 

minority

generator randomly php
Регистрация
02.05.2010
Сообщения
443
Пожалуйста профи сделайте мне сайт, шас только тематику придумаю... :unsure:
 

Salikhoff

Well-Known Member
Регистрация
04.04.2011
Сообщения
88
Остроумно, но здесь все работа уже выполнена, мне просто надо подсказать как улучшить!
 

Nefes

Member
Регистрация
05.04.2011
Сообщения
12
1) @ - собачки не используйте(грузят сервер), убирайте ошибки естественным путём.
2)
$request = trim ($_GET['catalog']);
$request = preg_replace ('|[^a-zA-Zа-яА-Я]|siu', '', $request);
Я как понял вы вырезаете буквы и хотите что бы использовали только цифры. Так?
Можно было использовать intval() или же проверку через is_numeric().
Так же регулярка сама г.код, Вы используете модификатор "i" - значит независимый регистр; a-zA-Zа-яА-Я -> a-zа-я
3) на счёт постраничной навигации... переписывайте заново и сначало хотя бы на листике напишите алгоритм...

$counter = @mysql_query("SELECT COUNT(*) FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '%$request%') OR (`url` LIKE '%$request%')) AND `category`='$category' ORDER BY `id` ASC");

Собачку поставили что бы погасить ошибку, но стоило бы подумать что mysql_query() не работает с COUNT(), mysql_result(mysql_query("SELECT COUNT(*) FROM...."),0)
Так же при подсчёте через COUNT() считайте не всё вместе "*" а именно по индексу (если он у Вас раставлен, если нет - выставите) например COUNT(`id`)
 

Salikhoff

Well-Known Member
Регистрация
04.04.2011
Сообщения
88
сделал! но на этом все закончилось что ли?
 

Nefes

Member
Регистрация
05.04.2011
Сообщения
12
Критиковать код можно ещё долго. Но не вижу смысла так как код ужасен. Подумайте сами и оптимизируйте, так же на SQL запросами подумайте "стоит ли так нагружать БД ?", пересмотрите навигацию а точнее вникните в сам алгоритм а после уже легко сможете более гибкий код написать.
 

Salikhoff

Well-Known Member
Регистрация
04.04.2011
Сообщения
88
ну вот переделал
Код:
if (isset ($_GET['category'])){
    $counter = mysql_query("SELECT COUNT(*) FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '%$request%') OR (`url` LIKE '%$request%')) AND `category`='$category' ORDER BY `id` ASC");
  }
  else {
    $counter = mysql_query("SELECT COUNT(*) FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '%$request%') OR (`url` LIKE '%$request%')) ORDER BY `id` ASC");
  }
    $counter = mysql_result($counter, 0);  
  if ($counter > 0) {
    $list    = intval(isset($_GET['list']) && intval($_GET['list']) > 0 ? intval($_GET['list']) : 1);
    $list    = 1;
    $start   = $list*10-10;
  if (isset ($_GET['category'])) {
    $result  = mysql_query("SELECT * FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '$request%') OR (`url` LIKE '%$request%')) AND `category`='$category' ORDER BY `id` ASC LIMIT $start, 10");
  }
  else {
    $result  = mysql_query("SELECT * FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '$request%') OR (`url` LIKE '%$request%')) ORDER BY `id` ASC LIMIT $start, 10");
  }
    $n       = 1 + $start;
    function counter($counter, $reply)
    {
      $cases = array (2, 0, 1, 1, 1, 2);
      return $counter."</strong> ".$reply[ ($counter%100>4 && $counter%100<20)? 2 : $cases[min($counter%10, 5)] ];
    }
    echo ("<strong class='font'>Найдено <strong style='color:#999999'>".counter($counter, array('ответ', 'ответа', 'ответов'))." по вашему запросу.</strong>");
  while ($row = mysql_fetch_array($result)) {
    echo ("<div id='block'>");
    echo ("<div class='number'>".$n."</div>");
	echo ("<div id='result'>");
	echo ("<a href=".$row['url']." target='_blank' class='title'>".$row['title']."</a>");
	echo ("<div class='content_result'>".$row['description']."</div>");
	echo ("<a href=".$row['url']." target='_blank' class='url'>".$row['url']."</a>");
	echo ("</div></div>");
	$n ++;
  }
    $counter = $counter/10; 
    $counter = ceil ($counter); 
    $page_s  = $list - 4; 
    $page_m  = $list + 5; 
  if ($page_m > $counter) 
    $page_m = $counter; 
    echo "<div class='list' align='center'>"; 
  if ($list >= 6) {
    echo "<a href='search.php?catalog=$request'>1</a> ";
    echo "... ";
  }
  for ($i=$page_s; $i <= $page_m; $i++) {
  if ($i > 0) {
  if ($i==$list) {
    echo "<div class='this'>$i</div> ";
  }
  else {
    echo "<a href='search.php?list=$i&catalog=$request'>$i</a> ";
  }
  }
  }
    $page_f = $counter - 6;
  if ($list <= $page_f) {
    echo "... ";
    echo "<a href='search.php?list=$counter&catalog=$request'>$counter</a>";
  }  
    echo "</div>"; 
  }  
  else {
    echo ("<strong class='error'>К сожалению по вашему запросу, в этой категории ничего не найдено...</strong>");
  }
}
Работает, но почему то считает все записи в БД а мне надо которые только соответствуют значению поискового запроса, и почему то не получается перелистнуть страницу!
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Вынеси все запросы к базе в одно место, определение логики в другое, а дизайн в третье. Вообщем прочитай про MVC иначе тут каша.
 

Salikhoff

Well-Known Member
Регистрация
04.04.2011
Сообщения
88
мне вот этот запрос надо поправить
Код:
if (isset ($_GET['category'])){
    $counter = mysql_query("SELECT COUNT(*) FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '%$request%') OR (`url` LIKE '%$request%')) AND `category`='$category' ORDER BY `id` ASC");
  }
  else {
    $counter = mysql_query("SELECT COUNT(*) FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '%$request%') OR (`url` LIKE '%$request%')) ORDER BY `id` ASC");
  }
он выводит почему то все записи, а надо только которые соответствуют по запросу, а остальное я сам доделаю!
 

Nefes

Member
Регистрация
05.04.2011
Сообщения
12
Я Вам написал выше по поводу COUNT() при mysql_query().
 

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
$request = preg_replace ('|[^a-zA-Zа-яА-Я]|siu', '', $request);
Я как понял вы вырезаете буквы и хотите что бы использовали только цифры. Так?
Можно было использовать intval() или же проверку через is_numeric().
Так же регулярка сама г.код, Вы используете модификатор "i" - значит независимый регистр; a-zA-Zа-яА-Я -> a-zа-я
Посмотрите внимательно он наоборот хочет получить чистый текст без цифр только диапазон a-zа-я
Код:
$request = trim($_GET['catalog']); //непонимаю зачем здесь функция trim если ниже пробелы удалятся.
$request = preg_replace('/[^a-zа-я]/i','',$request);

// Если уж пропускать пробелы то регулярка должна выглядеть так: [^a-zа-я\s]
Точно не помню, но модификатор u по моему нужно ставить только когда у вас используется utf8,
а файл например cp1251
 

Salikhoff

Well-Known Member
Регистрация
04.04.2011
Сообщения
88
я пробовал так и так и по вашему, но он считает все записи, а мне надо только которые подходят!

Nefes, как же вы не поймете, что разницы нету между этим
Код:
 if (isset ($_GET['category'])) 
 {
  $counter  = mysql_query("SELECT COUNT(`id`) FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '%$request%') OR (`url` LIKE '%$request%')) AND `category`='$category'");
 }
 else 
 {
  $counter  = mysql_query("SELECT COUNT(`id`) FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '%$request%') OR (`url` LIKE '%$request%'))");
 }
 
  $counter = mysql_result($counter, 0);
и этим
Код:
mysql_result(mysql_query("SELECT COUNT(*) FROM...."),0)
как вы написали, я просто потом переменную вставляю в другом месте, меня больше интересует почему считает не правильно, а то что высказали считать по иду, а не * я сделал!
 

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
Не забывайте про безопасность запросов и экранировании активных символов.
Код:
$request = mysql_real_escape_string($request);
 

Salikhoff

Well-Known Member
Регистрация
04.04.2011
Сообщения
88
да мне пока не до безопасности, мне сперва надо исправить чтобы нормально страницы работали!

ну кто поможет?
 

Nefes

Member
Регистрация
05.04.2011
Сообщения
12
$counter = $counter/10;
$counter = ceil ($counter);

Это ещё зачем ?
**********
$list = intval(isset($_GET['list']) && intval($_GET['list']) > 0 ? intval($_GET['list']) : 1);
$list = 1;

А это зачем ? Вы сами то хоть взгляните на свой код....
 

Salikhoff

Well-Known Member
Регистрация
04.04.2011
Сообщения
88
да, это пока на потом оставлю, меня больше интересует почему он записи в бд нормально не считает, всегда 12 записей выдает, т.е. все записи, а по идее соответствуют поиску только 6, выводить сами записи выводит только 6, а считать считает что их 12 из-за этого высчитывает что страниц несколько! помогите это решить!
 

Nefes

Member
Регистрация
05.04.2011
Сообщения
12
Вы обьясните словами что вы хотите вывести запросом, а мы уже подскажем кодом.
LIKE %***% выдаст любое совпадение, проверьте может и в самом деле совпадает со всеми из 12
 

Salikhoff

Well-Known Member
Регистрация
04.04.2011
Сообщения
88
мне нужно вывести сколько записей в бд соответствуют моему запросу но и чтобы не в точности запросы совпадали например в ключевых словах есть слово сайт, а я ввел в поиск сайты и чтобы мне выдало этот сайт где в ключевых словах есть слово сайт! я одного не понимаю вот запрос который считает
Код:
 if (isset ($_GET['category'])) 
 {
  $counter  = mysql_query("SELECT COUNT(`id`) FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '%$request%') OR (`url` LIKE '%$request%')) AND `category`='$category'");
 }
 else 
 {
  $counter  = mysql_query("SELECT COUNT(`id`) FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '%$request%') OR (`url` LIKE '%$request%'))");
 }
а вот который служит для вывода
Код:
 if (isset ($_GET['category']))
 {
  $result  = ("SELECT * FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '$request%') OR (`url` LIKE '%$request%')) AND `category`='$category' ORDER BY `id` ASC LIMIT $number, 10");
 }
 else 
 {
  $result  = ("SELECT * FROM `catalog` WHERE ((`keywords` LIKE '%$request%') OR (`title` LIKE '%$request%') OR (`description` LIKE '$request%') OR (`url` LIKE '%$request%')) ORDER BY `id` ASC LIMIT $number, 10");
 }
разницы то особой нет, только вот почему то считает все 12 а выводит только 6, специально взял и попробовал ввел в поиск слово амисо, он есть только в 6 записях из 12, и посчитал он правильно, но в некоторых случаях считает не правильно! Вот помогите мне с этим!

все сам сделал, теперь помогите сделать следующие если у меня есть еще допустим дополнительный гет запрос на категории как мне его добавить в страницу? щас опишу подробнее, если категории нет страница вот так
search.php?list=$i&catalog=$request
' а если есть то вот так
search.php?list=$i&category=$category&catalog=$request'
и есть какие предложения по улучшению кода?
 

Snickers

Быдлокодер
Регистрация
05.11.2010
Сообщения
388
вечером жди. после работы переработаю
 

Salikhoff

Well-Known Member
Регистрация
04.04.2011
Сообщения
88
хорошо, можно было бы еще изменять по дате или ревалентности, т.е добавил поле `counter` после каждого перехода туда пишется +1 хотел бы сделать чтобы можно было выбирать сортировать как! и еще как сделать чтобы номера страниц не показывало когда меньше 10, т.е. когда на одну страницу не хватает?
 
Статус
Закрыто для дальнейших ответов.
Верх Низ