PDO类绑定参数()不起作用


PDO Class bindParam() not working

我正在尝试使用 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 查询以及与这些占位符对应的值(,数据库本身负责其余部分。

所以:

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

注意:某些 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();
}