2012-02-24 3 views
8

Мне нужно выбрать элемент с массивом. $array_name содержит:Array in Mysql ГДЕ НРАВИТСЯ?

Array ([0] => gum.cn [1] => lol.com. [2] => ns1.blar.com [3] => test.com [4] => web.cn.) 

print_r ($ имя_массива);

$string = implode(',',$array_name); 


    $tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE '%{$string}%'"; 
    $result1 = mysql_query($tank); 
     while ($jwp = mysql_fetch_array($result1)) 
     {  
     echo $jwp['url']; 
     echo "<br>"; 
     } 

Почему не вышеуказанную работу? Я ищу другой пример, и вопрос спрашивает, не используя предложение LIKE, поэтому никакого решения нет. Пожалуйста, помогите, спасибо заранее.

+1

Хороший ответ на аналогичный вопрос здесь: http://stackoverflow.com/questions/1127088/mysql-like-in – lamplightdev

+0

@lamplightdev: REGEXP - хорошая альтернатива, но, к сожалению, здесь есть домены, содержащие символы '.', которые являются подстановочными знаками в регулярном выражении. Вы можете сбежать от них, но это слишком большая работа для такого тривиального вопроса ИМО. Хотя это можно рассматривать. – netcoder

ответ

30

Это не работает, потому что ваш запрос будет расширяться:

SELECT url FROM `PHP`.`db` WHERE url LIKE '%gum.cn,lol.com.,ns1.blar.com...%' 

Вы должны изменить свой запрос немного:

$query_parts = array(); 
foreach ($array_name as $val) { 
    $query_parts[] = "'%".mysql_real_escape_string($val)."%'"; 
} 

$string = implode(' OR url LIKE ', $query_parts); 

$tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE {$string}"; 
+0

Эй, большое спасибо. Это работает сейчас, но я не понимаю этого: '$ string = implode ('OR url LIKE', $ query_parts);' почему вам нужно удалить 'OR ORLL LIKE ', включая пробел? Надеюсь, вы сможете объяснить и поблагодарить за свое время. – sg552

+1

@ sg552: он не удаляет его, * он добавляет его *. Дамп запроса на экран, и вы, вероятно, поймете. – netcoder

+0

После всех этих времен я подумал, что 'implode()' предполагается удалить запятую или пробел из массива. Я получаю вывод как: '% gum.cn% 'ИЛИ url LIKE'% lol.com.% 'ИЛИ URL-адрес LIKE'% blar.com% 'ИЛИ URL-адрес LIKE'% test.com% 'OR url LIKE'% web .cn.% 'Если я правильно понимаю, что MySQL интерпретирует переменную' $ string' как длинную строку, и если у меня 1000 домен, то будет 1000 доменов, выполняемых в 1 запросе? Верный? Спасибо за ваше время. – sg552

0

Это не сработает, потому что он попытается сопоставить значение базы данных (например) 'gum.cn' с '% gum.cn, lol.com, .....%', которое никогда не будет будь настоящим.

Вместо этого:

foreach ($array_name as $string) { 
    $tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE '%{$string}%'"; 
    $result1 = mysql_query($tank); 
    echo $jwp['url']; 
    echo "<br>"; 
} 

Надежда, что помогает.

+1

Запуск запроса в цикле? Это не очень хорошая практика, и она не отвечает на вопрос OP :) – Sarfraz

+0

Вопрос OP состоял в том, чтобы объяснить, почему это не сработает, что я сделал в верхней части ответа. – ralfe

+1

Когда вы станете более опытным, вы поймете, что то, что я сказал сегодня (выполнение запроса внутри цикла), было правильным :) – Sarfraz

1

Поскольку он генерирует недопустимый SQL (Хорошо, технически обоснованными, он просто не собирается делать то, что, по вашему мнению, будет)

SELECT url FROM `PHP`.`db` WHERE url LIKE '%a,b,c,d,%' 

Вы либо собираетесь иметь t o добавить несколько операторов LIKE. Implode не будет работать для этой задачи, если вы не выполняете точный запрос соответствия строк. Даже тогда вам нужно будет настроить код.

+0

Это, безусловно, действительно SQL. – netcoder

+1

Действительный SQL, но не для того, что он пытается сделать. – JohnFx

0

Используйте предложение IN, но убедитесь, что значения указаны и спаслись:

//TODO: escape $array_name values 

$string = implode("','",$array_name); //ensure quoted values 

$tank = "SELECT url FROM `PHP`.`db` WHERE url IN ('$string')"; 
0

/** * Implode многомерного массива значений, группировка символов, когда разные с «[]» блоком. * @param массив $ массив Массив взрываться * @return струне интегрировалась массив */ функция hoArray2SqlLike ($ массив) { если (!is_array ($ array)) возвращает $ array;

$values = array(); 
$strings = array(); 

foreach ($array as $value) 
{ 
    foreach (str_split($value) as $key => $char) 
    { 
     if (! is_array($values[ $key ])) 
     { 
      if (isset($values[ $key ])) 
      { 
       if ($values[ $key ] != $char) 
       { 
        $values[ $key ]  = array($values[ $key ]); 
        $values[ $key ][] = $char; 
       } 
      } 
      else 
       $values[ $key ] = $char; 
     } 
     elseif (! array_search($char , $values[ $key ])) 
      $values[ $key ][] = $char; 
    } 
} 

foreach ($values as $value) 
{ 
    if (is_array($value)) 
     $value = '['.implode('', $value).']'; 

    $strings[] = $value; 
} 

return implode('', $strings); 

}

0

/* Данные в массиве */

$array_name = array("gum.cn","lol.com","ns1.blar.com","test.com","web.cn"); 

/* Регистрация массив элементов в строку с разделителем (пробельные) "" */

echo $string = implode(" ", $array_name); 
// output: gum.cn lol.com ns1.blar.com test.com web.cn 

/* заменить разделитель (пробел) "" на "%" ИЛИ "%" */

echo $string = str_replace(" ", "%' OR '%", $string); 
// output: gum.cn%' OR '%lol.com%' OR '%ns1.blar.com%' OR '%test.com%' OR '%web.cn 

/* Вставить в SQL-запрос */

$tank = "SELECT url FROM `PHP`.`db` WHERE url LIKE 

'% $ строка%'

«;