За последние 24 часа нас посетили 17259 программистов и 1599 роботов. Сейчас ищут 925 программистов ...

Поиск в базе данных

Тема в разделе "PHP для новичков", создана пользователем dfg, 17 окт 2007.

  1. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    Ребята! Нужна помощь, три дня форум читаю, много чего интересного нашел, но мои знания в этой области нечего не дали.
    Вот код, все работает, но не так как хотелось бы, он выводит значение поля из таблицы и формируется ссылка.
    Код (Text):
    1. <?php
    2. /* Соединяемся, выбираем базу данных */
    3.       $link = mysql_connect("localhost", "dbname", "pass")
    4.       or die("Could not connect : " . mysql_error());
    5.       mysql_select_db("dbname") or die("Could not select database");
    6.      
    7.       /* Выполняем SQL-запрос */
    8.      $query ="SELECT DISTINCT(name) FROM mdup_directories WHERE `name`<> 'NULL' ORDER BY ID LIMIT 40";
    9.      $result = mysql_query($query) or die("Query failed : " . mysql_error());  
    10.      /* Выводим результаты в html */
    11.      
    12.      echo "<div id=\"button\"><ul>\n";
    13.          while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
    14.         foreach ($line as $col_value) {
    15.         print "\t\t<li><a class=\"tm1\" href=\"$col_value\">$col_value</a>";
    16.         }
    17.         echo "</li>";
    18.     }
    19.     print "\t</ul></div>\n";
    20.      
    21.       /* Освобождаем память от результата */
    22.     mysql_free_result($result);
    23.  
    24.     /* Закрываем соединение */
    25.     mysql_close($link);
    26.  ?>
    Так вот вопрос.


    Нужно сделать так, чтоб этот список появлялся только по запросу пользователем ( обыкновенная форма )

    Код (Text):
    1. <form action="/search.php" name="form">
    2.     <input name="name" type='text' class="input" size="30" value="">
    3.    <input name="submit"  type='submit' class='button' value='Искать'>
    4. </form>
    При этом сам запрос должен сохраняться в поле
    Код (Text):
    1. <input name="name" type='text' class="input" size="30" value="">
    для когото это полный пустяк, но мне проблемотично решить этот вопрос

    P.S. хелпов начитался, просьба помоч, а не пинать в поиск и хэлпы.
     
  2. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    ещё раз, только внятно.
    Есть форма
    HTML:
    1. <form action="/search.php" name="form">
    2.     <input name="name" type='text' class="input" size="30" value="">
    3.    <input name="submit"  type='submit' class='button' value='Искать'>
    4. </form>
    есть запрос
    [sql]SELECT DISTINCT(name) FROM mdup_directories WHERE `name`<> 'NULL' ORDER BY ID LIMIT 40[/sql]
    есть вывод
    PHP:
    1. <?php
    2. echo "<div id=\"button\"><ul>\n";
    3.        while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
    4.         foreach ($line as $col_value) {
    5.         print "\t\t<li><a class=\"tm1\" href=\"$col_value\">$col_value</a>";
    6.         }
    7.       echo "</li>";
    8.     }
    9.    print "\t</ul></div>\n";
    10. ?>
    а сделать надо…
     
  3. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    да все иманно так, но вывод данных происходит автоматический, тоесть открываешь страницу, а там уже все есть и поиск не работает, а нужно что список формировался только по запросу через форму.
     
  4. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    PHP:
    1. <?php
    2. if(isset($_GET['name']) && !empty($_GET['name'])){
    3.     // тут запрос на основе $_GET['name']
    4. }
    5. else{
    6.     // что-нить ещё
    7. }
    8. ?>
     
  5. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. isset($_GET['name'] && !empty($_GET['name']))
    кстати вот этого будет достаточно
    PHP:
    1. !empty($_GET['name'])
    ну это я так, к слову.
     
  6. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    Да нет что-то не так, неработает

    В данном случае наверно все зависит от этой строки.
    [sql]SELECT DISTINCT(name) FROM mdup_directories WHERE `name`<> 'NULL' ORDER BY ID LIMIT 40[/sql]
     
  7. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    от неё зависит только то, что должно быть выбрано из базы. А то, при каких условиях показывать результат — от конструкции if-else
     
  8. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    вот дает такую ошибку.

    Parse error: parse error, unexpected T_BOOLEAN_AND, expecting ',' or ')'
     
  9. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    я там лишнюю скобку поставил, поправил то сообщение ещё до твоего поста, сравнивай
     
  10. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    Вот мой файл

    Код (Text):
    1. <?
    2.       $link = mysql_connect("localhost", "dbname", "pass")
    3.       or die("Could not connect : " . mysql_error());
    4.       mysql_select_db("catalog") or die("Could not select database");
    5.      
    6.       /* Выполняем SQL-запрос */
    7.      $query ="SELECT DISTINCT(name) FROM madeup_directories WHERE `name`<> 'NULL' ORDER BY ID LIMIT 40";
    8.      $result = mysql_query($query) or die("Query failed : " . mysql_error());
    9.  
    10. /* Выводим результаты в html */
    11. //начало таблицы
    12. ?>
    13.     <table class=main width=800 border=0 align=center cellpadding=0 cellspacing=0
    14.     <tr><td colspan=3 valign="top">
    15.     <table width="100%" cellpadding="0" cellspacing="2">
    16.       <tr>
    17.         <td class="search">
    18.  <form action="/search.php"  name="form" method="get">
    19.     <div align="right">
    20.         <table border="0" cellpadding="0" cellspacing="0"  class="search">
    21.         <tr class="formcolor">
    22.             <td class="lse">Поиск:</td>
    23. <td class="center_se" width="100%"><input name="name" type='text' class="input" size="30" value=""></td>
    24.             <td class="rse"><input name="submit"  type='submit' class='button' value='Искать'></td>
    25.         </tr>
    26.         </table>
    27.     </div>
    28. </form></td>
    29.       </tr></table>
    30.      
    31.     </td></tr>
    32.     <tr>
    33.         <td class=leftmenu valign=top  width=175>
    34.         <?
    35.         //left
    36.     print "<table width=100% border=0 cellpadding=0 cellspacing=0 style=\"margin-bottom:3px;\">\n";
    37.         echo "<tr>\n";
    38.         echo "<td>\n";
    39.         echo "<div id=\"button\"><ul>\n";
    40.          while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
    41.         foreach ($line as $col_value) {
    42.         print "\t\t<li><a class=\"tm1\" href=\"index.php?q=$col_value\">$col_value</a>";
    43.         }
    44.         echo "</li>";
    45.     }
    46.     print "\t</ul></div></td>\n";
    47.     print "\t</tr>\n";
    48.     print "</table>\n";
    49.     print "<td valign=top  width=434> </td>\n";
    50.                 print "<td valign=top width=175></td>\n";
    51.                 print "</tr></table></table>\n";
    52.                //конец таблицы
    53.     /* Освобождаем память от результата */
    54.     mysql_free_result($result);
    55.  
    56.     /* Закрываем соединение */
    57.     mysql_close($link);
    58.    
    59. ?>
    подскажи что писать в файле search.php ?? или добавить в этот

    p.s. я извиняюсь за километры кодов но иначе вопрос не решить!
     
  11. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    разбираться лень.
    PHP:
    1. <?php
    2. include 'db.php';
    3.  
    4. if(!empty($_GET['name']))
    5. {
    6.     $query ="SELECT DISTINCT(name) FROM madeup_directories WHERE `name`<> 'NULL' ORDER BY ID LIMIT 40";
    7.     $result = mysql_query($query) or die("Query failed : " . mysql_error());
    8.  
    9.     $str =  "<table width=100% border=0 cellpadding=0 cellspacing=0 style=\"margin-bottom:3px;\">\n";
    10.         $str .=  "<tr>\n";
    11.       $str .=  "<td>\n";
    12.       $str .=  "<div id=\"button\"><ul>\n";
    13.        while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
    14.         foreach ($line as $col_value) {
    15.         $str .=  "\t\t<li><a class=\"tm1\" href=\"index.php?q=$col_value\">$col_value</a>";
    16.         }
    17.       $str .=  "</li>";
    18.     }
    19.    $str .=  "\t</ul></div></td>\n";
    20.    $str .=  "\t</tr>\n";
    21.    $str .=  "</table>\n";
    22.    $str .=  "<td valign=top  width=434> </td>\n";
    23.                 $str .=  "<td valign=top width=175></td>\n";
    24.                 $str .=  "</tr></table></table>\n";
    25.                //конец таблицы
    26.     /* Освобождаем память от результата */
    27.     mysql_free_result($result);
    28. }
    29. else
    30. {
    31. $str = '<form name="form">
    32.     <input name="name" type="text" class="input" size="30" value="">
    33.   <input name="submit"  type="submit" class="button" value="Искать">
    34. </form>';
    35. }
    36. echo $str;
    37. ?>
    а какой смысл в форме, если от того, что в ней будет послано, запрос не изменится?
     
  12. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    Поиск по БД не работает, зделал так и все ровно не работает.

    PHP:
    1. if(isset($_GET['name']) && !empty($_GET['name']))
    2.  {
    3.      $query ="SELECT DISTINCT(name) FROM madeup_directories WHERE `name`<> 'NULL' ORDER BY ID LIMIT 40";
    4.      $result = mysql_query($query) or die("Query failed : " . mysql_error());
     
  13. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    Ребята ну ктонить поможет толковым советом, данный вариант неработает!
     
  14. marwin22

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

    С нами с:
    15 авг 2007
    Сообщения:
    21
    Симпатии:
    0
    я обычно дописываю к файлу че нить типа ?act=add
    а далее проверка условия если act==add, то делать что-то. ну и также как написано выше проверка isset
     
  15. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    Вроде как поиск сделал, но только по одному слову, если вписать словосочетание, то результат 0.

    [sql] $query ="SELECT DISTINCT(name) FROM bd_directories WHERE name like '%$q%'";[/sql]

    вот еще назрел вопрос, как передать нажатие ссылки в переменную value="" , при этом чтоб сработал поиск, а значение переданное переменной, сохранилось в строке поиска.

    Также ссылку нужно перевести из кириллицы в "%EA%E8%F0%E8%EB%EB%E8%F6%E0"
     
  16. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    Ребята как ссылку передать в форму, я так понимаю на php не передать, только средствами Javascript ?
     
  17. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    Неужели некому помочь?? или может задача сложная? или может, я неверно вопрос задаю? кто-нибудь ответьте хот что-нибудь.

    Или тему закройте, если считаете что тут больше незачем говорить, так хоть буду знать что есть кто живой на форуме.
     
  18. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    на JS document.GetElementById('id_элемента').value='значение';
    если ты про это

    надо наоборот при приёме в кириллицу преобразовывать rawurldecode()

    так может закрыть?
     
  19. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    Не, пока не надо :), спасибо щас буду пробовать
     
  20. Crypto

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

    С нами с:
    19 окт 2007
    Сообщения:
    2
    Симпатии:
    0
    Адрес:
    Уфа
    Возможно я ошибаюсь и гуру меня подправят, но мне кажется надо пересмотреть условие проверки на "ненулевое" значение.
    То есть запрос должен быть такого вида:
    $query ="SELECT DISTINCT(name) FROM madeup_directories WHERE name NOT NULL ORDER BY ID LIMIT 40";
    Проверить на машине не могу, только предполагаю.
     
  21. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    Crypto
    первый вариант работает, второй нет!
    [sql]
    $query ="SELECT DISTINCT(name) FROM madeup_directories WHERE name like '%$search%' LIMIT 40";
    $query ="SELECT DISTINCT(name) FROM madeup_directories WHERE name NOT NULL ORDER BY ID LIMIT 40";[/sql]
    тольк вот работает очень четко, если находит одну запись то её и выводит, хотелось бы чтоб немного упускал и в любом случае выводил 40 позиций!

    Luge с этим разобрался.

    а с этим никак нмогу понять как это сделать, может кто примерчик подкинет?
     
  22. Crypto

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

    С нами с:
    19 окт 2007
    Сообщения:
    2
    Симпатии:
    0
    Адрес:
    Уфа
    Немного ошибся значит в синтаксисе. Если есть время и хочется попробовать, то сделай такой запрос:
    [sql]$query ="SELECT DISTINCT(name) FROM madeup_directories WHERE name IS NOT NULL ORDER BY ID LIMIT 40";[/sql]
     
  23. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    Crypto
    в твоём запросе выведутся 40 первых not null строк, а надо с учётом того, что содержится в $search

    поиск рулит
    http://php.ru/forum/viewtopic.php?t=6716
    http://php.ru/forum/viewtopic.php?t=1635
     
  24. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    Luge спасибо, но как бы это все дело прикрутить к данным на выходе из базы? или как ты писал на входе, даже незнаю что делать.

    ошибся я неработет это дело.
    ты выдел как я ссылу делаю?
    PHP:
    1.  
    2. <?
    3. while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
    4.          foreach ($line as $col_value) {
    5.          $str .=  "\t\t<li><a href=\"$col_value\" "(Илиже можно просто слэш)">$col_value</a>";
    6.          }
    7.        $str .=  "</li>";
    8. ?>
    9.  
    вот эти значения которые из базы лезут, и есть ссылка, которою просто, при нажатие нужно поместить в форму поиска и зделать перезагрузку страницы с новыми данными из базы.
     
  25. dfg

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

    С нами с:
    2 фев 2007
    Сообщения:
    53
    Симпатии:
    0
    Адрес:
    Зеленоград
    так кое что получилось,
    PHP:
    1. $url=urlencode($col_value);
    2.     //$url = "http://" . $HTTP_SERVER_VARS['HTTP_HOST'] . $col_value;
    3.     print "<li><a id=\"form\" href=\"$url\">$col_value</a>";
    4.         }
    5.     echo "</li>";
    ребята как отсеять лишнии пробелы, я незнаю почему но в конце каждой ссылки (++%0D)
    вот несколько прмеров
    /%F1%E0%E4%EE%E2%E0%FF+%EF%E5%F7%FC++%0D
    /%EF%E5%F7%E8+%EA%E0%EC%E8%ED%FB++%0D
    /%EF%E5%F7%E8+%E1%F3%F2%E0%EA%EE%E2++%0D
    а вопрос с переадрисацией сслки в форму поска остаеться открытым. :(