PDO类bindParam()不起作用

时间:2012-05-04 15:44:41

标签: php

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

有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:3)

关于预准备语句的整个想法是,您不需要将原始参数注入查询,以使用转义数据组合某些SQL代码。相反,您使用简单的占位符并将数据保存在其他位置。当需要运行查询时,您需要为数据库引擎提供两个数据(带有占位符的SQL查询和与这些占位符相对应的值),数据库本身负责其余的数据。

所以:

  1. PDO不会编辑您的查询。它不需要。
  2. 您仍然需要运行查询。 “准备”阶段只是将占位符与变量链接起来,因此在查询运行时可以从适当的位置读取值。
  3. 您实际上可以准备一次,并使用不同的参数运行多次。
  4. 注意:某些PDO驱动程序不允许使用常规预处理语句(例如,因为底层数据库引擎不完全支持它们)。在这种情况下,PDO将模拟准备好的语句并实际执行良好的旧转义。但是,由于PDO是一个抽象层,这不应该改变你处理它的方式。

答案 1 :(得分:0)

嗯,你有一个拼写错误(INSTERT)。下次怎么避免呢?

构建PDO对象时,请确保PDO::ATTR_ERRMODEPDO::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();
}