2012-02-24 16 views
8

Necesito SELECCIONAR con la lista de arreglos. $array_name contiene:Matriz en Mysql ¿DONDE ME GUSTA?

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>"; 
     } 

Por qué no hacer el trabajo anterior? Busco otro ejemplo y la pregunta es preguntar sin usar la cláusula LIKE, así que no hay solución allí. Por favor ayuda, gracias de antemano.

+1

Buena respuesta a una pregunta similar aquí: http://stackoverflow.com/questions/1127088/mysql-like-in – lamplightdev

+0

@lamplightdev: REGEXP es una buena alternativa, pero desafortunadamente aquí, son dominios que contienen caracteres '.', que son comodines en expresiones regulares. Puedes escapar de ellos, pero es demasiado trabajo para una materia tan trivial IMO. Aunque puede ser considerado. – netcoder

Respuesta

30

no funciona debido a que su consulta se extenderá a:

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

Tiene que modificar la consulta un poco:

$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

Hola, muchas gracias. Ya funciona, pero no entiendo esto, '$ string = implode ('OR url LIKE', $ query_parts);' por qué necesita eliminar '' OR ur LI LIKE '' incluido el espacio en blanco? Espero que puedas explicar y gracias por tu tiempo. – sg552

+1

@ sg552: No lo elimina, * lo agrega *. Vuelca la consulta a la pantalla y probablemente lo entiendas. – netcoder

+0

Después de todo este tiempo, pensé que 'implode()' suponía que estaba eliminando la coma o el espacio en blanco de la matriz. Obtengo el resultado como: '% gum.cn% 'O URL LIKE'% lol.com.% 'O URL LIKE'% blar.com% 'O URL LIKE'% test.com% 'O URL LIKE'% web .cn.% 'Si lo entiendo correctamente MySQL interpreta la variable' $ string' como una cadena larga y si tengo 1000 dominios, ¿habrá 1000 dominios ejecutados en 1 consulta? ¿Correcto? Gracias por tu tiempo. – sg552

0

No funcionará porque intentará hacer coincidir el valor de la base de datos de (por ejemplo) 'gum.cn' con '% gum.cn, lol.com, .....%', que nunca ser cierto.

prefiere hacer esto:

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

Espero que ayude.

+1

¿Ejecutando la consulta en un bucle? Esa no es una buena práctica y tampoco responde la pregunta de OP :) – Sarfraz

+0

La pregunta de OP fue explicar por qué no funcionará, lo cual hice al principio de la respuesta. – ralfe

+1

Cuando tenga más experiencia, sabrá que lo que dije hoy (ejecutar la consulta dentro del ciclo) era correcto :) – Sarfraz

1

porque genera SQL no válido (Bueno, técnicamente válida, simplemente no va a hacer lo que usted cree que va a hacer)

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

Usted va a tener t o añada múltiples declaraciones LIKE. Implode no funcionará para esta tarea a menos que esté haciendo una consulta exacta de concordancia de cadena. Incluso entonces necesitarías modificar el código.

+0

Eso es SQL perfectamente válido por cierto. – netcoder

+1

SQL válido, pero no por lo que está tratando de hacer. – JohnFx

0

utilizar la cláusula IN, pero asegurar que los valores están expresados ​​y escaparon:

//TODO: escape $array_name values 

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

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

/** * Implode una matriz multidimensional de valores, la agrupación de caracteres cuando diferente con el bloque "[]". * @param array $ array Matriz de implosionar * @return string La matriz implosión */ función hoArray2SqlLike ($ array) { if (!is_array ($ array)) return $ 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

/* Datos de arreglo */

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

/* Une elementos de matriz en una cadena con separador (espacio en blanco) "" */

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

/* replace separator (whitespace) "" con "%" OR "%" */

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

/* Introducir en consulta SQL */

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

'% $% serie'

";