2012-05-08 14 views
48

Supongamos que tengo una matriz:PHP Implode Pero envolver cada en el elemento Cotizaciones

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

Entonces quiero construir una consulta DELETE IN SQL:

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

El problema es que los ID de la Los elementos de la matriz no se citan individualmente. I.E la consulta se ve así:

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

¿Cuál es la mejor y más elegante forma de solucionar esto?

+0

Tenga mucho cuidado ... eres Probablemente abierto a alguna inyección SQL seria. – Brad

+0

¿Cuál es la mejor manera de prevenir contra la inyección de SQL con la solución provista por 'nickb '? Gracias. – Justin

Respuesta

93

Añadir las cotizaciones a la llamada implode: (estoy asumiendo que quería decir implode)

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

Esto produce:

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

La mejor manera de prevenir contra la inyección de SQL es asegurarse tus elementos están escapados correctamente

Una cosa fácil de hacer eso debería funcionar (pero yo no lo he probado) es el uso de cualquiera o array_maparray_walk, y escapar todos los parámetros, así:

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

Perfecto, entonces, ¿cuál es la mejor manera de prevenir contra la inyección SQL como sugirió Brad con esta solución? – Justin

+1

@Jusin He editado mi respuesta con una sugerencia para evitar la inyección de SQL. – nickb

+3

@Justin La mejor manera es usar declaraciones preparadas http://php.net/manual/en/pdo.prepared-statements.php http://php.net/manual/en/mysqli.prepare.php – Petah

0

Se puede utilizar para iterar array_walk todos los elementos al costado de la matriz pasan la referencia al elemento y agregan las comillas de la siguiente manera.

<?php 

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

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

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

?> 
+0

Agregue una aclaración sobre por qué esto es una respuesta. Puede parecerle trivial, pero como no agrega ninguna explicación, su sugerencia está sujeta a interpretación sobre su uso. – Glubus

0

Puede ejecutar una función sencilla array_map() para envolver las cadenas entre comillas y luego envolver alrededor de la que implosionan() para agregar las comas:

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

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