2010-05-18 19 views
5

Quindi sto provando a prendere una stringa di ricerca (potrebbe essere un numero qualsiasi di parole) e trasformare ogni valore in una lista da usare nella seguente istruzione IN) inoltre, io bisogno di un conteggio di tutti questi valori da utilizzare con il mio conteggio filtroCome posso usare una matrice all'interno di una query 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"; 

Attualmente non restituisce risultati, idee?

Soluzione:

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

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

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

} 

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

Questo mi dà un elenco separato da virgole

risposta

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

perché in accetta un elenco separato da virgole di valori. (Ma è necessario per garantire prodotti sono riportati i contenuti di $ search_array, se sono parole.)

Farlo in un solo passo potrebbe essere simile a questo:

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

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

È possibile ottenere lo stesso con ' "'". implode ("','", $ search_array). "'", anche se forse non è elegante come la tua soluzione :-) –

+0

Oh bello, non ci avevo nemmeno pensato! –

+0

Soluzione piacevole, ma si noti che questo non funzionerà come previsto in PHP prima di 5.3, poiché array_reduce() accetta solo un numero intero come terzo parametro in 5.2 e precedenti. Di conseguenza, la stringa sarà come "0", "uno", "due", ... " –

0

Usa

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

$ search_array è un array che si concatena direttamente in una stringa. Devi trasformarlo in una stringa prima di farlo.

Inoltre, perché non stai facendo eco alla tua istruzione sql per vedere che ti stai effettivamente nutrendo di MySQL?

+1

per favore 'mysqli_real_escape_string' prima i valori nell'array – knittl

+0

Non ho aggiunto alcuna protezione per l'iniezione prima, semplicemente facendo funzionare la query di base. – ThinkingInBits

0

IN prevede un elenco di valori separati da virgole (indicati se sono stringhe). Cosa contiene il valore di $ this-> search_string? E farla esplodere in un array NON funzionerà ... prova a echeggiare la tua query $ per vedere esattamente cosa ottieni.

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

Io non sono uno sviluppatore PHP così mi scusi se mi manca qualcosa, ma i valori di matrice dovrebbe essere sparated da virgole e tra apici:

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

È necessario innanzitutto creare una stringa da questo array:

// 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

Non si compilano le istruzioni IN nell'impianto HT modo, si hanno due scelte, o passa la stringa di ricerca separati da virgole, o fai da te, come in:

$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); 
Problemi correlati