关于我在PHP丛林中的冒险:Data Objects我遇到了通过预处理语句执行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!
答案 0 :(得分:91)
你应该像这样使用它
<?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',
]);
预备语句用于清理您的输入,为此,您可以使用:foo
而不 SQL中的任何单引号绑定变量,以及然后在execute()
函数中传递您在SQL语句中定义的变量的关联数组。
您也可以使用?
代替:foo
,然后传入一个仅包含值的数组,就像这样输入;
$statement = $link->prepare('INSERT INTO testtable (name, lastname, age)
VALUES (?, ?, ?)');
$statement->execute(['Bob', 'Desaunois', '18']);
两种方式各有利弊。我个人更喜欢绑定参数名称,因为它更容易让我阅读。
答案 1 :(得分:3)
我刚刚将代码重写为以下内容:
$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));
现在似乎工作了。 但。如果我故意导致错误发生,它不会说有任何错误。 代码有效,但仍然存在;如果我遇到更多错误,我不知道为什么。
答案 2 :(得分:-2)
请在您的代码中添加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;
}
答案 3 :(得分:-3)
感谢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服务器版本对应的手册,以便在'INERT INTO testtable(名称,姓氏,年龄)VALUES附近使用正确的语法('Bob','Desaunoi'在第1行
当我“解决”问题时,它可以正常工作。 非常感谢大家!