Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Живой поиск
 
 автор: technic611   (27.09.2013 в 22:48)   письмо автору
 
 

Вообщем нужно как-то отделить друг от друга три варианта запроса. Попробую объяснить.
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 там может быть что-то другое, это как пример

  Ответить  
 
 автор: OLi   (30.09.2013 в 20:30)   письмо автору
 
   для: technic611   (27.09.2013 в 22:48)
 

Разбивайте строку по пробелу в массив, а потом для каждой позиции в массив определите правило like

  Ответить  
 
 автор: technic611   (03.10.2013 в 21:07)   письмо автору
 
   для: 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 есть.

  Ответить  
 
 автор: psychomc   (03.10.2013 в 22:32)   письмо автору
 
   для: technic611   (03.10.2013 в 21:07)
 

всё что вам нужно сделать, это в зависимости от количества слов правильно расставить символы % в конструкции LIKE. ну и слова объединять тоже похоже придется

  Ответить  
 
 автор: technic611   (03.10.2013 в 23:40)   письмо автору
 
   для: psychomc   (03.10.2013 в 22:32)
 

не могли бы примерчик накидать? а то пока не очень ясно

  Ответить  
 
 автор: confirm   (04.10.2013 в 04:15)   письмо автору
 
   для: 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>


Это разве не "живой поиск"? Единственно что нужно добавить, это на клиенте минимальную длину значения для запроса, например по самому короткому наименованию фирмы. Ну чтобы не искать по одному символу.

  Ответить  
 
 автор: technic611   (07.10.2013 в 14:18)   письмо автору
 
   для: 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];
}

  Ответить  
 
 автор: confirm   (07.10.2013 в 19:41)   письмо автору
 
   для: 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, и более элементов, и в каком из них будет "кузов", и будет ли вообще, я понятия не имею. )
Да и вообще, живой поиск для меня, это как у Гугла, ровно так как я и писал выше, а ваше разделение на кузова, это только для вас понятно чего вы хотите. Если уж и говорить о раздельности, то это еще можно представить как "поиск в найденном", то есть конкретизация, пусть и по кузовам.
А иначе я не понимаю, так что в этом плане нет и комментариев.

  Ответить  
 
 автор: technic611   (07.10.2013 в 23:28)   письмо автору
 
   для: confirm   (07.10.2013 в 19:41)
 

я не подумал о двух пробелах...
т.е. вы советуете не делать все одной конструкцей?
if(mysql_num_rows($res)>0 && $mas[1]!=false)

  Ответить  
 
 автор: confirm   (07.10.2013 в 23:40)   письмо автору
 
   для: 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]) {
    
//....

  Ответить  
 
 автор: technic611   (11.10.2013 в 13:46)   письмо автору
 
   для: 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);

  Ответить  
 
 автор: confirm   (11.10.2013 в 17:15)   письмо автору
 
   для: 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 возвращенное значение элемента
}


А судя по обращение к одной и той же таблице, то лучше делать один запрос, а не гонять базу запросами в цикле.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования