为什么需要将创建的 PDO 对象保存到下一个变量?
Why is it neccessary to save created PDO object to next variable?
为什么需要将创建的PDO对象保存到下一个变量?为什么当我有
$db = new PDO;
$stmt = $db->Prepare("...");
我必须将 $db
保存到 $stmt
以访问 $db
的某些方法和我可以直接从 $db
调用的其他方法。例如 $db->prepare(); $db->bindParam();
不工作,但 $stmt=$db->prepare(); $stmt->bindParam();
工作。这是为什么?
该代码正在做的是准备一个 SQL 语句,有效地将它从 PHP 中的字符串值转换为 PDO 中的功能语句(准备好的数据对象,也称为数据库连接)。当您调用允许参数化语句的 prepare function on a PDO, you pass in a SQL statement, and in return you get a PDOStatement. The PDO Statement is a feature of databases 时,这反过来又提供了几个好处,例如:
- 允许您重用语句而无需重新编译 RDMS
- 避免SQL Injection,从而使您的应用程序更安全
通常,一旦您有了准备好的语句(您的 $stmt
变量),您就可以在代码中继续:
- 绑定参数值,如果有参数
- 执行语句
- 获取有关已执行语句的信息,例如行数或语句生成的数据集
简而言之,您没有将 $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
}
}
我希望你明白,你不必每次都在$stmt
上存储$db
,这取决于你怎么写。
只是因为$db
和$stmt
是不同种类的对象。 $db
是一个 PDO connection object representing a connection to the database, and $stmt
is a PDO Statement object 表示一个特定的准备查询(或 "statement")。
当你写 $stmt = $db->prepare("...");
时,你不会 "save $db to $stmt"(如你所描述的),这不是这里发生的事情。发生的事情是您正在执行连接对象中可用的名为 prepare() 的方法。这让您的 SQL 准备好执行并将其放入一个 Statement 对象中,然后它 returns 给您。这就是 $stmt
变量中的结果。
然后为了绑定参数和执行查询,执行该操作的方法是 Statement 对象的一部分(这是合乎逻辑的,因为它是您正在执行的语句 - 您不执行连接) . $db->bindParam();
不起作用,因为 Connection 对象上没有这样的方法,也不应该有 - 您直接将参数绑定到语句。
这里没有发生任何复杂、奇怪或不合逻辑的事情 - 这只是一个 class 中的方法返回另一个 class 的实例的情况,后者有一组不同的可用方法(因为它有不同的用途)。
阅读我提供的文档链接,希望您会开始理解结构以及不同的 classes 和方法如何相互关联。
为什么需要将创建的PDO对象保存到下一个变量?为什么当我有
$db = new PDO;
$stmt = $db->Prepare("...");
我必须将 $db
保存到 $stmt
以访问 $db
的某些方法和我可以直接从 $db
调用的其他方法。例如 $db->prepare(); $db->bindParam();
不工作,但 $stmt=$db->prepare(); $stmt->bindParam();
工作。这是为什么?
该代码正在做的是准备一个 SQL 语句,有效地将它从 PHP 中的字符串值转换为 PDO 中的功能语句(准备好的数据对象,也称为数据库连接)。当您调用允许参数化语句的 prepare function on a PDO, you pass in a SQL statement, and in return you get a PDOStatement. The PDO Statement is a feature of databases 时,这反过来又提供了几个好处,例如:
- 允许您重用语句而无需重新编译 RDMS
- 避免SQL Injection,从而使您的应用程序更安全
通常,一旦您有了准备好的语句(您的 $stmt
变量),您就可以在代码中继续:
- 绑定参数值,如果有参数
- 执行语句
- 获取有关已执行语句的信息,例如行数或语句生成的数据集
简而言之,您没有将 $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
}
}
我希望你明白,你不必每次都在$stmt
上存储$db
,这取决于你怎么写。
只是因为$db
和$stmt
是不同种类的对象。 $db
是一个 PDO connection object representing a connection to the database, and $stmt
is a PDO Statement object 表示一个特定的准备查询(或 "statement")。
当你写 $stmt = $db->prepare("...");
时,你不会 "save $db to $stmt"(如你所描述的),这不是这里发生的事情。发生的事情是您正在执行连接对象中可用的名为 prepare() 的方法。这让您的 SQL 准备好执行并将其放入一个 Statement 对象中,然后它 returns 给您。这就是 $stmt
变量中的结果。
然后为了绑定参数和执行查询,执行该操作的方法是 Statement 对象的一部分(这是合乎逻辑的,因为它是您正在执行的语句 - 您不执行连接) . $db->bindParam();
不起作用,因为 Connection 对象上没有这样的方法,也不应该有 - 您直接将参数绑定到语句。
这里没有发生任何复杂、奇怪或不合逻辑的事情 - 这只是一个 class 中的方法返回另一个 class 的实例的情况,后者有一组不同的可用方法(因为它有不同的用途)。
阅读我提供的文档链接,希望您会开始理解结构以及不同的 classes 和方法如何相互关联。