/ / PHP - PDO wird mit einer Stringvariablen ausgeführt - php, pdo

PHP - PDO wird mit einer Stringvariablen ausgeführt - PHP, PDO

Ich verstehe nur nicht, warum das funktioniert:

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

und dies nicht (Ungültige Parameternummer: Anzahl gebundener Variablen stimmt nicht mit Anzahl Token überein):

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

Das hat mich verrückt gemacht!

Ich habe versucht, nach anderen ähnlichen Fragen zu suchen, aber ich kann keine finden.

BEARBEITEN: Ich versuche es so:

$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();

Es funktioniert, PDO ausführen, aber es stimmt nicht mit Werten in der Datenbank überein, aber es sollte. Ich weiß wirklich nicht warum ...

Antworten:

2 für die Antwort № 1

[$params] mit $params Als Zeichenfolge wird kein Array mit mehreren Schlüsseln erstellt, unabhängig davon, um welche Zeichenfolge es sich handelt. Es wird lediglich ein Array mit einem einzelnen numerisch getasteten Element erstellt, wobei der Wert dieses einen Elements der gesamte Wert ist $params Zeichenfolge.

Als solches übergeben Sie ein einzelnes Elementarray an ->execute(), was also bei einer Abfrage mit mehreren Parametern nicht funktioniert.

N.B. Selbst wenn Ihre Abfrage einen einzigen Parameter hätte, würden Sie immer noch den falschen Wert übergeben, weil anstelle von [":foo" => "bar"] (Schlüssel :foo, Wert :bar) Es würde vergehen ["":foo" => ":bar""] (Index 0, Wert ":foo" => ":bar").


1 für die Antwort № 2

weil

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

verwandelt sich in

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

Es ist nicht dasselbe wie

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

Sieh den Unterschied? Eine Zeichenfolge in eckigen Klammern verwandelt sich nicht in eine key => value Array. Es wird einfach zu einem einwertigen Array, wobei die Zeichenfolge Ihr einziger Wert ist.