Préparer des requetes Mysql / PDO dynamiquement avec str_pad ou array_pad

Requête PDO préparée avec marqueurs

En PHP pour faire une requête sql en utilisant PDO, il y a la possibilité de les préparer en utilisant des marqueurs (?) pour lesquels les valeurs réelles seront substituées lorsque la reqûete sera exécutée. Voilà un exemple très simple d’utilisation dans lequel il n’y a qu’une valeur.

<?php
try{
     $db = new PDO("dbtype:host=yourhost;dbname=yourdbname;charset=utf8","username","password");
    
     $values = array(20);
     $query=$db->prepare('SELECT * FROM table WHERE id = ?');
     $query->execute($values);

}catch(PDOException  $e ){
     echo "Error: ".$e;
}

Si par contre on souhaite faire la même requete avec un WHERE id IN (?, ?, …)
Le nombre de marqueurs (?) va dépendre du nombre de valeur à rechercher. Il sera donc intéressant et plus simple de générer ces marqueurs automatiquement avec soit un str_pad ou un array_pad. Voici les deux exemples de code qui permettent d’avoir autant de marqueurs que de valeurs à substituer lors du prepare.

implode(', ', array_pad(array(), count($values), '?'))

 

substr(str_pad('', 2*count($values), '?,'), 0, -1)

Dans cet exemple, on doit faire un 2* le nombre de valeurs car on insère un ? et une ,
Cf la note dans la doc de php.net :

Le paramètre pad_string peut être tronqué si le nombre de caractères de complétion n’est pas multiple de la taille de pad_string.

 

 

Exemple concret sur un SELECT :

$values = array(20, 30 ,40 ,50); 
$query=$db->prepare('SELECT * FROM table 
                         WHERE id IN ('. substr(str_pad('', 2*count($values), '?,'), 0, -1) .')'); 
$query->execute($values);

Exemple avec un INSERT INTO

$fields = array('id', 'name', 'address', 'phone_number');
$values = array(1, 'Smith' , '50 Street Marylbone' , '0000000000'); 

$query=$db->prepare('INSERT INTO table 
                     ('.implode(', ', $fields).')
                     VALUES ('.substr(str_pad('', 2*count($fields), '?,'), 0, -1).')'); 
$query->execute($values);