web-dev-qa-db-fra.com

PHP Imploser mais envelopper chaque élément dans des citations

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?

51
Justin

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);
103
nickb

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'

?>
3
insign

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);
0
techdude

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));
0
ssharp_wp