2010-05-18 33 views
5

? Estoy tratando de tomar una cadena de búsqueda (podría ser cualquier número de palabras) y convertir cada valor en una lista para usar en la siguiente declaración IN), además, necesito un recuento de todos estos valores para usar con mi contar filtro¿Cómo puedo usar una matriz dentro de una consulta SQL

$search_array = explode(" ",$this->search_string); 
$tag_count = count($search_array); 

$db = Connect::connect(); 
$query = "select p.id 
      from photographs p 
      left join photograph_tags c 
      on p.id = c.photograph_id 
      and c.value IN ($search_array) 
      group by p.id 
      having count(c.value) >= $tag_count"; 

¿Actualmente esto no arroja resultados, alguna idea?

Solución:

$search_array = explode(" ",$this->search_string); 

foreach ($search_array as $key => $value) { 

    $new_search_array[] = "'$value'"; 

} 

$search_string = implode(',', $new_search_array); 

Esto me da una lista separada por comas

Respuesta

6
$search_array = implode(",", $search_array); 

porque en toma una lista separada por comas de los valores. (Sin embargo, es necesario asegurarse se citan $ contenidos de search_array, si son palabras.)

Hacerlo en un solo paso podría tener este aspecto:

function quoteAndComma($result, $each) { 
    return $result . ', "'.$each.'"'; 
} 

$search_array = array_reduce($search_array, "quoteAndComma", ''); 
+0

Usted puede lograr lo mismo con ' "'". implode ("','", $ search_array). "'" ', aunque tal vez no sea tan elegante como tu solución :-) –

+0

¡Qué bien, ni siquiera había pensado en eso! –

+0

Buena solución, pero tenga en cuenta que esto no funcionará como se esperaba en PHP antes de 5.3, porque array_reduce() acepta solo un entero como un tercer parámetro en 5.2 y anteriores. Como resultado, la cadena será como '0', uno '', '' dos '', ... '' –

0

Uso

and c.value IN (implode(', ', $search_array)) 

$ search_array es una matriz que concatena directamente en una cadena. Debes convertirlo en una cadena antes de hacer eso.

Además, ¿por qué no hace eco de su instrucción sql para ver que realmente está alimentando a MySQL?

+1

por favor 'mysqli_real_escape_string' los valores en la matriz primero – knittl

+0

No he agregado ninguna protección de inyección primero, solo haciendo funcionar la consulta básica. – ThinkingInBits

0

IN espera una lista de valores separados por comas, (se citan si son cadenas). ¿Qué contiene tu valor de $ this-> search_string? Y explotarlo en una matriz NO funcionará ... intente hacer eco de su $ consulta para ver exactamente lo que obtiene.

0

...

$search_array = explode(" ",$this->search_string); 
$search = implode(",", $search_array); 
$tag_count = count($search_array); 

$db = Connect::connect(); 
$query = "select p.id 
      from photographs p 
      left join photograph_tags c 
      on p.id = c.photograph_id 
      and c.value IN ($search) 
      group by p.id 
      having count(c.value) >= $tag_count"; 
0

No soy un desarrollador de PHP así que discúlpame si me olvido de algo, pero los valores de la matriz debería estar sparated por comas y comillas simples:

WHERE c.value IN ('a','b','c') 
4

Primero debe construir una cadena de este conjunto:

// Don't forget to escape the data! 
$search_array = array_map('mysql_real_escape_string', $search_array); 

// Convert array to a string like "'one', 'two', ..." 
$search_values = "'" . implode("', '", $search_array) . "'"; 

// Build a query 
$query = "select ... c.value IN ($search_values) ..." 
0

No está rellenando su instrucción IN en el equipo ht manera, usted tiene dos opciones: o bien pasar la cadena de búsqueda separados por comas, o hágalo usted mismo, como en:

$search_array = explode(" ", $this->search_string); 

for ($i = 0; $i < count($search_array); $i++) 
{ 
    $search_array[$i] = "'" . $search_array[$i] . "'"; 
} 

$list = implode(",", $search_array); 

$tag_count = count($search_array); 

$db = Connect::connect(); 
$query = "select p.id 
      from photographs p 
      left join photograph_tags c 
      on p.id = c.photograph_id 
      and c.value IN ($list) 
      group by p.id 
      having count(c.value) >= $tag_count"; 
0
$search_array = explode(" ",$this->search_string); 

    foreach ($search_array as $key => $value) { 

     $new_search_array[] = "'$value'"; 

    } 

    $search_string = implode(',', $new_search_array); 
Cuestiones relacionadas