1

我正在尝试使用 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,但不会替换给定的参数。

有谁知道我做错了什么?

4

2 回答 2

3

关于准备好的语句的整个想法是,您不需要将原始参数注入查询中来组合一些带有转义数据的 SQL 代码。相反,您使用简单的占位符并将数据保存在其他地方。当需要运行查询时,您向数据库引擎提供两条数据(带有占位符的 SQL 查询以及与这些占位符对应的值),其余的由数据库自己处理。

所以:

  1. PDO 不会编辑您的查询。它不需要。
  2. 您仍然需要运行查询。“准备”阶段只是将占位符与变量链接起来,因此可以在查询运行时从适当的位置读取该值。
  3. 您实际上可以使用不同的参数准备一次并运行多次。

注意:一些 PDO 驱动程序不允许常规的预处理语句(例如,因为底层数据库引擎不完全支持它们)。在这种情况下,PDO 将模拟准备好的语句并实际执行良好的旧转义。但是由于 PDO 是一个抽象层,所以这不应该改变您处理它的方式。

于 2012-05-04T16:03:27.700 回答
0

好吧,你有一个错字(INSTERT)。下次如何避免?

在构造 PDO 对象时,请确保PDO::ATTR_ERRMODEis PDO::ERRMODE_EXCEPTION,这将导致 PDOPDOException在错误时抛出 s。执行以下操作:

$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();
}
于 2012-05-04T16:05:14.803 回答