为什么有必要将创建的pdo对象保存到下一个变量?为什么当我有
$db = new PDO; $stmt = $db->Prepare("...");
我必须救人 $db 至 $stmt 访问某些 $db 另一种方法我可以直接从 $db . 例如 $db->prepare(); $db->bindParam(); 不起作用,但是 $stmt=$db->prepare(); $stmt->bindParam(); 正在工作。为什么?
$db
$stmt
$db->prepare(); $db->bindParam();
$stmt=$db->prepare(); $stmt->bindParam();
r9f1avp51#
这段代码所做的是准备一个sql语句,有效地将它从php中的字符串值转换为pdo(prepared data object,aka database connection)中的函数语句。在pdo上调用prepare函数时,传入一条sql语句,然后得到一条pdo语句。pdo语句是数据库的一项功能,允许您参数化语句,这反过来又提供了一些好处,例如:允许您重用语句,而无需rdms重新编译避免sql注入,从而使应用程序更安全一般来说,一旦你准备好了陈述(你的 $stmt 变量),您可以在代码中继续:绑定参数值(如果有参数)执行语句获取有关已执行语句的信息,例如行计数或语句生成的数据集简而言之,您没有保存 $db 至 $stmt ,而是 prepare() 打电话。
prepare()
tuwxkamq2#
只是因为 $db 以及 $stmt 是不同种类的物体。 $db 是表示到数据库的连接的pdo连接对象,并且 $stmt 是一个pdo语句对象,表示一个特定的准备好的查询(或“语句”)。当你写作的时候 $stmt = $db->prepare("..."); 您不会“将$db保存到$stmt”(正如您所描述的),这不是这里发生的事情。现在的情况是,您正在执行名为prepare()的方法,该方法在connection对象中可用。这将使您的sql为执行做好准备,并将其放入一个statement对象中,然后返回给您。这就是最后的结局 $stmt 变量。然后,为了绑定参数并执行查询,要执行的方法是statement对象的一部分(这是合乎逻辑的,因为它是您正在执行的语句—您不执行连接)。 $db->bindParam(); 不起作用,因为在连接对象上没有这样的方法,也不应该有-直接将参数绑定到语句。这里没有发生任何复杂、奇怪或不合逻辑的事情——这只是一个类中的一个方法返回另一个类的示例的情况,而另一个类有一组不同的可用方法(因为它有不同的用途)。阅读我提供的文档链接,希望您能够开始理解结构以及不同类和方法之间的相互关系。
$stmt = $db->prepare("...");
$db->bindParam();
t98cgbkg3#
也许你的意思是,我们为什么不直接写呢 $db->prepare(...) 而不是 $stmt = $db->prepare 例如,我写了几行代码
$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 每次都要看你怎么写。
3条答案
按热度按时间r9f1avp51#
这段代码所做的是准备一个sql语句,有效地将它从php中的字符串值转换为pdo(prepared data object,aka database connection)中的函数语句。在pdo上调用prepare函数时,传入一条sql语句,然后得到一条pdo语句。pdo语句是数据库的一项功能,允许您参数化语句,这反过来又提供了一些好处,例如:
允许您重用语句,而无需rdms重新编译
避免sql注入,从而使应用程序更安全
一般来说,一旦你准备好了陈述(你的
$stmt
变量),您可以在代码中继续:绑定参数值(如果有参数)
执行语句
获取有关已执行语句的信息,例如行计数或语句生成的数据集
简而言之,您没有保存
$db
至$stmt
,而是prepare()
打电话。tuwxkamq2#
只是因为
$db
以及$stmt
是不同种类的物体。$db
是表示到数据库的连接的pdo连接对象,并且$stmt
是一个pdo语句对象,表示一个特定的准备好的查询(或“语句”)。当你写作的时候
$stmt = $db->prepare("...");
您不会“将$db保存到$stmt”(正如您所描述的),这不是这里发生的事情。现在的情况是,您正在执行名为prepare()的方法,该方法在connection对象中可用。这将使您的sql为执行做好准备,并将其放入一个statement对象中,然后返回给您。这就是最后的结局$stmt
变量。然后,为了绑定参数并执行查询,要执行的方法是statement对象的一部分(这是合乎逻辑的,因为它是您正在执行的语句—您不执行连接)。
$db->bindParam();
不起作用,因为在连接对象上没有这样的方法,也不应该有-直接将参数绑定到语句。这里没有发生任何复杂、奇怪或不合逻辑的事情——这只是一个类中的一个方法返回另一个类的示例的情况,而另一个类有一组不同的可用方法(因为它有不同的用途)。
阅读我提供的文档链接,希望您能够开始理解结构以及不同类和方法之间的相互关系。
t98cgbkg3#
也许你的意思是,我们为什么不直接写呢
$db->prepare(...)
而不是$stmt = $db->prepare
例如,我写了几行代码接下来,我们可以写这个
而不是
我希望你能理解,你不必储存
$db
在$stmt
每次都要看你怎么写。