何时使用 PDO exec() vs execute() vs query()

When to use PDO exec() vs execute() vs query()

以下是 W3 使用这些方法的示例片段(带有链接)。我很焦虑地想知道我花这么多时间研究的 material 是否是最新和最常用的约定。

this Stack Overflow post。然而这个post并没有回答什么时候使用上面的方法。它还提倡仅出于给定的原因使用 prepare()/execute()。如果这是真的,似乎暗示 W3 中的例子已经过时了。作为一名努力学习的学生,我发现 W3 是用户友好的。我喜欢将信息组织成没有大量细节的片段(因此,出于这个原因,我现在不想被称为 php.net 或类似的东西)。我还被告知 W3Schools 是最新的(这对我来说再次意味着常规使用不一定是最先进的),如果他们同意,我很想听听有经验的程序员的意见。

示例中使用的方法是否如我所希望的那样 "best practices" 或者上面的 SO post 是正确的,为什么?

W3school 示例:

MySQL Create Table 使用 exec():

// use exec() because no results are returned
$conn->exec($sql);
echo "Table MyGuests created successfully";

MySQL Update Data 使用预处理语句和 execute():

// Prepare statement
$stmt = $conn->prepare($sql);

// execute the query
$stmt->execute();

// echo a message to say the UPDATE succeeded
echo $stmt->rowCount() . " records UPDATED successfully";

MySQL Select Data 像这样使用 query():

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

Post 脚本上下文: 这是我的第一个SOPost,希望对你有所帮助。我正在使用 W3School 学习 MySQL 和 HTML/CSS/Javascript/PHP,W3School 是我正在参加的在线 Internet 编程大学课程的指定资源。教官们第一次教这门课,他当然生疏了。我喜欢在可能的时候亲自去他的办公室提问,因为我发现这样更容易沟通。然而,这通常会导致他立即在谷歌上搜索它,这让我想知道他给出的所有答案是否只是他发现谷歌搜索的第一件事,而不是被认为是最佳实践的答案(我希望如此)。多年后,我回到大学攻读计算机科学的第二学位。不过这一次,我必须说,与我过去的课程相比,这似乎更像是被告知要上网了解 "how"。

我制作了一个流程图来帮助您确定在任何给定情况下您应该使用哪个:

我们必须为用户数据使用PDOStatement::prepare()和绑定变量的原因是为了防止SQL注入攻击。您永远不应该将用户输入直接放入查询中。事实上,这只是个人偏好,但即使我将 hard-coding 值放入查询中,我通常还是会使用 PDOStatement::prepare()。也许今天我就是hard-coding吧。明天我从数据库中提取它,然后我允许用户在数据库中编辑该字段。但是我会记得返回并更新查询以使用准备好的语句吗?可能不会。将变量绑定到查询也将防止查询中的意外语法错误。

在使用不同变量重用查询时使用 PDOStatement::prepare() 的原因是因为当您执行它时,它会将准备好的语句发送到数据库服务器,而不是值。当您 execute() PDOStatement 时,您会将值发送到数据库服务器。因此对于后续查询,您只需发送值而不是整个查询。

但是,如果您决定使用 PDO::query() 而不是 PDO::exec(),或者如果您使用 PDOStatement::prepare() 而不是其他两个中的任何一个,这不是安全问题,但是更多的是效率问题。

P.S。对不起鼠标。