За последние 24 часа нас посетили 17643 программиста и 1649 роботов. Сейчас ищут 927 программистов ...

Поиск в SQL

Тема в разделе "PHP для новичков", создана пользователем Panich, 8 ноя 2011.

  1. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    У меня есть таблица в базе данных с множеством столбцов:id,имя пользователя,его логин,дата рождения (соответственно три числовых значения),фотки его,пол,пароль и т.д.
    Хочу:создать для админки поиск по различным категориям-ввёл имя,логин и пол и получил список пользователей с похожими параметрами,ввёл только пароль,дату рождения-получил другой список с вновь введёнными параметрами...
    Вот до чего дошёл:
    1.приводить здесь код html не стану-тут всё элементарно.
    2.
    PHP:
    1. $query="SELECT * FROM table WHERE name LIKE '".mysql_real_escape_string($_GET['name'])."%'";
    3.Получая значение name,я выбираю все возможные варианты с этой переменной и потом начинаю проверять остальные введённе админом данные...а вот тут и сама проблема-ведь если админ не заполнил какое из полей,то оно пустое и его нужно уничтожить,а если ввёл значение,то сравнить с имеющимися (причём их много может быть,а тут в цикле нужно действовать...)
    Короче,помогите разрулить,натолкните на мысль или я вообще не в том направлении!?
    П.С.Заранее спасибо!
     
  2. korih

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

    С нами с:
    12 окт 2011
    Сообщения:
    34
    Симпатии:
    0
    ну а почему бы вам не сделать одну форму с данной, если вводить ид то выводит ид, если логин, то выводит логин? к примеру если ввели логин пользователя для поиска то он вам выводит всю строку, с его идом, именем, датой и тд и тп
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Составляй WHERE-часть запроса в зависимости от введённых параметров:
    PHP:
    1. <?php
    2. // ...
    3. $sqlWhere = array();
    4. if(isset($_GET['name']) and !empty($_GET['name']))
    5.     $sqlWhere[] = "`name` LIKE '" . mysql_real_escape_string($_GET['name']) . "%'";
    6. if(isset($_GET['birthdate']))
    7.     $sqlWhere[] = "`birthdate` = '" . mysql_real_escape_string($_GET['birthdate']) . "'";
    8. // и т.д.
    9. $sqlWhere = (count($sqlWhere) > 0) ? (' WHERE ' . implode(' AND ', $sqlWhere)) : '';
    10. $sql = "SELECT * FROM `table`{$sqlWhere}";
    11. //...
    12. ?>
     
  4. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Ну,вот есть у меня зарегеный пользователь и на его страницу(если войти от другого пользователя) высветятся только данные об имени,возрасте и городе-но ведь если в поиске админки я вобью только эти данные,то таких ребяток у меня может появиться и с десяток...а вдруг я удалить хочу этого пользователя или заблочить?
    Нужен поиск реализованы по категориям:вот ввёл я имя-вывело мне сотню пользователей,ввёл возраст-осталось пятьдесят,ввёл город-осталось тридцать,потом добавил пол-стало десять,я на фотки этих десяти посмотрел-выбрал негодяя и заблочил его ip.
    Или я не правильно придумал-можно проще что сделать?
     
  5. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Собачник,я тут вот эту строчку не понял совсем-знаний не хватает-можете пояснить!?
     
  6. korih

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

    С нами с:
    12 окт 2011
    Сообщения:
    34
    Симпатии:
    0
    хм ну а почему бы на профиле пользователя не вывести кнопку бана и других функций которую видет только пользователь принадлежащий категории администрации?
    по-моему так будет проще сделать чем посмотреть на профиль пользователя а потом пытаться найти его в поиске чтоб произвести какое то действие
     
  7. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Вот это:
    Код (Text):
    1. $sqlWhere = (count($sqlWhere) > 0) ? (' WHERE ' . implode(' AND ', $sqlWhere)) : '';
    Аналогично
    PHP:
    1. <?php
    2. // ...
    3. if(count($sqlWhere) > 0)
    4.     $sqlWhere = ' WHERE ' . implode(' AND ', $sqlWhere);
    5. else
    6.     $sqlWhere = '';
    7. // ...
    8. ?>
    Ну а это:
    Код (Text):
    1. $sql = "SELECT * FROM `table`{$sqlWhere}";
    Аналогично
    PHP:
    1. <?php
    2. // ...
    3. $sql = "SELECT * FROM `table`" . $sqlWhere;
    4. // ...
    5. ?>
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    implode() объединяет массив в строку, используя заданный соединитель. Например есть массив:
    PHP:
    1. <?php
    2. $arr = array(
    3.     'first_element',
    4.     'second_element',
    5.     'third_element'
    6. );
    7. ?>
    Можно его превратить в строку:
    PHP:
    1. <?php
    2. $str = implode(' and ', $arr);
    3. ?>
    Теперь в переменной $str содержится строка:
    Код (Text):
    1. "first_element and second_element and third_element"
     
  9. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Извините,а зачем именно строка?Так легче php проверять?Разве н не будет так это делать на много дольше?...или я опять не понял что-то...не встречал писание подобных оборотов в учебниках!

    Возможно,но у меня админка будет выполнять много функций с сайтом,а если оставить её в виде обычного сайта,но с кнопками-тогда она станет огромной+если мне другой пользователь жалобу напишет-как я буду искать нарушителя?
     
  10. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Panich
    Потому, что (в моём примере):
    1. Собираем входящие параметры в массив. Каждый элемент массива является готовым SQL-кодом для WHERE (т.е. кусочком запроса, задающим нужное условие для получение данных из б.д.). Мы добавляем в массив только те данные, которые были заполнены.
    2. Поскольку SQL-запрос к б.д. - это строка текста, нужно преобразовать полученный массив с условиями в строку и подставить полученную строку условий в запрос.
    Например, если было введено только имя (Oleg) получим такой запрос на выходе:
    [sql]SELECT * FROM `table` WHERE `name` LIKE 'Oleg%';[/sql]
    Если были введены имя (Oleg) и дата (1985-01-01), то получим:
    [sql]SELECT * FROM `table` WHERE `name` LIKE 'Oleg%' AND `birthdate` = '1985-01-01';[/sql]
    Если не было введено ничего - получим все данные из б.д.
    [sql]SELECT * FROM `table`;[/sql]

    У меня там есть недоделка в коде (поспешил). Вместо
    Код (Text):
    1. if(isset($_GET['birthdate']))
    Должно быть
    Код (Text):
    1. if(isset($_GET['birthdate']) and !empty($_GET['birthdate']))
    Т.е. добавляем в массив условие на дату только в том случае, если оно было заполнено.
     
  11. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Так,вроде начал въезжать!
    Только вот ещё вопрос:это если пользователь вообще ничего не ввёл,то мне высветятся все все все...!?
     
  12. korih

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

    С нами с:
    12 окт 2011
    Сообщения:
    34
    Симпатии:
    0
    Panich
    можно сделать одну кнопку, которая будет выводить красивое всплывающее окно в котором админ произведёт какое-либо действие над пользователем. повысить/понизить, забанить/разбанить и тд и тп.
    а отдельно в поиске в админке можно сделать по принципу собачника.
    по поводу высветится всё-всё-всё...
    если пользователь оставил поле пустое то можно присвоить значение:
    PHP:
    1. <?php
    2. if($_POST['name']='') {exit ('поле поиска осталось пустым.');}
    3. ?>
     
  13. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    В том примере, который я написал выше - да, выберутся все. Это можно изменить при желании на какое-то другое действие, которое тебе нужно.
    Понять, что ничего не заполнено в скрипте можно, например, по значению переменной $sqlWhere из примера. Если она пустая - значит ничего не заполнено. Т.е.:
    PHP:
    1. <?php
    2. // ...
    3. if(empty($sqlWhere)) {
    4.     // Выполняем нужные действия
    5. }
     
  14. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Мы сначала вносим в массив значение имени:
    и т.д.
    потом переводим массив в строковое значение...
    Потом вносим в массив значения дня рождения:
    и т.д.
    и опять превращаем его в строковое значение...
    А не проще превращать в строковое значение один раз в самом конце,когда внесём туда все переменные?
     
  15. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    В предыдущем вопросе разобрался-неправильно понял,а значит неправильно спросил (хочется всё узнать пока Вам не надоел!)

    Тут двоеточие в самом конце означает:
    PHP:
    1. else   $sqlWhere = '';
    ???
     
  16. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    О-о-о-о-о!Всё-теперь мне стыдно!)))Я разобрался-альтернативный синтаксис!Про него не читал ещё!!!
    Спасибо большое-буду разбираться и пользоваться Вашими подсказками...!!!
     
  17. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    О, собрался начать отвечать, а ты сам уже разобрался - молодец.
    Пожалуйста
     
  18. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    А может высвечивать пользователю на страницу id в уголке где-нибудь и не париться потом!?
    Ввёл в поисковике этот номерок,нашёл нарушителя и кошмарь его как хочешь...)))
    П.С.А как вот админы в социальных сетях находят пользователя-их же там миллионы!?
    Могу ли я в url,например,пользователю дописывать его id!?Он не знает,а мне всё понятно...или это со стороны безопасности чревато?
     
  19. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    На страничке пользователя можно добавить кнопку "Пожаловаться", при нажатии на которую другой пользователь может написать какой-то текст (в чём заключается его жалоба) и отправить жалобу.
    Жалобы могут заноситься в б.д. (например, просто поля id жалобы, id пользователя, который пожаловался, id пользователя, на которого пожаловались, текст жалобы).
    В админке можно сделать скрипт, который будет отображать тебе все жалобы. Id пользователей (кто и на кого пожаловался) - можно сделать ссылками, при нажатии на которую сразу попадаешь на страничку управления тем или иным пользователем.
     
  20. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Идея нормальная,но если я злостный админ и хочу удалить пользователя,который мне не понравился...или он на форуме матерился-вот как его тогда определить(найти в базе данных) быстро?
     
  21. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Вот тут на форуме - видишь под твоим постом есть кнопка "Профиль"? Нажимаешь на неё и попадаешь на страничку пользователя. На страничке пользователя может быть кнопка "Пожаловаться" о которой я писал выше. Это для других пользователей. Также там может быть кнопка (ссылка) для перехода в админку, сразу на страничку управления этим пользователем, которая (кнопка/ссылка) отображается только для админов.
    Админ может нажать на неё и делать что хочет с этим пользователем.
    Другой пользователь может нажать на "Пожаловаться", жалоба добавилась в б.д., потом админ в админке просмотрит жалобы и примет решение, как поступить с тем или иным пользователем, на которого поступила жалоба.
     
  22. Panich

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

    С нами с:
    10 май 2011
    Сообщения:
    548
    Симпатии:
    0
    Адрес:
    Ростов-Москва
    Тоже вариант...Ох,сайт делаю уже четыре месяца,учусь программированию почти два года (один язык отдельно учить невозможно и приходится всё читать сразу),но основная работа не позволяет всё сделать в срок как задумал...
    П.С.Это было отступление...
    А по теме:спасибо ещё раз!Если бы не такие как Вы,то затянулись бы мои труды,а так-вместе,и дело спорится веселее!)))