335 votes

PHP/MYSQL utilisant un tableau dans la clause WHERE

Étant donné un tableau

$galleries = array
         (
           [0] => 1
           [1] => 2
           [2] => 5
         )

Je veux avoir une requête sql qui utilise les valeurs du tableau dans sa clause WHERE comme :

SELECT *
FROM galleries
WHERE id = //values of array $galleries... eg. (1 || 2 || 5) //

Comment puis-je générer cette chaîne de requête à utiliser avec mysql ?

354voto

Flavius Stef Points 7400
$ids = join(',',$galleries);  
$sql = "SELECT * FROM galleries WHERE id IN ($ids)";

322voto

Levi Morrison Points 8141

Pour vérifier si une valeur de tableau existe dans un tableau, vous utilisez la fonction IN () clause.

Le code ci-dessous utilise des instructions préparées pour MySQLi ou PDO pour aider à atténuer les attaques par injection SQL. La vérification des erreurs est omise pour des raisons de brièveté ; vous devrez notamment vérifier si $ids a au moins un élément et les erreurs habituelles pour chaque méthode de base de données (ou configurez votre pilote de base de données pour qu'il lance des exceptions).

$in = join(',', array_fill(0, count($ids), '?'));

$select = <<<SQL
    SELECT *
    FROM galleries
    WHERE id IN ($in);
SQL;

// if using MySQLi (PHP 5.6):
$statement = $mysqli->prepare($select);
$statement->bind_param(str_repeat('i', count($ids)), ...$ids);
$statement->execute();
$result = $statement->get_result();

// if using PDO (or don't have PHP 5.6):
$statement = $pdo->prepare($select);
$statement->execute($ids);

Faire le IN() avec des chaînes de caractères.

Il est facile de passer des chaînes de caractères aux entiers grâce aux paramètres liés. Pour PDO, aucun changement n'est nécessaire ; pour MySQLi changement str_repeat('i', à str_repeat('s', si vous avez besoin de vérifier les chaînes de caractères.

60voto

user542568 Points 291

Ints :

$query = "SELECT * FROM `$table` WHERE `$column` IN(".implode(',',$array).")";

ficelles :

$query = "SELECT * FROM `$table` WHERE `$column` IN('".implode("','",$array)."')";

31voto

AvatarKava Points 6969

En supposant que vous désinfectiez correctement vos entrées avant...

$matches = implode(',', $galleries);

Il suffit alors d'ajuster votre requête :

SELECT *
FROM galleries
WHERE id IN ( $matches )

Citez les valeurs de manière appropriée en fonction de votre ensemble de données.

15voto

Matthew Flaschen Points 131723
select id from galleries where id in (1, 2, 5);

Une simple boucle pour chaque boucle fonctionnera.

EDIT : La voie de Flavius/AvatarKava est préférable, mais assurez-vous qu'aucune des valeurs du tableau ne contient de virgule.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X