为什么必须将创建的PDO对象保存到下一个变量?为什么当我有
$db = new PDO;
$stmt = $db->Prepare("...");
我必须将$db
保存到$stmt
才能访问$db
的某些方法以及可以直接从$db
调用的其他方法。例如,$db->prepare(); $db->bindParam();
不起作用,但是$stmt=$db->prepare(); $stmt->bindParam();
起作用。为什么会这样?
答案 0 :(得分:3)
这仅仅是因为$db
和$stmt
是不同种类的对象。 $db
是PDO connection object,代表与数据库的连接,$stmt
是PDO 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语句,然后返回了PDOStatement。 PDO Statement is a feature of databases使您可以对语句进行参数化,从而提供了许多好处,例如:
通常,一旦您有了一条准备好的语句(您的$stmt
变量),您就可以在代码中继续执行以下操作:
简而言之,您不是将$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
上,这取决于您如何编写。