mysql — фильтрация записей на основе столбцов базы данных не работает с помощью автозаполнения поиска Переполнение стека

Я включил автозаполнение поиска на моем сайте, где пользователь вводит ключевое слово и просматривает записи на его основе.

Предположим, что если я напишу почтовый индекс, он отфильтрует только данные из почтового поля. Далее, если пользователь вводит адрес, например 121 North West, скрипт автоматически выбирает записи, совпадающие с 121 North West. Кроме того, то же самое для улицы, если пользователь вводит название улицы, такое как кедровая дорожка, то выбирает записи только из поля базы данных улицы.

У меня проблема с тем, что он ищет записи из всех полей, и поэтому я не могу получить правильный список из базы данных.

Ссылка на сайт, на котором я подписан http://www.trulia.com здесь это работает, как ожидалось. Я хочу то же самое на моем сайте, и это работает, но не так, как я ожидаю.

Мой код PHP:

<?php
$searchKeyword  = $_REQUEST['keyword'];

$searchQ    =   "SELECT zip, ste, st, st_num, town, addr FROM tbl_property WHERE (zip = '$searchKeyword' OR ste like '%$searchKeyword%' OR town like '%$searchKeyword%' OR addr like '%$searchKeyword%') GROUP BY zip LIMIT 0,5";
$queryRec   = mysql_query($searchQ);
$recSet     = mysql_num_rows($queryRec);
echo "<div id='fetchRecs'><ul>";
if($recSet>0){
while($row = mysql_fetch_array($queryRec)) {
echo '<li>'.$row['addr'].', '.$row['town'].', '.$row['ste'].', '.$row['zip'];?></li>
<?php
}
}else{
echo "<li>No Records Found</li>";
}
echo "</ul></div>";

Я просто хочу, если пользователь пишет 123, список отображается как 1234, 1245, и так же, как список, который показывает только почтовые индексы из столбца почтового индекса.

То же самое, если пользователь пишет 123 кедра, он выбирает листинг, похожий на 123 кедра, только означает, что он придет из уличной колонны.

П.С .: У меня только одно текстовое поле, в котором я набираю ключевое слово, например: http://www.trulia.com

П.С .: Мой вопрос до сих пор не решен, пожалуйста, поделитесь, если у кого-нибудь есть полезная информация. Может быть, это будет работать и для некоторых других.

1

Решение

Прежде всего, пердон меня за мои ошибки.

Хорошо, я изменил несколько вещей и теперь работает:

//Filter:
<?php

if (isset($_REQUEST['field']) && isset($_REQUEST['keyword'])) {
$field = $_REQUEST['field'];
$keyword = $_REQUEST['keyword'];
}else{
$field = null;
$keyword = null;
}
$query = "SELECT * FROM tbl_property";
$where = "";
switch ($field) {
case 'zipCode':
$where = " WHERE zip like '" . $keyword . "%'";
break;
case 'addr':
$where = " WHERE addr like " . $keyword . "%";
break;
case 'city':
$where = " WHERE city like " . $keyword . "%";
break;
}
$query = $query . $where;

$db = new mysqli('localhost', 'user', 'password', 'db');
if ($db->connect_errno > 0){
die($db->connect_error);
}

$result = $db->query($query)
?>

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Searcher</title>
<link rel="stylesheet" href="">
</head>
<body>

<section id="searcher">
<form action="" method="post">
<input type="text" name="keyword" id="keyword"           />
<input type="hidden" name="field" id="field" value="all" />
<div id="lists">
<ul></ul>
</div>
</form>
</section>

<section id="results">
<table>
<caption>Results</caption>
<thead>
<tr>
<th>Zip</th>
<th>Address</th>
<th>City</th>
</tr>
</thead>
<tbody>
<?php while($row = $result->fetch_assoc()){ ?>
<tr>
<td><?php echo ($row['zip']); ?></td>
<td><?php echo ($row['addr']); ?></td>
<td><?php echo ($row['city']); ?></td>
</tr>
<?php } ?>
</tbody>
</table>
</section>

<script src="http://code.jquery.com/jquery-2.1.3.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
$( "#keyword" ).keyup(function() {
$.ajax({
type: "POST",
url: "req.php",
data:{ key: $(this).val() },
success: function(data){
//Show the data to the clients
//(in a div or a "select2" plugin)
if (data.locations.length > 0){
$('#lists ul').html('');
$.each(data.locations, function( key, location ) {
//iterate over locations
$('#lists ul').append( '<li data-field="' + location._type + '">' + location.value  + '</li>' );
});

//SetUp hidden default value while keyword change
//Form the JSON Response
$('#field').val(data.locations[0]._type);
}else{
$('#lists ul').html('No Results!');
$('#field').val('all');
}
}
});
});

$('#lists ul li').click(function(){
$('#keyword').val($(this).html());
$('#field').val($(this).parent().data('field'));
});
</script>

</body>
</html>

<?php
$db->close();
?>

а также

//req.php
<?php
$key = $_POST['key'];

$data = array(
'locations' => array(),
'errors'=>array(),
'success'=> true
);

header('Content-Type: application/json');

$db = new mysqli('localhost', 'user', 'password', 'db');

if($db->connect_errno > 0){
$data['errors'][] = $db->connect_error;
die(json_encode($data));
}

$query = "SELECT zip FROM tbl_property WHERE zip LIKE '" . $key . "%';";
$zips = $db->query($query);

$query = "SELECT city FROM tbl_property WHERE city LIKE '" . $key . "%';";
$cities = $db->query($query);

if($db->connect_errno > 0){
$data['errors'][] = $db->connect_error;
die(json_encode($data));
}

$index = 0;
if ($zips){
while($row = $zips->fetch_assoc()){
$data['locations'][] = array(
"value"=> $row['zip'],
"altValue"=> null,
"display"=> $row['zip'],
"_type"=> "zipCode",
"propertyIndex"=> "",
"index"=> $index
);
$index = $index + 1;
}
}
if ($cities){
while($row = $cities->fetch_assoc()){
$data['locations'][] = array(
"value"=> $row['city'],
"altValue"=> null,
"display"=> $row['city'],
"type"=> "city",
"propertyIndex"=> "",
"index"=> $index
);

$index = $index + 1;
}
}

$db->close();

header('Content-Type: application/json');
echo json_encode($data);

я не запускал тест для события click на lists ul li элемент, потому что я не знаю, что бы вы сделали, и это менее важная часть.

Я надеюсь, это было то, что вы искали.
Держите в курсе.

0

Другие решения


ОБНОВЛЕНО


Это форма из http://www.trulia.com/

<div class="searchbox">
<form id="searchbox_form" class="searchbox_form form man" method="get" action="/submit_search/" autocomplete="off">
<div class="field man">

<span class="select">
<div id="homepage-select" class="selectPretty">
<select id="search_options" class="h5 man txtL" name="display_select" data-previous-selection="for_sale">
<option value="for_sale">Buy</option>
<option value="for_rent">Rent</option>
<option value="sold">Recently sold</option>
</select>
<div class="selectDisplay btn btnLrg btnDefault rrn backgroundBasic pts plm">
<span class="selectLabel h5">Buy</span>
<span class="selectTrigger pts"><i class="iconDownOpen"></i></span>
</div>
</div>
</span>
<span class="text">
<div style="display: none; top: 129px; left: 297.5px; width: 370px;" class="autosuggest_list"><ul><li class="location-get-me">Current Location</li></ul></div><input id="searchbox_form_location" type="text" name="search" class="searchbox_form_location searchInput text searchByLocation typeWeightNormal h5 man" value="" placeholder="Search by neighborhood, city, zip or address" autocomplete="off">
<input type="hidden" name="locationId" value="">
<input type="hidden" name="locationType" value="">
<input type="hidden" name="tst" class="searchbox_form_type" value="h">
<input type="hidden" name="ac_entered_query" value="">
<input type="hidden" name="ac_index" value="">
<input type="hidden" name="propertyId" value="">
<input type="hidden" name="propertyIndex" value="">
<input type="hidden" name="display" class="searchbox_form_type_display" value="for sale">
<button class="btn btnPrimary submit"><span class="h5 typeEmphasize"><i class="iconSearch h4"></i>SEARCH</span></button>
</span>
</div>
</form>
</div>

также, если вы отфильтровываете запросы GET, что страница создала, вы можете увидеть, что при вставке значения в текстовое поле bax json запрашивает ajax:

{
"locations": [{
"value": "47977",
"altValue": null,
"display": "19901",
"type": "zipCode",
"propertyIndex": "",
"index": 0
}, {
"value": "47978",
"altValue": null,
"display": "19902",
"type": "zipCode",
"propertyIndex": "",
"index": 1
}, {
"value": "47979",
"altValue": null,
"display": "19903",
"type": "zipCode",
"propertyIndex": "",
"index": 2
}, {
"value": "47980",
"altValue": null,
"display": "19904",
"type": "zipCode",
"propertyIndex": "",
"index": 3
}, {
"value": "47981",
"altValue": null,
"display": "19905",
"type": "zipCode",
"propertyIndex": "",
"index": 4
}],
"suggestions": [],
"success": true,
"errors": []
}

это похоже на последний пример, который я сначала приведу (используя ajax для установки скрытого ввода vaule для поиска), а затем в своем php-файле вы можете переключиться на это скрытое значение ввода, которое в json "type": "zipCode"

Вы можете прочитать последний метод еще раз с этой дополнительной информацией.

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


Если вы хотите получить отдельные списки для каждого типа поиска, который будут искать ваши клиенты, вы можете добавить еще один вход, относящийся к типу поиска:

<select name="field">
<option value="zip">Zip Code</option>
</select>
<input type="text" name="keyword" />

тогда в вашем php-коде:

$field = $_REQUEST['field'];
$keyword = $_REQUEST['keyword'];
$query = "SELECT * FROM tbl_property";
$where = "";
switch ($field) {
case 'zip':
$where = " WHERE zip = " . $keyword;
break;
case 'addr':
$where = " WHERE addr like " . $keyword . "%";
break;
case 'city':
$where = " WHERE city like " . $keyword . "%";
break;
}
$query = $query . $where . " GROUP BY zip LIMIT 0,5";

Это даст вам разделенный список в зависимости от того, что ищет клиент.

Другим способом сделать это будет анализ данных в ключевом слове, например, вы знаете, что если у вас есть только 1 слово, которое также может быть преобразовано в число, это относится к почтовому индексу

Вы можете использовать массивы для этого:

$keyword = $_REQUEST['keyword'];
$query = "SELECT * FROM tbl_property";
$where = "";
$parms = split(" ", $keyword);
if(count($parms) == 1 && intval($parms[0], 10) > 0){
$where = " WHERE zip = " . $keyword;
}elseif (count($parms) > 1){
$where = " WHERE addr like %" . $keyword . "%";
}

это зависит от вашей собственной логики.

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


MOD 05/05/2015 8:00:00 p.m.

Вы также можете использовать javascript и ajax, чтобы получить список городов, почтовые индексы и адреса, которые у вас есть, и указать на скрытом вводе тип поиска, который вы сделали. Например, используя jQuery:

<input type="text" name="keyword" id="keyword"           />
<input type="hidden" name="field" id="field" value="all" />
<div id="lists"></div>

<script>
$('#keyword').change(function() {
$.ajax({
type: "POST",
url: "req.php",
data:{ key: $(this).val() },
success: function(data){
$('#lists').html(data);
}
});
});
$('#lists ul li').click(function(){
$('#keyword').val($(this).html());
$('#field').val($(this).parent().data('field'));
});
</script>

на req.php

$key = $_POST['key'];

$db = new mysqli('localhost', 'user', 'pass', 'db');

$query = "SELECT zip FROM tbl_property WHERE zip like " . $key . "%;";
$zips = $db->query($query);

$query = "SELECT addr FROM tbl_property WHERE addr like " . $key . "%;";
$addrs = $db->query($query);

echo ('<h1>Zips</h1><ul data-field="zip">');
while($row = $zips->fetch_assoc()){
echo ("<li>" . $row['zip'] . "</li>");
}

echo ('</ul><hr /><h1>Addrs:</h1><ul data-field="addr">');
while($row = $addrs->fetch_assoc()){
echo ("<li>" . $row['addr'] . "</li>");
}
echo ('</ul>');

$db->close();

Если я ничего не пропустил, это должно сработать.

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

0

Вы должны определить свою стратегию, вы можете использовать JSON, как в Интернете www.trulia.com, или ответ HTML среди других.

Ваш HTML-файл, используя метод json, не забудьте определить свою собственную логику !:

<input type="text" name="keyword" id="keyword" />
<input type="hidden" name="field" id="field" value="all" />
<div id="lists"></div>

<script>
$('#keyword').change(function() {
$.ajax({
type: "POST",
url: "req.php",
data:{ key: $(this).val() },
success: function(data){
//Show the data to the clients
//(in a div or a "select2" plugin)
$.each(data.locations, function( key, value ) {
//iterate over locations
}

//SetUp hidden default value while keyword change
//Form the JSON Response
$('#field').val(data.locations[0].type); //Get the type of the first element in locations
}
});
});
$('#lists ul li').click(function(){
$('#keyword').val($(this).html());
$('#field').val($(this).parent().data('field'));
});
</script>

файл req.php:

$key = $_POST['key'];

$data = array(
'locations' => array(),
'errors'=>array(),
'success': true,
);

header('Content-Type: application/json');

$db = new mysqli('localhost', 'user', 'pass', 'db');

if($db->connect_errno > 0){
$data['errors'][] = $db->connect_error;
die(json_encode($data));
}

$query = "SELECT zip FROM tbl_property WHERE zip like " . $key . "%;";
if(!$zips = $db->query($sql)){
$data['errors'][] = $db->connect_error;
die(json_encode($data));
}

$query = "SELECT city FROM tbl_property WHERE city like " . $key . "%;";
if(!$cities = $db->query($sql)){
$data['errors'][] = $db->connect_error;
die(json_encode($data));
}

$index = 0;

while($row = $zips->fetch_assoc()){
$data['locations'][] = array(
"value": $row['zip'],
"altValue": null,
"display": $row['zip'],
"type": "zipCode",
"propertyIndex": "",
"index": $index
);

$index = $index + 1
}

while($row = $cities->fetch_assoc()){
$data['locations'][] = array(
"value": $row['city'],
"altValue": null,
"display": $row['city'],
"type": "city",
"propertyIndex": "",
"index": $index
);

$index = $index + 1
}

$db->close();

header('Content-Type: application/json');
echo json_encode($data);

Ответ JSON, как в trulia.com:

{
"locations": [{
"value": "47977",
"altValue": null,
"display": "19901",
"type": "zipCode",
"propertyIndex": "",
"index": 0
}, {
"value": "47978",
"altValue": null,
"display": "19902",
"type": "zipCode",
"propertyIndex": "",
"index": 1
}, {
"value": "47979",
"altValue": null,
"display": "19903",
"type": "zipCode",
"propertyIndex": "",
"index": 2
}, {
"value": "47980",
"altValue": null,
"display": "19904",
"type": "zipCode",
"propertyIndex": "",
"index": 3
}, {
"value": "47981",
"altValue": null,
"display": "19905",
"type": "zipCode",
"propertyIndex": "",
"index": 4
}],
"success": true,
"errors": []
}

в вашем файле поиска php (тот, который будет искать, когда пользователь отправит)

$field = $_REQUEST['field'];
$keyword = $_REQUEST['keyword'];
$query = "SELECT * FROM tbl_property";
$where = "";
switch ($field) {
case 'zip':
$where = " WHERE zip = " . $keyword;
break;
case 'addr':
$where = " WHERE addr like " . $keyword . "%";
break;
case 'city':
$where = " WHERE city like " . $keyword . "%";
break;
}
$query = $query . $where . " GROUP BY zip LIMIT 0,5";

$db = new mysqli('localhost', 'user', 'pass', 'db');
$result = $db->query($query);

// show the result

$db->close();

Если я ничего не пропустил, это должно сработать.

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

0
По вопросам рекламы [email protected]