web-dev-qa-db-fra.com

AOP avec INSERT INTO via des déclarations préparées

Dans mon aventure dans la jungle de PHP: Data Objects, j'ai rencontré un problème lors de l'exécution de requêtes MySQL via des instructions préparées.

Observez le code suivant:

$dbhost = "localhost";
$dbname = "pdo";
$dbusername = "root";
$dbpassword = "845625";

$link = new PDO("mysql:Host=$dbhost;dbname=$dbname","$dbusername","$dbpassword");

$statement = $link->prepare("INSERT INTO testtable(name, lastname, age)
        VALUES('Bob','Desaunois','18')");

    $statement->execute();

Ceci est moi, et je veux être dans ma base de données. Cependant, je continue à me perdre dans… bien… je ne sais pas! Selon Google, c'est le moyen de le faire, même si ma base de données reste vide.

Est-ce que j'ai râté quelque chose? Parce que cela fait une bonne heure que je suis coincé et que je voudrais continuer à étudier le PDO!

37
Bob Desaunois

Vous devriez l'utiliser comme si

<?php
$dbhost = 'localhost';
$dbname = 'pdo';
$dbusername = 'root';
$dbpassword = '845625';

$link = new PDO("mysql:Host=$dbhost;dbname=$dbname", $dbusername, $dbpassword);

$statement = $link->prepare('INSERT INTO testtable (name, lastname, age)
    VALUES (:fname, :sname, :age)');

$statement->execute([
    'fname' => 'Bob',
    'sname' => 'Desaunois',
    'age' => '18',
]);

Les instructions préparées sont utilisées pour assainir votre entrée. Pour ce faire, vous pouvez utiliser :foosans toutes les guillemets simples dans les variables SQL to bind, puis dans la fonction execute() vous transmettez un tableau associatif des variables que vous avez définies dans l'instruction SQL.

Vous pouvez également utiliser ? Au lieu de :foo, Puis transmettre un tableau contenant uniquement les valeurs à saisir, comme ceci;

$statement = $link->prepare('INSERT INTO testtable (name, lastname, age)
    VALUES (?, ?, ?)');

$statement->execute(['Bob', 'Desaunois', '18']);

Les deux manières ont leurs avantages et inconvénients. Personnellement, je préfère lier les noms de paramètres car il m'est plus facile de les lire.

92
Novocaine

Je viens de réécrire le code comme suit:

    $dbhost = "localhost";
    $dbname = "pdo";
    $dbusername = "root";
    $dbpassword = "845625";

    $link = new PDO("mysql:Host=$dbhost;dbname=$dbname", $dbusername, $dbpassword);
    $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $statement = $link->prepare("INSERT INTO testtable(name, lastname, age)
        VALUES(?,?,?)");

    $statement->execute(array("Bob","Desaunois",18));

Et cela semble fonctionner maintenant. MAIS. si je fais exprès une erreur, cela ne veut pas dire qu'il y en a. Le code fonctionne, mais quand même; devrais-je rencontrer plus d'erreurs, je ne saurai pas pourquoi.

3
Bob Desaunois