|
|
|
| Вообщем нужно как-то отделить друг от друга три варианта запроса. Попробую объяснить.
1. вариант toyota
появляется подсказка
toyota corolla
toyota camry
и т.д.
2. вариант toyota corolla или corolla
мне уже не нужно чтобы появлялись опять подсказки из первого варианта, а нужно
Toyota corolla NZE121
Toyota corolla NZE124
и т.д. т.е. поиск идет по такому запросу
SELECT substitute, keys_word FROM keys_words WHERE keys_word LIKE '%".$query."%' LIMIT 0, 10
|
как сделать правильный показ подсказок. конечно вместо corolla там может быть что-то другое, это как пример | |
|
|
|
|
|
|
|
для: technic611
(27.09.2013 в 22:48)
| | Разбивайте строку по пробелу в массив, а потом для каждой позиции в массив определите правило like | |
|
|
|
|
|
|
|
для: OLi
(30.09.2013 в 20:30)
| |
$mas=explode(" ",$query);
$base= "SELECT substitute, keys_word FROM keys_words WHERE keys_word LIKE '%".$mas[0]."%' and keys_word LIKE '%".$mas[1]."%' LIMIT 0, 10";
|
так? не очень удачный вариант.
Ваш пример здесь не работает, я уже сделал так. Второй лайк будет пустым, если введено одно слово toyota а значит выводится все что содержит toyota.
По вашему варианту если пишем to то ищется выводятся модели, т.к второй лайк пустой на данный момент, их мне выводить не нужно здесь
Нужно чтобы было так
Если пишем to то ищется
Toyota corolla
Toyota vista
....
Toyota rav4
Toyota land cruiser
И тд
А если выбирем из этого списка уже словосочетание например toyota rav4 должны выводится модели для данной марки
Допустим
gx100
Gx110
Gx 80
И тд
Вот так должно работать
Видите в двух вариантах везде toyota есть. | |
|
|
|
|
|
|
|
для: technic611
(03.10.2013 в 21:07)
| | всё что вам нужно сделать, это в зависимости от количества слов правильно расставить символы % в конструкции LIKE. ну и слова объединять тоже похоже придется | |
|
|
|
|
|
|
|
для: psychomc
(03.10.2013 в 22:32)
| | не могли бы примерчик накидать? а то пока не очень ясно | |
|
|
|
|
|
|
|
для: technic611
(03.10.2013 в 21:07)
| | Не понятно почему нужно что-то вообще разбивать, и почему при выборе toyota (да и вообще даже по toy) не должно отображаться Toyota corolla NZE121, Toyota corolla NZE124, а только toyota corolla, toyota camry. Это уже не похоже на живой поиск. Как вы ранее делали запрос, так и должно работать - слева направо и если есть, то и с добавлением слева:
<?
if(isset($_POST['s'])) {
$q = mysql_query("SELECT keys_word FROM keys_words WHERE keys_word LIKE '%".mysql_real_escape_string($_POST['s'])."%' ORDER BY keys_word");
if($q && mysql_num_rows($q)) {
$js = array();
while($r = mysql_fetch_row($q)) $js[] = $r[0];
echo json_encode($js);
exit;
}
}
?>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script>
$(function(){
$('#itm').keyup(function() {
if(this.value.length>2) {
$.post('getlist.php', {s:this.value}, function(d) {
if(!!d) {
$('#list').html('<option>'+d.join('<option/><option>')+'</option>').show();
}
}, 'json');
}
});
});
</script>
<input type="text" name="srch" id="itm" list="list" />
<datalist id="list"></datalist>
|
Это разве не "живой поиск"? Единственно что нужно добавить, это на клиенте минимальную длину значения для запроса, например по самому короткому наименованию фирмы. Ну чтобы не искать по одному символу. | |
|
|
|
|
|
|
|
для: confirm
(04.10.2013 в 04:15)
| | ввобщем нельзя смешивать модели с кузовами. поэтому я сделал так, прокомментите пожалуйста
$mas=explode(" ",$query);
$base= "SELECT substitute, keys_word FROM keys_words WHERE keys_word LIKE '%".$mas[0]."%'";
$res = mysql_query($base);
if(mysql_num_rows($res)>0 && $mas[1]!=false)
{
$base="SELECT substitute, keys_word FROM keys_words WHERE keys_word LIKE '%".$mas[1]."%'";
$res = mysql_query($base);
}
while($str = mysql_fetch_array($res))
{
$array[]= $str[substitute];
}
|
| |
|
|
|
|
|
|
|
для: technic611
(07.10.2013 в 14:18)
| | А что тут комментировать, если только:
$mas=explode(" ",$query);
А если я введу несколько пробелов подряд, у вас состыкуется? Почему вы не убираете мусор возможный?
if(mysql_num_rows($res)>0 && $mas[1]!=false)
Язык, не африканский конечно, всегда вернет false для логического условия, если возвращаемое значение функции или переменной равно 0, и всегда true если более 0. То есть писать
if(mysql_num_rows($res)>0) {действие}
смысла не имеет, и достаточно:
if(mysql_num_rows($res)) {действие}
То же самое и для $mas[1]!=false, достаточно в логическом выражении написать $mas[1], то есть в итоге так:
if(mysql_num_rows($res) && $mas[1]) {действие}
Но:
<?
//объявляем массив с одним элементом
$a = array(1);
//выводим сообщение в зависимости от условия
echo $a[1] ? 'Y' : 'N';
//естественно получаем
?>
Undefined offset: 1
|
$mas[1] не проверяет в вашем условии наличие такого элемента массива, а проверяет значение указанного элемента. Почему вы не зная сколько у вас элементов получилось так уверенно задаете условие? Гарантированно при разбиение получается только 1 элемент массива, а более ли, это нужно проверять. У вас может получится и 2, и 3, и более элементов, и в каком из них будет "кузов", и будет ли вообще, я понятия не имею. )
Да и вообще, живой поиск для меня, это как у Гугла, ровно так как я и писал выше, а ваше разделение на кузова, это только для вас понятно чего вы хотите. Если уж и говорить о раздельности, то это еще можно представить как "поиск в найденном", то есть конкретизация, пусть и по кузовам.
А иначе я не понимаю, так что в этом плане нет и комментариев. | |
|
|
|
|
|
|
|
для: confirm
(07.10.2013 в 19:41)
| | я не подумал о двух пробелах...
т.е. вы советуете не делать все одной конструкцей?
if(mysql_num_rows($res)>0 && $mas[1]!=false) | |
|
|
|
|
|
|
|
для: technic611
(07.10.2013 в 23:28)
| | Я не советую, я просто объяснил, что писать mysql_num_rows($res)>0 в условии смыла нет, ибо вы и хотите проверить на как минимум 1, то есть true. А прежде чем проверять значение элемента массива, нужно удостовериться существует ли он, то есть isset( $mas[1]) и имеет ли истинное значение, то есть:
<?
if(mysql_num_rows($res) && isset($mas[1]) && $mas[1]) {
//....
|
| |
|
|
|
|
|
|
|
для: confirm
(07.10.2013 в 23:40)
| | вот что получилось, посмотрите, прокомментируйте пожалуйста, может нужно что-то подкорректировать или улучшить
$mas=explode(" ",$query);
$array = array();
$key1="LIKE '%".$mas[0]."%'";
$key2=$key1;
for ($i=0; $i<count($mas); $i++)
{
$base= "SELECT substitute, avatar, keys_word FROM keys_words WHERE keys_word ".$key1."";
$res = mysql_query($base);
if(mysql_num_rows($res) && !$mas[$i+1])
{
break;
}
if(mysql_num_rows($res) && $mas[$i+1])
{
$key1 .=" AND keys_word LIKE'%".$mas[$i+1]."%'";
}else
{
for ($i=0; $i<count($mas); $i++)
{
$base= "SELECT substitute, avatar, keys_word FROM keys_words WHERE substitute ".$key2."";
$res = mysql_query($base);
if( mysql_num_rows($res)>0 && $mas[$i+1])
{
$array[0]=array('name'=>"ident");
$key2 .=" AND substitute LIKE'%".$mas[$i+1]."%'";
}
}
}
}
while($str = mysql_fetch_array($res))
{
$array[]= array('name'=>"$str[substitute]",'avatar'=>"$str[avatar]");
}
}
$str= json_encode($array);
echo($str);
|
| |
|
|
|
|
|
|
|
для: technic611
(11.10.2013 в 13:46)
| | Я временно сильно занят, а ваш код мало что без подсветки, но к тому же еще и не форматированный. Ну вы как-то задумывайтесь над тем удобно ли такой код читать?
Я просто начало глянул, как было авось, так так и осталось. Ну вы же не мусор искать собираетесь, а предустановленные ключи, и такой мусор как пробелы нужно удалять из элементов полученного массива:
<?
$arr = array_map('trim', explode(" ",$query));
|
Я вам уже вроде бы как говорил, что if($mas[1]), это истинно ли значение, но это не проверка есть ли этот элемент, вы упорно пишите это же самое - !$mas[$i+1], не проверяя есть ли элемент $i+1, проверяете его значение.
Если ваш массив нужен однократно, следовательно его можно при обработке и "грохнуть", это и память высвобождает и проще обойти массив можно будет. А проще, это использовать функцию arra_shit(), которая и проверяет наличие элемента (первого) и, если он существует возвращает его, и усекает массив на единицу. То есть обойти массив лучше так:
<?
while ($key = array_shift($arr)) {
//$key возвращенное значение элемента
}
|
А судя по обращение к одной и той же таблице, то лучше делать один запрос, а не гонять базу запросами в цикле. | |
|
|
|