Конференция "Прочее" » Помогите исправить багу в скрипте поисковика
 
  • xayam © (30.08.08 11:10) [0]
    http://xayam.900megs.com/
    проблема такая. Короче если я ввожу в поле Пользователь значение 'xayam' то все нормально - http://xayam.900megs.com/index.php?s=&pnumber=30&forum=&user=xayam . Заметьте что выводится две ветки из форума Базы. Так вот если добавить ограничение где искать 'Базы', то отобразиться одна ветка - http://xayam.900megs.com/index.php?s=&pnumber=30&forum=%D0%91%D0%B0%D0%B7%D1%8B&user=xayam
    В чем может быть проблема?

    примерно такой код

         if (isset($_GET['pnumber']) and $_GET['pnumber'] != '') $pnumber = $_GET['pnumber']; else $pnumber = 30;
         if (isset($_GET['s'])) $s = $_GET['s']; else $s = '';
         if (isset($_GET['user'])) $user = $_GET['user']; else $user = '';
         if (isset($_GET['forum'])) $forum = $_GET['forum']; else $forum = '';
         if (isset($_GET['page'])) $page = $_GET['page']; else $page = 1;
         if (isset($_GET['order'])) $order = $_GET['order']; else $order = '';

      $start = ($page - 1) * $pnumber + 1;
         if ($user == '') $myuser = 1; else $myuser = "LGN ='\".$user.\"'";
      if ($forum == '') $myforum = 1; else $myforum = "DSC = '\".$forum.\"'";
      if ($s == '') $against = 1; else $against = "match(TITLE) against('$s' IN BOOLEAN MODE)";

         $where = "where ($myuser) and ($myforum) and ($against)";
               $query = "select * from trd $where LIMIT $start, $pnumber";
      $query2= "select COUNT(ID_TRD) from trd $where";
      $tot   = mysql_query($query2);
     
              echo $query;  
              echo '<br />';
              echo $query2;
       
        if (!$tot) exit(mysql_error());
      $total = mysql_result($tot, 0);
      $number = (int)($total/$pnumber);
        if ((float)($total/$pnumber) - $number != 0) $number++;
        if ($total > 1)
        {  
               echo '<div>Найдено:  '.($total - 1);
      if ($forum != '') echo ' на форуме '."'$forum'";
      echo '</div><div>Страницы:  ';
      //
      for ($i = 1; $i <= $number; $i++)
      {
                 if ( fmod($i, 10) == 0.0 ) echo '<br />';
        if ($i != $number)
        {
          if ($page == $i) echo "[".(($i - 1)*$pnumber + 1)."-".$i*$pnumber."] ";
       else echo '<a href=\"index.php?page='.$i."&s=".urlencode($s)."&pnumber=".$pnumber."&forum=".url encode($forum)."&user=".urlencode($user).'\">['.(($i - 1)*$pnumber + 1)."-".$i*$pnumber."]</a> ";
        }
    else
        {
          if ($page == $i) echo "[".(($i - 1)*$pnumber + 1)."-".($total - 1)."] ";
       else echo '<a href=\"index.php?page='.$i."&s=".urlencode($s)."&pnumber=".$pnumber."&forum=".url encode($forum)."&user=".urlencode($user).'\">['.(($i - 1)*$pnumber + 1)."-".($total - 1)."]</a> ";
        }

      }
    ?>
    </div>
    <hr />

    <?php

     // echo $count.'<br/>';

         $result = mysql_query($query);
      //echo $query;
        $i = $start;
        echo '<table width=\"100%\" border=\"0\"><tr><th align=\"center\" width=\"5%\">Номер</th><th align=\"center\" width=\"*\">Вопрос</th><th align=\"center\" width=\"5%\">Ответов</th><th align=\"center\" width=\"15%\">Ник</th><th align=\"center\" width=\"5%\">Форум</th><th align=\"center\" width=\"20%\">Дата</th></tr>';
        if (!$result) exit(mysql_error());
        if (mysql_num_rows($result) > 0)
        while ($row = mysql_fetch_assoc($result))
        {
        echo '<tr><td width=\"5%\" align=\"center\">'.$i.'.</td>'.
                          '<td width=\"*\"><a target=\"_blank\" href=\"html/html'.$row["FOLDER"].'/'.substr($row["FILENAME"], 0, strlen($row["FILENAME"]) - 3).'html\">'.$row["TITLE"].'</a></td>'.
                          '<td width=\"5%\" align=\"center\"><font size=\"-2\">'.$row["CNT"].'</font></td>'.
                          '<td width=\"15%\" align=\"center\">'.$row["LGN"].'</td>'.
                          '<td width=\"5%\" align=\"center\">'.$row["DSC"].'</td>'.
                          '<td width=\"20%\" align=\"center\"><font class=\"date\">'.$row["DT"].'</font></td>'.
                       '</tr>';  
          $i++;
        }

        echo '</table>';
       
    ?>

    <hr />
    <div>Страницы:  
    <?php
     
      for ($i = 1; $i <= $number; $i++)
      {
                 if ( fmod($i, 10) == 0.0 ) echo '<br />';
        if ($i != $number)
        {
          if ($page == $i) echo "[".(($i - 1)*$pnumber + 1)."-".$i*$pnumber."] ";
       else echo '<a href=\"index.php?page='.$i."&s=".urlencode($s)."&pnumber=".$pnumber."&forum=".url encode($forum)."&user=".urlencode($user).'\">['.(($i - 1)*$pnumber + 1)."-".$i*$pnumber."]</a> ";
        }
    else
        {
          if ($page == $i) echo "[".(($i - 1)*$pnumber + 1)."-".($total - 1)."] ";
       else echo '<a href=\"index.php?page='.$i."&s=".urlencode($s)."&pnumber=".$pnumber."&forum=".url encode($forum)."&user=".urlencode($user).'\">['.(($i - 1)*$pnumber + 1)."-".($total - 1)."]</a> ";
        }

      }
      echo '</div>';
      } else
     if (isset($_GET['s'])) echo '<div align=\"center\"><font color=\"red\">Ничего не найдено!</font></div>';
    ?>

  • McSimm © (30.08.08 11:21) [1]
    Почему по DSC поиск ?
    Может менялся.
  • McSimm © (30.08.08 11:26) [2]
    BTW,

    В MySQL можно использовать
    SELECT SQL_CALC_FOUND_ROWS `field1`... FROM ... WHERE ... LIMIT ...

    Тогда чтобы получить количество записей не ограниченной LIMIT, можно сделать
    SELECT FOUND_ROWS()
  • McSimm © (30.08.08 11:30) [3]
    по скрипту трудно сказать что не так.

    Получите SQL для второго случая и уже с этим SQL, без PHP, разбирайтесь - сколько выдает записей и почему
  • sniknik © (30.08.08 11:32) [4]
    со скриптом не помогу, не спец... но вопрос имеется - а уверен что в первом поиске все показано? может дело не в доп параметре, а в том, что оно просто последнюю запись не показывает (итерация в цикле гдето завершается раньше, т.к. неправильно конец диапазона определен, на один меньше. это вообще частая ошибка независимо от языка...)
    получается на 2х записях видно, а на больше ну не 67, а 66 кто внимание на одну обратит.
  • sniknik © (30.08.08 11:35) [5]
    > сколько выдает записей
    выдает скорее всего все, имхо, формирует не все, имхо. просто в запросе условием такую ошибку на избирательную не выдачу чегото сделать гораздо сложнее чем неправильно сформировать страницу по выданному.
  • xayam © (30.08.08 11:42) [6]

    > сколько выдает записей

    во втором запросе выдает одну запись, отдельно через sql manager проверил

    > почему

    вот это мне непонятно, похоже на глюк mysql
  • sniknik © (30.08.08 11:55) [7]
    запрос по начинающим тоже на 1 меньше выдает, а вот с основной, обе... не может быть такой избирательности в одном и том же условии запроса.
    вариантов 2 либо данные по которым отбор отличаются (в одном случае например вбито "Базы" в другом "Базы ") либо ты неверно формируешь.
    вывел бы где для теста общее количество полученного, гадать бы не прищлось.
  • sniknik © (30.08.08 12:00) [8]
    > а вот с основной обе
    "чудо" с основной можно обьяснить тем что в первом запросе их тоже 3, и последняя была и тут именно последней 67й... и тоже "откинутой".
  • sniknik © (30.08.08 12:09) [9]
    логично получается...
    58 записей из прочего (с хаям)
    4 из начинающих
    3 из основных
    2 из базы
    ищем все получаем - 58 + 4 + 3 + 2 = 67 (-1 из основной) = 66
    ишем прочее получаем - 57 из 58ми
    начинающих получаем - 3 из 4х
    основных получаем - 2 из 3х (не видна таже что из первого запроса)
    базы получаем - 1 из 2х.

    все сходится, ты теряешь запись...  всегда. где ты это делаешь хз. но не в запросе точно.
  • xayam © (30.08.08 12:15) [10]

    > sniknik ©   (30.08.08 11:55) [7]
    > вывел бы где для теста общее количество полученного, гадать
    > бы не прищлось.

    а там выводит сверху слева - найдено столько то
  • xayam © (30.08.08 12:31) [11]

    > все сходится, ты теряешь запись...  всегда. где ты это делаешь
    > хз. но не в запросе точно

    да по ходу ты прав, запрос
    select COUNT(ID_TRD) from trd where (LGN ='xayam') and (DSC = 'Основная') and (1)

    возвращает 3, а не 2 (( значит ошибка в скрипте есть
  • xayam © (30.08.08 12:41) [12]
    спасибо по ходу нашел ошибку (точнее ошибки), сейчас подправлю и закачаю
  • xayam © (30.08.08 12:54) [13]
    все народ наконец то я доделал это DMSearch пользуйтесь в свое удовольствие, сорри что на бесплатном хостинге (с рекламой), но по-другому вряд ли возможно. Долго я этот DMS пытался закачать на бесплатный хостинг, по ходу дела пришлось решить несколько ограничений такого хостинга, во-первых, нет поддержки xml xsl, во-вторых, в одной папке не может быть больше 2000 файлов, сейчас все эти ограничения преодолены, баги, которые я нашел исправлены. Удачи.
    P.S. Администрации сайта. Можно ли эту ссылку http://xayam.900megs.com указать возле поисковой строки для поиска по старым веткам?
  • Anatoly Podgoretsky © (30.08.08 13:13) [14]
    > xayam  (30.08.2008 12:31:11)  [11]

    Зачем and (1)?
  • KilkennyCat © (30.08.08 13:14) [15]

    > xayam ©   (30.08.08 12:54) [13]

    сервер не найден.
    А что не купишь дешевый нормальный хостинг? это всего сотня рубликов в месяц
  • xayam © (30.08.08 13:17) [16]

    > Anatoly Podgoretsky ©   (30.08.08 13:13) [14]
    > Зачем and (1)?

    да это чтоб лишних проверок не делать

    > KilkennyCat ©   (30.08.08 13:14) [15]
    > сервер не найден.
    > А что не купишь дешевый нормальный хостинг? это всего сотня
    > рубликов в месяц

    а у меня работает

    в общем не до платного хостинга, это же надо его поддерживать постоянно, каждый раз деньги платить, эта суета мне нафиг не нужна
  • KilkennyCat © (30.08.08 13:17) [17]
    "взлетит" - найдена всего одна ветка!?
  • KilkennyCat © (30.08.08 13:18) [18]

    > xayam ©   (30.08.08 13:17) [16]

    ну, ежели нормально искать будет :) я те могу предоставить на своем место.
  • xayam © (30.08.08 13:20) [19]

    > KilkennyCat ©   (30.08.08 13:17) [17]
    > "взлетит" - найдена всего одна ветка!?

    ну это немного не в тему запрос, форум то дельфийский, например 'свойство' выводит 177 веток
 
Конференция "Прочее" » Помогите исправить багу в скрипте поисковика
Есть новые Нет новых   [134448   +4][b:0.001][p:0.005]