我正在尝试使用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对象是在类的contruct函数中创建的;
public function __construct()
{
$user = "root";
$pass = "";
$this->dbh = new \PDO('mysql:host=localhost;dbname=projectname', $user, $pass);
}
$ stmt-> bindParam()在测试时返回true,但不替换给定的参数。
有谁知道我做错了什么?
答案 0 :(得分:3)
关于预准备语句的整个想法是,您不需要将原始参数注入查询,以使用转义数据组合某些SQL代码。相反,您使用简单的占位符并将数据保存在其他位置。当需要运行查询时,您需要为数据库引擎提供两个数据(带有占位符的SQL查询和与这些占位符相对应的值),数据库本身负责其余的数据。
所以:
注意:某些PDO驱动程序不允许使用常规预处理语句(例如,因为底层数据库引擎不完全支持它们)。在这种情况下,PDO将模拟准备好的语句并实际执行良好的旧转义。但是,由于PDO是一个抽象层,这不应该改变你处理它的方式。
答案 1 :(得分:0)
嗯,你有一个拼写错误(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();
}