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

mi7gmzs6  于 2021-06-17  发布在  Mysql
关注(0)|答案(3)|浏览(348)

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

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

我必须救人 $db$stmt 访问某些 $db 另一种方法我可以直接从 $db . 例如 $db->prepare(); $db->bindParam(); 不起作用,但是 $stmt=$db->prepare(); $stmt->bindParam(); 正在工作。为什么?

r9f1avp5

r9f1avp51#

这段代码所做的是准备一个sql语句,有效地将它从php中的字符串值转换为pdo(prepared data object,aka database connection)中的函数语句。在pdo上调用prepare函数时,传入一条sql语句,然后得到一条pdo语句。pdo语句是数据库的一项功能,允许您参数化语句,这反过来又提供了一些好处,例如:
允许您重用语句,而无需rdms重新编译
避免sql注入,从而使应用程序更安全
一般来说,一旦你准备好了陈述(你的 $stmt 变量),您可以在代码中继续:
绑定参数值(如果有参数)
执行语句
获取有关已执行语句的信息,例如行计数或语句生成的数据集
简而言之,您没有保存 $db$stmt ,而是 prepare() 打电话。

tuwxkamq

tuwxkamq2#

只是因为 $db 以及 $stmt 是不同种类的物体。 $db 是表示到数据库的连接的pdo连接对象,并且 $stmt 是一个pdo语句对象,表示一个特定的准备好的查询(或“语句”)。
当你写作的时候 $stmt = $db->prepare("..."); 您不会“将$db保存到$stmt”(正如您所描述的),这不是这里发生的事情。现在的情况是,您正在执行名为prepare()的方法,该方法在connection对象中可用。这将使您的sql为执行做好准备,并将其放入一个statement对象中,然后返回给您。这就是最后的结局 $stmt 变量。
然后,为了绑定参数并执行查询,要执行的方法是statement对象的一部分(这是合乎逻辑的,因为它是您正在执行的语句—您不执行连接)。 $db->bindParam(); 不起作用,因为在连接对象上没有这样的方法,也不应该有-直接将参数绑定到语句。
这里没有发生任何复杂、奇怪或不合逻辑的事情——这只是一个类中的一个方法返回另一个类的示例的情况,而另一个类有一组不同的可用方法(因为它有不同的用途)。
阅读我提供的文档链接,希望您能够开始理解结构以及不同类和方法之间的相互关系。

t98cgbkg

t98cgbkg3#

也许你的意思是,我们为什么不直接写呢 $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 每次都要看你怎么写。

相关问题