web-dev-qa-db-ja.com

準備済みステートメントによるINSERT INTOを使用したPDO

PHPのジャングルでの冒険:データオブジェクト準備されたステートメントを介してMySQLクエリを実行する際に問題が発生しました。

次のコードを確認してください。

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

これは私であり、データベースに登録したいです。しかし、私は迷子になり続けます。グーグルによると、これはそれを行う方法ですが、私のデータベースは空のままです。

ここに何かが足りませんか?私は今、かなりの時間立ち往生しており、PDOの勉強を続けたいと思っているからです!

37
Bob Desaunois

あなたはそれをそのように使用する必要があります

<?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',
]);

準備されたステートメントは入力をサニタイズするために使用され、それを行うには:foowithout SQL内の任意の単一引用符をbind変数に使用してから、 SQLステートメントで定義した変数の連想配列で渡すexecute()関数。

?の代わりに:fooを使用し、そのような入力に値だけの配列を渡すこともできます。

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

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

どちらの方法にも長所と短所があります。個人的には読みやすいので、パラメーター名をバインドすることを好みます。

92
Novocaine

コードを次のように書き直しました。

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

そして、今ではうまくいくようです。しかし。私が意図的にエラーを発生させた場合、エラーがあるとは言いません。コードは機能しますが、それでも機能します。さらにエラーが発生した場合、その理由はわかりません。

3
Bob Desaunois