За последние 24 часа нас посетили 16946 программистов и 1651 робот. Сейчас ищут 867 программистов ...

Поиск по сайту

Тема в разделе "PHP для новичков", создана пользователем Lestat621, 14 авг 2012.

  1. Lestat621

    Lestat621 Активный пользователь

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Привет. Делаю гибкий поиск по сайту. Код не работает, в чем косяк не пойму, уже часа 3 голову ломаю.

    Сам код.

    <table border="1" align="center" cellpadding="15" cellspacing="0">
    <tr>
    <td bgcolor="#b6b6b6" align="center">№ Записи</td>
    <td bgcolor="#b6b6b6" align="center">Тема</td>
    <td bgcolor="#b6b6b6" align="center">Текст</td>
    <td bgcolor="#b6b6b6" align="center">Дата</td>
    <td bgcolor="#b6b6b6" align="center">Удаление записи</td>
    <td bgcolor="#b6b6b6" align="center">Редактирование</td>
    </tr>
    <?php

    require_once('connect.php');

    $search_query = "SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, tema, text, id FROM blog";
    $where_list = array();
    $user_search = $_GET['usersearch'];
    $search_words = explode(' ', $user_search);
    foreach($search_words as $word)
    {
    $where_list[] = " description LIKE '%$word%' OR ";
    }
    $where_claus = implode(' OR ', $where_list);
    if(!empty($where_claus))
    {
    $search_query = " WHERE $where_claus";
    }

    $result = mysql_query($search_query);

    while ($row = mysql_fetch_array($result))
    {
    echo '<tr>';
    echo '<td>' . $row['id'] . '</td>';
    echo '<td>' . $row['tema'] . '</td>';
    echo '<td>' . $row['text'] . '</td>';
    echo '<td>' . $row['date'] . '</td>';
    echo '<td>' . 'Удалить' . '</td>';
    echo '<td>' . 'Редактировать' . '</td>';
    echo '</tr>';
    }
    echo '</table>';

    Ошибку выдает такую:
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\blog\admin\connect\search.php on line 33

    Добавлено спустя 5 минут 2 секунды:
    Только не
    $where_list[] = " description LIKE '%$word%' OR ";
    а,
    $where_list[] = " text LIKE '%$word%' OR ";
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Замени на
    Код (Text):
    1. $where_list[] = " text LIKE '%$word%' ";
    OR у тебя появится в implode. А в этой строке он лишний.
     
  3. Lestat621

    Lestat621 Активный пользователь

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Так имплудом я как раз убираю последний - лишний "OR" в запросе.

    Добавлено спустя 1 минуту 56 секунд:
    аа, ссори... Спс)))

    Добавлено спустя 1 минуту 5 секунд:
    Ток, все ровно ошибка.
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Нет. implode склеивает массив, ставя указанную строку между элементами.
    Код (PHP):
    1. <?php
    2. $arr = array('first', 'second', 'third');
    3. $str = implode(' OR ', $arr);
    4. echo($str);   // first OR second OR third
    5. ?>
    Добавлено спустя 2 минуты 57 секунд:
    замени на
    Код (PHP):
    1. $search_query .= " WHERE $where_claus"; 
     
  5. Lestat621

    Lestat621 Активный пользователь

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Блин, клево. Понял))) Благодарю
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ещё почитай тут: http://www.phpfaq.ru/slashes
    А то через этот поисковый запрос взломают сайт тебе. Нужно экранировать данные.
     
  7. Lestat621

    Lestat621 Активный пользователь

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Да, спс, я знаю, еще только начал делать функцию.

    Добавлено спустя 10 минут 55 секунд:
    А что еще может быть, ищет только латиницу, если набирать в поиске кириллицей, аналогичная ошибка.
    В БД и коде стоит utf-8, везде.
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    замени на
    Код (PHP):
    1. $result = mysql_query($search_query) or exit($search_query . '<br />' . mysql_error()); 
    И посмотри текст получившегося запроса и на что ругается MySQL. Попробуй скопировать запрос и выполнить его в phpMyAdmin и т.п.
     
  9. Lestat621

    Lestat621 Активный пользователь

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    В phpMyAdmin все ок

    SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, tema, text, id FROM blog WHERE text LIKE '%��%'
    Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'

    а где не так кодировка стоит?

    Добавлено спустя 10 минут 29 секунд:
    в одном из /php файлов была анси
     
  10. Lestat621

    Lestat621 Активный пользователь

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Пытаюсь доделать код.
    Отдельно все идет норм, но когда объедению функции поиска, сортировки и постраничный вывод, выдает ошибку.

    Сам код:
    Код (Text):
    1.  
    2.     /* Функция гибкого поиска */
    3.     function build_query($user_search, $sort){
    4.         $search_query = "SELECT DATE_FORMAT(date,'%d.%m.%Y') AS date, tema, text, id FROM blog";
    5.         $where_list = array();
    6.         $clean_search = str_replace(',',' ', $user_search);
    7.         $search_words = explode(' ', $clean_search);
    8.         $final_search_words = array();
    9.         if(count($search_words) > 0){
    10.             foreach($search_words as $word){
    11.                 if(!empty($word)){
    12.                     $final_search_words[] = $word;
    13.                 }
    14.             }
    15.         }
    16.         if(count($final_search_words)){
    17.             foreach($final_search_words as $word){
    18.                 $where_list[] = " text LIKE '%$word%'";
    19.                 }
    20.             }
    21.         $where_claus = implode(' OR ', $where_list);
    22.         if(!empty($where_claus))
    23.         {
    24.             $search_query .= " WHERE $where_claus";
    25.         }
    26.         switch ($sort) {
    27.         case 1:
    28.           $search_query .= " ORDER BY title";
    29.           break;
    30.         case 2:
    31.           $search_query .= " ORDER BY title DESC";
    32.           break;
    33.         default:
    34.         }
    35.         return $search_query;
    36.     }
    37.     /* Функция гибкого поиска */
    38.    
    39.     /* Функция сортировки*/
    40.       function generate_sort_links($user_search, $sort) {
    41.     $sort_links = '';
    42.     switch ($sort) {
    43.     case 1:
    44.       $sort_links .= '<a href = "' . $_SERVER['PHP_SELF'] . '?usersearch=' . $user_search . '&sort=1">
    45.       Сортировка 1</a>';
    46.       break;
    47.     case 2:
    48.       $sort_links .= '<a href = "' . $_SERVER['PHP_SELF'] . '?usersearch=' . $user_search . '&sort=1">
    49.       Сортировка 2</a>';
    50.       break;
    51.     default:
    52.       $sort_links .= '<a href = "' . $_SERVER['PHP_SELF'] . '?usersearch=' . $user_search . '&sort=1">
    53.       Сортировка 3</a>';
    54.     }
    55.     return $sort_links;
    56.   }
    57.     /* Функция сортировки*/
    58.  
    59.     /* Навигационные гиперссылки*/
    60.       function generate_page_links($user_search, $sort, $cur_page, $num_pages) {
    61.         $page_links = '';
    62.         if ($cur_page > 1) {
    63.           $page_links .= '<a href="' . $_SERVER['PHP_SELF'] . '?usersearch=' . $user_search . '&sort=' . $sort . '&page=' . ($cur_page - 1) . '"><-</a> ';
    64.         }
    65.         else {
    66.           $page_links .= '<- ';
    67.         }
    68.         for ($i = 1; $i <= $num_pages; $i++) {
    69.           if ($cur_page == $i) {
    70.             $page_links .= ' ' . $i;
    71.           }
    72.           else {
    73.             $page_links .= ' <a href="' . $_SERVER['PHP_SELF'] . '?usersearch=' . $user_search . '&sort=' . $sort . '&page=' . $i . '"> ' . $i . '</a>';
    74.           }
    75.         }
    76.         if ($cur_page < $num_pages) {
    77.           $page_links .= ' <a href="' . $_SERVER['PHP_SELF'] . '?usersearch=' . $user_search . '&sort=' . $sort . '&page=' . ($cur_page + 1) . '">-></a>';
    78.         }
    79.         else {
    80.           $page_links .= ' ->';
    81.         }
    82.  
    83.         return $page_links;
    84.       }
    85.     /* Навигационные гиперссылки*/
    86.    
    87.     // Далее отоброжение поиска вместе со всеми функциями
    88.     $user_search = $_GET['usersearch'];
    89.     $user_search = $_GET['sort'];
    90.     $cur_page = isset($_GET['page']) ? $_GET['page'] : 1;
    91.    
    92.     echo generate_sort_links($user_search, $sort);
    93.    
    94.     require_once('connect.php');
    95.    
    96.     $query = build_query($user_search, $sort);
    97.     $result = mysqli_query($query);
    98.     $total = mysqli_num_rows($result);
    99.     $num_pages = ceil($total / $results_per_page);
    100.     $query =  $query . " LIMIT $skip, $results_per_page";
    101.     $result = mysqli_query($query);
    102.    
    103.         while ($row = mysql_fetch_array($result)) {
    104.             echo '<tr>';
    105.             echo '<td>' . $row['id'] . '</td>';
    106.             echo '<td>' . $row['tema'] . '</td>';
    107.             echo '<td>' . $row['text'] . '</td>';
    108.             echo '<td>' . $row['date'] . '</td>';
    109.             echo '<td>' . 'Удалить' . '</td>';
    110.             echo '<td>' . 'Редактировать' . '</td>';
    111.             echo '</tr>';
    112.         }
    113.         echo '</table>';
    114.        
    115.     if ($num_pages > 1) {
    116.         echo generate_page_links($user_search, $sort, $cur_page, $num_pages);
    117.     }
    Добавлено спустя 2 минуты 3 секунды:
    Как я понимаю ошибка в том что многим функциям изначально нету гет запроса, но тогда как решить эту задачу?
     
  11. Lestat621

    Lestat621 Активный пользователь

    С нами с:
    6 июн 2012
    Сообщения:
    41
    Симпатии:
    0
    Проблема решена. Если кому интересно могу скинуть полный код поиска с постраничным выводом и функцией сортировки.