Я строю расширенный поиск с помощью ajax, php и mysql. ниже приведен рабочий код для формы поиска (html) вызова AJAX и сценария php, который обрабатывает запрос. Тем не менее, проблема, с которой я сталкиваюсь, заключается в том, как сделать динамический запрос MySQL.
Например, если пользователь выполняет поиск «Hilton Hotel» в поисковой строке, в качестве industry_types
и «Отель» как sub_industry_type
и выбирает «Лондон» в качестве города. Как я могу написать запрос, который будет принимать во внимание все эти входные данные?
Обратите внимание: в search.php я включил запрос для обработки ключевого слова, представленного в user_search_input
вход.
Index.php (HTML):
<form class="user_search_form" action="" method="post">
<input type="text" class="user_search_input" placeholder="search" />
<select class="industry_types" name="industry_types" id="industry_types">
<option value="">Select an industry</option>
<option value="Accommodation">Accommodation</option>
<option value="Food_Drink">Food & Drink</option>
<option value="Entertainment">Entertainment</option>
<option value="Retail">Retail</option>
<option value="Telecommunications">Telecommunications</option>
<option value="Transportation">Transportation</option>
</select><select class="Accommodation sub_industry_type" name="Accommodation" id="sub_industry_type">
<option value="0">Select Accommodation subcategory</option>
<option value="Bed and Breakfasts">Bed and Breakfasts</option>
<option value="Hotel">Hotels</option>
<option value="Hotel">Hostels</option>
<option value="Resturant">Resorts</option>
<option value="Serviced apartments">Serviced apartments</option>
</select>
<select class="Food_Drink sub_industry_type" name="Food_Drink" id="sub_industry_type">
<option value="0">Select Cuisine subcategory</option>
<option value="Resturant">Restaurants</option>
<option value="Cafes">Cafes</option>
<option value="Bars and Pubs">Bars and Pubs</option>
<option value="Tourist Agency">Night clubs</option>
</select><select class="Entertainment sub_industry_type" name="Entertainment" id="sub_industry_type">
<option value="0">Select Entertainment subcategory</option>
<option value="Performing Arts">Performing Arts</option>
<option value="Cinemas">Cinemas</option>
<option value="Resorts and Casinos">Resorts and Casinos</option>
<option value="Amusement Parks and Attractions">Amusement Parks</option>
<option value="Museums">Museums</option>
<option value="Outdoor activities">Outdoor activities</option>
<option value="Media and Entertainment Other">Entertainment Other</option>
</select>
<select class="Retail sub_industry_type" name="Retail" id="sub_industry_type">
<option value="0">Select Retail subcategory</option>
<option value="Beer, Wine and Liquor Stores">Beer, Wine and Liquor Shops</option>
<option value="Clothing and Shoe Stores">Clothing and Shoe Shops</option>
<option value="Electronic Shops">Electronic Shops </option>
<option value="Jewelry, Luggage, and Accessories">Jewelry, Luggage, and Accessories</option>
<option value="Sporting Goods, Hobby, Books and Music Stores">Sporting Goods, Hobby, Books and Music Stores</option>
<option value="Internet Businesses">Internet Businesses</option>
<option value="Retail Others">Retail Others</option>
</select>
<select class="Telecommunications sub_industry_type" name="Telecommunications" id="sub_industry_type">
<option value="0">Select Telecommunications subcategory</option>
<option value="Telephone Service Providers and Carriers">Telephone Service Providers</option>
<option value="Telecommunications Other">Telecommunications Other</option>
</select>
<select class="Transportation sub_industry_type" name="Transportation" id="sub_industry_type">
<option value="0">Select Transportation subcategory</option>
<option value="Car Rental">Car Rentals</option>
<option value="Taxi, Buses and Transit Systems">Taxi Services</option>
<option value="Travel Agents">Travel Agents</option>
</select>
<select name="select_city" class="select_city">
<option value="">City</option>
<option value="">London</option>
<option value="">New York</option>
<option value="">Paris</option>
</select>
<input type="submit" value="search" class="search_btn" />
</form>
Index.php (AJAX):
$('.user_search_form').submit(function(e){
e.preventDefault();
var $search_input = $('.user_search_input').val();
var $industry_general = $('.industry_types').val();
var $industry_spesific = $('.sub_industry_type').val();
var $selected_city = $('.select_city').val();var url = "search.php";
$.ajax({ //create an ajax request to load_page.php
type: "POST",
url: url,
data:{search_input: $search_input, industry_general: $industry_general, industry_spesific: $industry_spesific, selected_city: $selected_city},
dataType: "html", //expect html to be returned
success: function(date){
$('#search_results').html(date);}
})
});
search.php (выпуск):
<?php include 'includes/db_connect.php';
$search_input = $_POST['search_input'];
$industry_general = $_POST['industry_general'];
$industry_spesific = $_POST['industry_spesific'];
$selected_city = $_POST['selected_city'];
if(!empty($search_input)){
$sql = $dbh->prepare("SELECT * FROM table WHERE company_name LIKE :company_name OR company_keywords LIKE :company_keywords OR company_city LIKE :company_city OR company_email LIKE :company_email");
$sql->bindValue(':company_name', '%' . $search_input . '%', PDO::PARAM_STR);
$sql->bindValue(':company_keywords', '%' . $search_input . '%', PDO::PARAM_STR);
$sql->bindValue(':company_city', '%' . $search_input . '%', PDO::PARAM_STR);
$sql->bindValue(':company_email', '%' . $search_input . '%', PDO::PARAM_STR);if($sql->execute()) {
$sql->setFetchMode(PDO::FETCH_ASSOC);
}
}
elseif(!empty($industry_general)){
// if industry_general is not empty
}
elseif(!empty($industry_spesific)){
// if industry_spesific is not empty
}
elseif(!empty($selected_city)){
// if selected_city is not empty
}?>
Как насчет этого фрагмента?
// columns that should contain either of the search_input words
$searchTermCols = [
'company_name',
'company_keywords',
'company_city',
'company_email'
];
$data = $_POST; // copy $_POST array to a variable so you can safely alter keys/values
$searchInput = $data['search_input']; // tmp store search_input so you can unset it for the rest of the code
unset($data['search_input']); // unset unnecessary keys (if you have any). like in your case you want to do different stuff with that key=>value
//unset($data['some_other_unwanted_input_doing_other_stuff']); // or another one
$searchInputParts = preg_split('/\s+/', $searchInput); // explode by whitespace
$searchInput = implode('|',$searchInputParts); // for REGEXP search in mysql to search each word occurrence in a column
foreach($data as $key=>$val) { // loop through copied array
$sqlParts1[] = $key.' LIKE :'.$key;
}
foreach($searchTermCols as $key) { // loop through columns that should contain either of the words
$sqlParts2[] = $key.' REGEXP :'.$key;
}
$andParts = implode(' AND ',$sqlParts1); // these options must exists in the columns
$orParts = implode(' OR ',$sqlParts2); // these options must exists in the columns
$qryStr = "SELECT * FROM table WHERE ";
$qryStr .= "($andParts) AND ($orParts)"; // concatenate both similar but different queries and append to query
$sql = $dbh->prepare($qryStr);
foreach($data as $key=>$val) {
$sql->bindValue(':'.$key, '%' . trim($val) . '%', PDO::PARAM_STR);
}
foreach($searchTermCols as $key) {
$sql->bindValue(':'.$key, $searchInput, PDO::PARAM_STR);
}
if($sql->execute()) {
$sql->setFetchMode(PDO::FETCH_ASSOC);
}
ОБНОВИТЬ
Вы можете скопировать $ _POST в другую переменную и сбросить ключи, которые вам не нужны в запросе. Посмотрите первые две добавленные строки и переменную $ data, установленную для циклического прохождения.
ОБНОВЛЕНИЕ 2 Важно ..
Атрибуты имени вашей формы ввода должны соответствовать столбцам таблицы базы данных. Так, например:
<input type="text" name="company_name" id="company_name">
Если имя столбца вашей таблицы базы данных — «company_name».
ОБНОВЛЕНИЕ 3
Для развлечения я добавил требования, изложенные в вашем комментарии. У меня нет вашей структуры таблицы, поэтому я не проверял ее …
Других решений пока нет …