通过准备好的声明INSO INTO的PDO

Bob*_*ois 37 php mysql sql 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();
Run Code Online (Sandbox Code Playgroud)

这是我,我想要在我的数据库中.但是我一直迷路......好吧......我不知道!根据谷歌这是这样做的方式,虽然我的数据库保持空白.

我在这里错过了什么吗?因为我现在已经被困了一个小时,想继续学习PDO!

Nov*_*ine 92

你应该像这样使用它

<?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',
]);
Run Code Online (Sandbox Code Playgroud)

准备好的语句用于净化你的投入,要做到这一点,你可以使用:foo 没有在SQL中的任何单引号绑定变量,然后在execute()功能,你在你的SQL语句中定义的变量的关联数组传递.

您也可以使用?代替,:foo然后传入一个只有值的数组来输入,就像这样;

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

$statement->execute(['Bob', 'Desaunois', '18']);
Run Code Online (Sandbox Code Playgroud)

两种方式各有利弊.我个人更喜欢绑定参数名称,因为它更容易让我阅读.

  • 尝试添加`$ link-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);`直接在`$ link = new PDO ...`行之后 (3认同)
  • @vlasits很可惜,但那个页面是一个完整的废话.[PHP中没有这样的"默认操作"](https://phpdelusions.net/pdo#reporting_errors). (3认同)

Bob*_*ois 5

我刚刚将代码重写为以下内容:

    $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));
Run Code Online (Sandbox Code Playgroud)

现在似乎有效了。但。如果我故意导致错误发生,它不会说有任何错误。该代码可以工作,但仍然;如果我遇到更多错误,我将不知道为什么。