我正在尝试使用 bindParam(( 编辑 INSERT 查询。
这是我的代码。
public function addProduct()
{
$query = "INSTERT INTO producten (name, model, price, image, description)
VALUES (:name, :model, :price, :image, :description)";
$stmt = $this->dbh->prepare($query);
$stmt->bindParam(":name", $_POST['name']);
$stmt->bindParam(":model", $_POST['model']);
$stmt->bindParam(":price", $_POST['price']);
$stmt->bindParam(":image", $_FILES['file']['name']);
$stmt->bindParam(":description", $_POST['description']);
print_r($stmt);
}
$dbh对象是在类的构造函数中创建的;
public function __construct()
{
$user = "root";
$pass = "";
$this->dbh = new 'PDO('mysql:host=localhost;dbname=projectname', $user, $pass);
}
$stmt->bindParam(( 在测试时返回 true,但不替换给定的参数。
有谁知道我做错了什么?
关于预准备语句的整个想法是,您无需将原始参数注入查询即可使用转义数据编写一些 SQL 代码。相反,您可以使用简单的占位符并将数据保存在其他位置。当需要运行查询时,向数据库引擎提供两个数据片段(带有占位符的 SQL 查询以及与这些占位符对应的值(,数据库本身负责其余部分。
所以:
- PDO 不会编辑您的查询。它不需要。
- 您仍然需要运行查询。"prepare"阶段只是将占位符与变量链接起来,因此可以在查询运行时从适当的位置读取值。
- 您实际上可以准备一次并使用不同的参数运行多次。
注意:某些 PDO 驱动程序不允许常规预准备语句(例如,因为底层数据库引擎不完全支持它们(。在这种情况下,PDO将模拟准备好的语句,并实际执行良好的旧转义。但是由于PDO是一个抽象层,这不应该改变你处理它的方式。
好吧,你有一个错别字(INSTERT
(。下次如何避免?
构造PDO对象时,请确保PDO::ATTR_ERRMODE
PDO::ERRMODE_EXCEPTION
,这将导致PDO在出错时抛出PDOException
。按如下方式操作:
$this->dbh = new 'PDO('mysql:host=localhost;dbname=projectname', $user, $pass, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));
或使用PDO::setAttribute()
:
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
这样做会导致PDO(和PDOStatement(在错误时抛出PDOException。如果不处理,它将终止脚本,并且可以通过以下方式处理:
try {
$this->addProduct();
}
catch (PDOException $e) {
echo $e->getMessage();
}