Мне нужно выбрать SELECT с массивом. $array_name
содержит:
Array ( [0] => gum.cn [1] => lol.com. [2] => ns1.blar.com [3] => test.com [4] => web.cn. )
print_r ($ array_name);
$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
, поэтому никакого решения нет. Пожалуйста, помогите, спасибо заранее.
Это не работает, потому что ваш запрос будет расширяться до:
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}";
Поскольку он генерирует недопустимый SQL (хорошо, технически корректно, он просто не собирается делать то, что, по вашему мнению, будет)
SELECT url FROM `PHP`.`db` WHERE url LIKE '%a,b,c,d,%'
Вам придется либо добавить несколько инструкций LIKE. Implode не будет работать для этой задачи, если вы не выполняете точный запрос соответствия строк. Даже тогда вам нужно будет настроить код.
Он не будет работать, потому что он попытается сопоставить значение базы данных (например) «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>"; }
Надеюсь, это поможет.
Используйте предложение IN, но убедитесь, что значения указаны и экранированы:
//TODO: escape $array_name values $string = implode("','",$array_name); //ensure quoted values $tank = "SELECT url FROM `PHP`.`db` WHERE url IN ('$string')";
/ ** * Импланировать многомерный массив значений, группируя символы, когда они отличаются от блока "[]". * @param array $ array Массив для implode * @return string Вмещенный массив * / function hoArray2SqlLike ($ array) {if (! 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 );
}
/ * Данные в массиве * /
$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
'% $ Строка%'
«;