为什么需要将创建的 PDO 对象保存到下一个变量?

Why is it neccessary to save created PDO object to next variable?

为什么需要将创建的PDO对象保存到下一个变量?为什么当我有

$db = new PDO;
$stmt = $db->Prepare("...");

我必须将 $db 保存到 $stmt 以访问 $db 的某些方法和我可以直接从 $db 调用的其他方法。例如 $db->prepare(); $db->bindParam(); 不工作,但 $stmt=$db->prepare(); $stmt->bindParam(); 工作。这是为什么?

该代码正在做的是准备一个 SQL 语句,有效地将它从 PHP 中的字符串值转换为 PDO 中的功能语句(准备好的数据对象,也称为数据库连接)。当您调用允许参数化语句的 prepare function on a PDO, you pass in a SQL statement, and in return you get a PDOStatement. The PDO Statement is a feature of databases 时,这反过来又提供了几个好处,例如:

  1. 允许您重用语句而无需重新编译 RDMS
  2. 避免SQL Injection,从而使您的应用程序更安全

通常,一旦您有了准备好的语句(您的 $stmt 变量),您就可以在代码中继续:

  1. 绑定参数值,如果有参数
  2. 执行语句
  3. 获取有关已执行语句的信息,例如行数或语句生成的数据集

简而言之,您没有将 $db 的值保存到 $stmt,而是 prepare() 调用生成的 PDO 语句。

也许你的意思是,为什么我们不写 $db->prepare(...) 而不是 $stmt = $db->prepare 例如,我写这行代码

$db = new PDO(....);
$stmt = $db->query('SELECT * FROM table');

那么接下来,我们可以这么写

if($stmt->rowCount() == 1) {
    while($data = $stmt->fetch(PDO::FETCH_ASSOC))) {
         // statements
    }
}

而不是

if($db->query('SELECT * FROM table')->rowCount()) {
    while($data = $db->query('SELECT * FROM table')->fetch(PDO::FETCH_ASSOC)) {
        // statements
    }
}

我希望你明白,你不必每次都在$stmt上存储$db,这取决于你怎么写。

只是因为$db$stmt是不同种类的对象。 $db 是一个 PDO connection object representing a connection to the database, and $stmt is a PDO Statement object 表示一个特定的准备查询(或 "statement")。

当你写 $stmt = $db->prepare("..."); 时,你不会 "save $db to $stmt"(如你所描述的),这不是这里发生的事情。发生的事情是您正在执行连接对象中可用的名为 prepare() 的方法。这让您的 SQL 准备好执行并将其放入一个 Statement 对象中,然后它 returns 给您。这就是 $stmt 变量中的结果。

然后为了绑定参数和执行查询,执行该操作的方法是 Statement 对象的一部分(这是合乎逻辑的,因为它是您正在执行的语句 - 您不执行连接) . $db->bindParam(); 不起作用,因为 Connection 对象上没有这样的方法,也不应该有 - 您直接将参数绑定到语句。

这里没有发生任何复杂、奇怪或不合逻辑的事情 - 这只是一个 class 中的方法返回另一个 class 的实例的情况,后者有一组不同的可用方法(因为它有不同的用途)。

阅读我提供的文档链接,希望您会开始理解结构以及不同的 classes 和方法如何相互关联。