2012-05-08 17 views
48

Si supponga che ho un array:PHP Implode Ma avvolgere ogni elemento tra virgolette

$elements = array('foo', 'bar', 'tar', 'dar'); 

Poi voglio costruire una query DELETE IN SQL:

$SQL = "DELETE FROM elements 
       WHERE id IN ('" . implode(',', $elements) . "')"; 

Il problema è che gli ID del gli array di elementi non sono quotati singolarmente. I.E la domanda è la seguente:

$SQL = "DELETE FROM elements 
       WHERE id IN ('foo,bar,tar,dar'); 

Qual è il modo migliore e più elegante per risolvere questo problema?

+0

State molto attenti ... sei probabilmente aperto a qualche seria iniezione SQL. – Brad

+0

Qual è il modo migliore per prevenire l'iniezione SQL con la soluzione fornita da 'nickb' allora? Grazie. – Justin

risposta

93

Aggiungere le citazioni nella chiamata implode: (sto assumendo che volevi dire implode)

$SQL = 'DELETE FROM elements 
      WHERE id IN ("' . implode('", "', $elements) . '")'; 

Questo produce:

DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar") 

Il modo migliore per evitare contro SQL injection è quello di assicurarsi i tuoi elementi sono debitamente fuoriusciti.

una cosa facile da fare che dovrebbe funzionare (ma non l'ho provato) è quello di utilizzare uno o array_maparray_walk, e sfuggire tutti i parametri, in questo modo:

$elements = array(); 
$elements = array_map('mysql_real_escape_string', $elements); 
+0

Perfetto, quindi qual è il modo migliore per prevenire l'SQL injection come suggerito da Brad con questa soluzione? – Justin

+1

@Jusin Ho modificato la mia risposta con un suggerimento sulla prevenzione dell'iniezione SQL. – nickb

+3

@Justin Il modo migliore è usare le dichiarazioni preparate http://php.net/manual/en/pdo.prepared-statements.php http://php.net/manual/en/mysqli.prepare.php – Petah

0

È possibile utilizzare array_walk per iterare tutti gli elementi nel lato dell'array che passano il riferimento all'elemento e aggiungono le virgolette nel modo seguente.

<?php 

$arr = ['a','b','c']; 

array_walk($arr, function(&$x) {$x = "'$x'";}); 

echo implode(',', $arr); // 'a','b','c' 

?> 
+0

Si prega di aggiungere chiarimenti sul motivo per cui questa è una risposta. Può sembrare banale per te, ma dal momento che non aggiungi alcuna spiegazione il tuo suggerimento è aperto all'interpretazione sul suo utilizzo. – Glubus

0

È possibile eseguire una semplice funzione array_map() per avvolgere le stringhe tra virgolette e poi avvolgere che intorno alla implode() per aggiungere le virgole:

$array = ["one", "two", "three", "four"]; 

implode(",", array_map(function($string) { 
    return '"' . $string . '"'; 
}, $array));