/ / PHP - PDO s'exécute avec une variable chaîne - php, pdo

PHP - PDO exécuter avec une variable de chaîne - php, pdo

Je ne comprends pas pourquoi cela fonctionne:

 $stmt->execute([":id" => "*",":email" => "email@gmail.com",":password" => "123456789",]);

et cela non (Numéro de paramètre non valide: le nombre de variables liées ne correspond pas au nombre de jetons):

$params = "":id" => "*",":email" => "email@gmail.com",":password" => "123456789","
$stmt->execute([$params]);

Cela m'a rendu fou!

J’ai essayé de chercher d’autres questions similaires, mais je n’en ai trouvé aucune.

MODIFIER: J'essaie de cette façon:

$params = array("qualsiasi"=>"*", "email"=>"email@gmail.com", "password"=>"123456789");
$q = "SELECT :qualsiasi FROM utenti WHERE email = :email AND password = :password";
$stmt = $db->prepare($q);
foreach ($params as $key => $param){
$token = ":" . $key;
$stmt->bindParam($token , $param);
}
$stmt->execute();

Cela fonctionne, PDO s’exécute, mais il ne correspond pas aux valeurs de la base de données, mais il le devrait. Je ne sais vraiment pas pourquoi ...

Réponses:

2 pour la réponse № 1

[$params] avec $params être une chaîne ne crée pas un tableau avec plusieurs clés, quelle que soit la chaîne. Il crée simplement un tableau avec un seul élément numéroté, où la valeur de cet élément est la totalité $params chaîne.

En tant que tel, vous finissez par passer un tableau à élément unique à ->execute(), qui ne fonctionne donc pas pour une requête avec plusieurs paramètres.

N.B. que même si votre requête avait un seul paramètre, vous finissiez par passer la mauvaise valeur, car au lieu de [":foo" => "bar"] (clé :foo, valeur :bar) il "passait ["":foo" => ":bar""] (indice 0, valeur ":foo" => ":bar").


1 pour la réponse № 2

Car

$params = "":id" => "*",":email" => "email@gmail.com",":password" => "123456789","
$stmt->execute([$params]);

se transforme en

$stmt->execute(["":id" => "*",":email" => "email@gmail.com",":password" => "123456789","]);

Ce n'est pas pareil que

$stmt->execute([
":id" => "*",
":email" => "email@gmail.com",
":password" => "123456789",
]);

Regarde la différence? Une chaîne placée entre crochets ne se transforme pas en un key => value tableau. Il devient simplement un tableau à une valeur, la chaîne étant votre seule valeur.