44

在我穿越 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!

4

4 回答 4

101

你应该像这样使用它

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

准备好的语句用于清理您的输入,为此您可以在 SQL 中不使用:foo 任何单引号来绑定变量,然后在execute()函数中传入您在 SQL 语句中定义的变量的关联数组。

您也可以使用?代替,:foo然后传入一个仅包含要输入的值的数组,如下所示;

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

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

两种方式都有其优点和缺点。我个人更喜欢绑定参数名称,因为它更容易阅读。

于 2013-09-06T10:37:46.193 回答
4

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

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

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

于 2013-09-06T10:58:18.717 回答
-1

请在您的代码中也添加 try catch,以便您可以确保没有异常。

try {
    $hostname = "servername";
    $dbname = "dbname";
    $username = "username";
    $pw = "password";
    $pdo = new PDO ("mssql:host=$hostname;dbname=$dbname","$username","$pw");
  } catch (PDOException $e) {
    echo "Failed to get DB handle: " . $e->getMessage() . "\n";
    exit;
  }
于 2013-09-06T10:45:58.357 回答
-2

感谢 Novocaine88 对使用 try catch 循环的回答,我在导致错误消息时成功收到了一条错误消息。

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

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

        $statement->execute(array("Bob","Desaunois",18));
    } catch(PDOException $e) {
        echo $e->getMessage();
    }
    ?>

在下面的代码中,它不是 INSERT INTO,而是 INERT。

这是我得到的错误。

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的 'INERT INTO testtable(name, lastname, age) VALUES('Bob','Desaunoi' 附近使用正确的语法

当我“解决”问题时,它会正常工作。非常感谢大家!

于 2013-09-06T11:01:44.420 回答