Supposons que j'ai un tableau:
$elements = array('foo', 'bar', 'tar', 'dar');
Ensuite, je souhaite créer une requête SQL DELETE IN
:
$SQL = "DELETE FROM elements
WHERE id IN ('" . implode(',', $elements) . "')";
Le problème est que les identifiants dans le tableau des éléments ne sont pas cités individuellement. La requête ressemble à:
$SQL = "DELETE FROM elements
WHERE id IN ('foo,bar,tar,dar');
Quelle est la meilleure façon, la plus élégante, de résoudre ce problème?
Ajoutez les guillemets à l'appel implode
: (je suppose que vous vouliez dire implode
)
$SQL = 'DELETE FROM elements
WHERE id IN ("' . implode('", "', $elements) . '")';
Cela produit:
DELETE FROM elements WHERE id IN ("foo", "bar", "tar", "dar")
Le meilleur moyen de prévenir l'injection SQL est de vous assurer que vos éléments sont correctement protégés.
Une chose facile à faire qui devrait fonctionner (mais je ne l’ai pas testé) est d’utiliser soit array_map
, soit array_walk
, et d’échapper tous les paramètres, comme ceci:
$elements = array();
$elements = array_map( 'mysql_real_escape_string', $elements);
Vous pouvez utiliser array_walk
pour itérer tous les éléments du tableau en passant la référence à l'élément et ajouter les guillemets de la manière suivante.
<?php
$arr = ['a','b','c'];
array_walk($arr, function(&$x) {$x = "'$x'";});
echo implode(',', $arr); // 'a','b','c'
?>
Pour ajouter un peu de réponse, même si vous utilisez MySQLi, il est possible d’appeler real_escape_string à l’aide de array_map à l’aide de la méthode object callable
form. Voici un exemple, en supposant que $conn
est votre connexion MySQLi:
$elements = array('foo', 'bar', 'tar', 'dar');
$cleanedElements = array_map([$conn, 'real_escape_string'], $ids);
$SQL = 'DELETE FROM elements WHERE id IN ("' . implode('", "', $elements) . '")';
Notez que le premier paramètre de array_map est un tableau avec l'objet suivi du nom de la méthode. Cela revient à exécuter ce qui suit pour chaque élément du tableau:
$newItem = $conn->real_escape_string($item);
Vous pouvez exécuter une simple fonction array_map () pour envelopper les chaînes entre guillemets, puis en entourant implode () pour ajouter les virgules:
$array = ["one", "two", "three", "four"];
implode(",", array_map(function($string) {
return '"' . $string . '"';
}, $array));