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

时间:2018-12-14 07:21:44

标签: php mysql pdo prepared-statement

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

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

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

3 个答案:

答案 0 :(得分:3)

这仅仅是因为$db$stmt是不同种类的对象。 $dbPDO connection object,代表与数据库的连接,$stmtPDO Statement object,代表特定的准备好的查询(或“声明”)。

在编写$stmt = $db->prepare("...");时,您不会“将$ db保存到$ stmt”(如您所描述的),这不是这里发生的情况。发生的事情是您正在执行名为prepare()的方法,该方法在连接对象中可用。这使您的SQL准备就绪,可以执行,并将其放入Statement对象,然后将其返回给您。这就是$stmt变量的结尾。

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

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

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

答案 1 :(得分:0)

该代码正在做的是准备一条SQL语句,有效地将其从PHP中的字符串值转换为PDO中的功能性语句(准备好的数据对象,又名数据库连接)。调用prepare function on a PDO时,您传递了一条SQL语句,然后返回了PDOStatementPDO Statement is a feature of databases使您可以对语句进行参数化,从而提供了许多好处,例如:

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

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

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

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

答案 2 :(得分:0)

也许你是说,为什么我们不写$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
    }
}

希望您能理解,您不必每次都将$db存储在$stmt上,这取决于您如何编写。