Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.09.2016, 22:19
Интересующийся
Отправить личное сообщение для Zaratustra Посмотреть профиль Найти все сообщения от Zaratustra
 
Регистрация: 10.09.2016
Сообщений: 10

Отправка формы только после выбора select
Доброго времени суток, необходимо организовать поиск без перезагрузки страницы с выбором категории где искать, в данном случае категорией является столбец в БД. Суть в том что бы сначала selectом выбрать столбец для поиска а затем в инпуте вводить сам запрос для поиска.

сейчас все работает на инпуте, то есть сам инпут
<input type="text" class="search_input" name="search" id="search" class='search_box'/>


ajax запрос

<script type="text/javascript">
$(function(){
  $("#search").keyup(function(){
     var search = $("#search").val();
     $.ajax({
       type: "POST",
       url: "search_ajax.php",
       data: {"search": search},
       cache: false,                                 
       success: function(response){
          $("#resSearch").html(response);
       }
     });
     return false;
   });
});

</script>


ну и сам php обработчик

if (isset($_POST['search']))  {
		$s = $_POST['search'];
	echo $s;
}

$query_to_db = mysql_query("SELECT * FROM equipment WHERE client_name LIKE '%$s%'");


и все работает отлично, то есть при вводе на любое изменение в input выводится соответствующее значение из таблицы "equipment" и столбца "client_name", но нужно динамически выбирать поле selectoм, что бы например было так:

<select class="search_in" name="search_in" id="search_in"> 
        <option value='' selected='selected'>Искать по</option>
        <option VALUE="id">Номер</option>
        <option VALUE='status'>Статус</option>
        <option VALUE='client_name'>Имя клиента</option>
	<option VALUE='client_tel'>Телефон клиента</option>
</select>


и уже соответственно php обработчик будет выглядеть:

if (isset($_POST['search_in']))  {
	$s_i = $_POST['search_in'];
	echo $s_i;

}

if (isset($_POST['search']))  {
		$s = $_POST['search'];
	echo $s;
}

$query_to_db = mysql_query("SELECT * FROM equipment WHERE $s_i LIKE '%$s%'");


а ajax примерно!!!! вот так:

<script type="text/javascript">
$(function(){
  $("#search").keyup(function(){
     var search = $("#search").val();
     $.ajax({
       type: "POST",
       url: "search_ajax.php",
       data: {"search": search},
       cache: false,                                 
       success: function(response){
          $("#resSearch").html(response);
       }
     });
     return false;
   });
});


$(function(){
	
	
    $("#search_in").change(function(){
        $.ajax({
            type : 'POST',
            url : 'search_ajax.php',
            data : { search_in: $(this).val() },
            success: function(response){
          $("#resSearch").html(response);
       }
        });
    })
}


);

</script>


по отдельности все работает, задача в том что бы сначала выбрать значение в select, сохранить, но передавать его вместе с изменяющимся inputom. Сейчас это дело передается сразу как только тронуть или input или select, и соответственно php обработчик дает ошибку ибо не находит второго параметра, а нужно что бы select "ждал" ввода в input и передавался только вместе с ним, перелопатил много инфы, толком ничего не получилось, может кто в курсе как такое организовать?
Ответить с цитированием
  #2 (permalink)  
Старый 11.09.2016, 06:19
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Zaratustra
и все работает отлично
Так ли? Во-первых ваш код дырявый на все 100%, во-вторых LIKE использует % и _ как спецсимволы, и если они будут в тексте поиска, то результат запроса будет совсем не тот, который ожидается.
Ответить с цитированием
  #3 (permalink)  
Старый 11.09.2016, 06:42
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Zaratustra
бы сначала выбрать значение в select, сохранить, но передавать его вместе с изменяющимся inputom.
А что должно быть признаком выбора списка? Понятно, что если первая опция списка пуста, то еще можно определить был ли выбор в списке, но если в списке уже ранее выбрано значение, а фокус получает поле ввода, считать ли это, что в списке был выбор?

Тут только одно решение по моему - каждый выбор в списке очищает поле ввода, а запуск поиска только по его изменению, а не списка.
Ответить с цитированием
  #4 (permalink)  
Старый 11.09.2016, 07:15
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

ТС, не слушай мамкиного теоретега. Твоя проблема решается конкатенцией запроса. То есть у тебя есть базовая часть для текста, который так или иначе есть всегда:

$q='SELECT * FROM equipment LIKE "%$s%"';

и опциональная часть для категории, которой может не быть

$qw=' WHERE $s_i';

В средней паршивости коде это может выглядеть так

$q='SELECT * FROM equipment LIKE "%$s%"'.($s_i?' WHERE $s_i':null).';';

При этом запрос на сервер идет как с input'а, так и с change списка.
Ответить с цитированием
  #5 (permalink)  
Старый 11.09.2016, 07:31
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

В нормальном коде можно сделать вот так

Class SqlQuery(){

   private $get;
   private $q;
   
   public function __construct($q){
      $this->get=$_GET;
      $this->q=$q;
   }

   public function query($q){
     
     return
     ($q?)$q:$this->q.
     $this->search().
     $this->where().
     $this->limit().
     ';';

   }

   private function search(){
      if(isset($this->get['text'])) {
        $text=mysqli::real_escape_string($this->get['text']);
        return ' `text` like "%'.$text.'%"';
      }
     else
       throw new _Exception();
   }

   private function where(){
      if(isset($this->get['cat']))
        return ' where `cat`='.mysqli::real_escape_string($this->get['cat']);
   }

   private function limit(){
      return ' limit 0,20';
   }

}


Ну или вроде того, поскольку это вообще пример.

Последний раз редактировалось warren buffet, 11.09.2016 в 07:34.
Ответить с цитированием
  #6 (permalink)  
Старый 11.09.2016, 07:41
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Кстати

Сообщение от Zaratustra
$("#search").keyup
это значит скрипт будет донимать сервер при нажатии любой клавиши - стрелок, забоя и удаление.

Сделай на input. А если нужен переход с того же поля на нормальную страницу поиска - добавь keyup с единственной проверкой на keyCode==13
Ответить с цитированием
  #7 (permalink)  
Старый 11.09.2016, 07:43
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Сообщение от laimas
и если они будут в тексте поиска, то результат запроса будет совсем не тот, который ожидается.
Кто такие символы вводит - тот и получит что ожидает.

Другое дело, что like вообще не полнотекстовый поиск.
Ответить с цитированием
  #8 (permalink)  
Старый 11.09.2016, 07:48
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Сообщение от Zaratustra
type : 'POST',

Что ты несешь? Какой пост? Ты не сможешь получить ссылку на результаты поиска, не сможешь ее передать. Поиск делается всегда через Get.

Короче, сперва напиши обычный нормальный поиск с выводом результатов на страницу, а потом уже к этому поиску приделай опцию аякса. У тебя будет 1 базовый класс и 1 наследственный - под аякс, с разницей чисто в выводе. Если фреймворк шаблонный, то будет 1 класс и замена шаблона.

Последний раз редактировалось warren buffet, 11.09.2016 в 07:51.
Ответить с цитированием
  #9 (permalink)  
Старый 11.09.2016, 08:05
Интересующийся
Отправить личное сообщение для Zaratustra Посмотреть профиль Найти все сообщения от Zaratustra
 
Регистрация: 10.09.2016
Сообщений: 10

Сообщение от laimas Посмотреть сообщение
Так ли? Во-первых ваш код дырявый на все 100%, во-вторых LIKE использует % и _ как спецсимволы, и если они будут в тексте поиска, то результат запроса будет совсем не тот, который ожидается.
нет их в тексте поиска, на счет дырявого кода - согласен, но вы говорите это человеку который еще позавчера не знал вообще что так сделать можно)
Ответить с цитированием
  #10 (permalink)  
Старый 11.09.2016, 08:07
Интересующийся
Отправить личное сообщение для Zaratustra Посмотреть профиль Найти все сообщения от Zaratustra
 
Регистрация: 10.09.2016
Сообщений: 10

Сообщение от warren buffet Посмотреть сообщение
Кстати



это значит скрипт будет донимать сервер при нажатии любой клавиши - стрелок, забоя и удаление.

Сделай на input. А если нужен переход с того же поля на нормальную страницу поиска - добавь keyup с единственной проверкой на keyCode==13

в этом и вся соль, что бы select выбрать, а inputom донимать сервер передавая 2 параметра сразу
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка формы после ajax проверки ShutTap Общие вопросы Javascript 15 08.04.2016 11:46
Отправка формы после валидации beebop Events/DOM/Window 22 12.01.2015 07:34
.js отправка формы marciy Общие вопросы Javascript 1 18.05.2014 21:55
Отправка из формы в форму.. gJam Элементы интерфейса 5 21.07.2011 11:42
Вставка текста в textarea после выбора select option modelisto Общие вопросы Javascript 2 14.10.2009 19:27