Maison > développement back-end > tutoriel php > Comment gérer des listes de paramètres de taille dynamique dans les instructions préparées MySQL ?

Comment gérer des listes de paramètres de taille dynamique dans les instructions préparées MySQL ?

DDD
Libérer: 2024-12-03 03:14:09
original
463 Les gens l'ont consulté

How to Handle Dynamically Sized Parameter Lists in MySQL Prepared Statements?

Listes de paramètres de taille dynamique dans les instructions préparées MySQL

Lors de la construction d'instructions préparées MySQL en PHP, la question de savoir comment gérer les requêtes avec un nombre variable d'arguments se pose. Par exemple, considérons une requête comme celle-ci :

SELECT `age`, `name` FROM `people` WHERE id IN (12, 45, 65, 33)
Copier après la connexion

Le nombre d'ID dans la clause IN varie à chaque exécution.

Solutions possibles

Différentes approches existent pour résoudre ce défi :

  1. Solution 1 : Variables factices et multiples Appels

    • Créez une instruction qui accepte un nombre fixe de variables (par exemple 100) et remplissez les emplacements inutilisés avec des valeurs factices.
    • Exécutez plusieurs appels pour des ensembles plus grands.
  2. Solution 2 : Non préparé Requête

    • Créez la requête de manière dynamique et exécutez-la, garantissant une protection stricte contre les attaques par injection.

Solution optimale

Cependant, d'autres options offrent une meilleure efficacité :

  1. Temporaire Approche de table

    • Créez une table temporaire et insérez-y chaque valeur de paramètre.
    • Effectuez une simple jointure sur la table temporaire.
  2. ENTRÉE dynamique Clause

    • Construisez la requête dynamiquement avec un espace réservé pour la clause IN à l'aide des fonctions d'implosion et de pré-remplissage de tableau.
    • Par exemple :

      $dbh = new PDO(...);
      $parms = [12, 45, 65, 33];
      $inclause = implode(',', array_fill(0, count($parms), '?')); // = ?,?,?,?
      $preparesql = sprintf('SELECT age, name FROM people WHERE id IN (%s)', $inclause);
      $st = $dbh->prepare($preparesql);
      $st->execute($parms);
      Copier après la connexion

La première approche peut être plus efficace pour les grands ensembles, tandis que la seconde est adaptée pour les plus petits.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal