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



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

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

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

这只是因为$db$stmt是不同类型的对象。$db是表示与数据库连接的PDO连接对象,$stmt是表示特定准备查询(或"语句"(的PDO语句对象。

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

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

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

阅读我提供的文档链接,希望你能开始理解结构以及不同的类和方法之间的关系。

该代码所做的是准备一条SQL语句,有效地将其从PHP中的字符串值转换为PDO(准备好的数据对象,也称为数据库连接(中的函数语句。当您在PDO上调用prepare函数时,您会传递一条SQL语句,作为回报,您会得到一个PDOStatement。PDO语句是数据库的一个功能,它允许您参数化语句,这反过来又提供了几个好处,例如:

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

通常,一旦您有了Prepared Statement(您的$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
}
}

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

最新更新