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

Php 何时使用PDO exec()vs execute()vs query(),php,mysql,pdo,prepared-statement,Php,Mysql,Pdo,Prepared Statement,下面是使用这些方法的W3示例片段(带有链接)。我担心我花这么多时间研究的材料是否是最新和最常用的惯例 有。然而,这篇文章没有回答何时使用上述方法的问题。此外,它还提倡仅使用prepare()/execute(),原因如下。如果这是真的,这似乎意味着W3中的示例已经过时。作为一名试图学习的学生,我发现W3对用户很友好。我喜欢将信息组织成没有大量细节的片段(因此,出于这个原因,我现在不喜欢被提到php.net或类似的东西)。我还听说W3Schools是最新的(对我来说,这也意味着传统的使用方式不一定

下面是使用这些方法的W3示例片段(带有链接)。我担心我花这么多时间研究的材料是否是最新和最常用的惯例

有。然而,这篇文章没有回答何时使用上述方法的问题。此外,它还提倡仅使用prepare()/execute(),原因如下。如果这是真的,这似乎意味着W3中的示例已经过时。作为一名试图学习的学生,我发现W3对用户很友好。我喜欢将信息组织成没有大量细节的片段(因此,出于这个原因,我现在不喜欢被提到php.net或类似的东西)。我还听说W3Schools是最新的(对我来说,这也意味着传统的使用方式不一定是最先进的),如果有经验的程序员同意的话,我很想听听他们的意见

示例中使用的方法是否如我所希望的那样被视为“最佳实践”,或者上面的SO帖子是否正确?为什么

W3学校示例:

MySQL使用exec():

MySQL使用prepared语句和execute():

MySQL使用query()如下:

脚本后上下文:
这是我的第一篇SO帖子,我希望它会有所帮助。我正在使用W3Schools学习MySQL和HTML/CSS/Javascript/PHP,W3Schools是我正在学习的在线互联网编程大学课程的指定资源。这是老师们第一次教这门课,他确实生疏了。我喜欢在可能的时候亲自去他的办公室问问题,因为我觉得沟通更容易。然而,这经常导致他在谷歌上搜索,这让我怀疑,他给出的所有答案是否只是他在谷歌上找到的第一件事,而不是一个被认为是最佳实践的答案(我希望如此)。多年后,我回到大学攻读计算机科学的第二个学位。这一次,我必须说,与我过去的课程相比,这更像是让我意识到事情,并让我上网了解“如何”

我制作了一个流程图,试图帮助您确定在任何特定情况下应该使用哪种方法:

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

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

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


顺便说一句,对不起鼠标。

流程图太棒了!我现在准备使用prepare()。有几件事1)您提到PDOStatement::prepare()必须用于防止SQL注入,然后提到使用它不是一个安全问题?看起来是的。2) 您(以及所有其他有经验的开发人员)能给出W3School信息是否为“最佳实践”的意见吗?谢谢,MikeI说如果使用
PDO::prepare()
而不是
PDO::query()
PDO::exec()
,这不是安全问题。但是,另一种方法肯定是一个安全问题,因为您将以纯文本形式将用户定义的数据放入查询中。至于问题,请参阅:。大多数时候都可以,但肯定有更好的页面。有人创造了,这曾经有一大堆理由解释为什么w3schools永远不应该被使用,但是他们后来改变了他们的说法。这是我见过的回答问题的最好方式之一!有人解释说,这一问题不存在重复
// use exec() because no results are returned
$conn->exec($sql);
echo "Table MyGuests created successfully";
// 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";
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);