【问题标题】:When to use PDO exec() vs execute() vs query() [duplicate]何时使用 PDO exec() vs execute() vs query() [重复]
【发布时间】:2018-09-13 11:17:40
【问题描述】:

以下是使用这些方法的 W3 示例的 sn-ps(带有链接)。我很焦虑,想知道我花这么多时间学习的材料是否是最新和最常用的惯例。

有this Stack Overflow post。但是这篇文章没有回答何时使用上述方法。它还主张仅出于给定的原因使用 prepare()/execute()。如果这是真的,这似乎意味着 W3 中的示例已过时。作为一名尝试学习的学生,我发现 W3 对用户友好。我喜欢将信息组织成没有过多细节的部分(因此,我现在不希望被提及 php.net 或类似的东西)。我还被告知 W3Schools 保持最新状态(这对我来说再次意味着传统上使用的不一定是最前沿的),如果他们同意,我很想听听有经验的程序员的意见。

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

W3school 示例:

MySQL Create Table 使用 exec():

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

MySQL Update Data 使用prepared statement和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);

后脚本上下文: 这是我的第一篇 SO 帖子,希望对您有所帮助。我正在使用 W3Schools 学习 MySQL 和 HTML/CSS/Javascript/PHP,这是我正在学习的在线 Internet 编程学院课程的指定资源。这是教师第一次教授这门课程,他诚然生疏了。我喜欢尽可能去他的办公室亲自提问,因为我发现沟通更容易。然而,这经常导致他当时就在谷歌上搜索它,这让我想知道他给出的所有答案是否只是他发现谷歌搜索的第一件事,而不是被认为是最佳实践的答案(我希望的)。多年后,我回到大学攻读计算机科学的第二个学位。不过,这一次,我必须说,与过去的课程相比,这似乎更像是被告知事情并被指上网以找出“如何”。

【问题讨论】:

  • 提供了关于不重复的解释

标签: php mysql pdo prepared-statement


【解决方案1】:

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

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

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

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

附:对不起鼠标。

【讨论】:

  • 流程图很棒!我现在准备使用 prepare() 。几件事
  • 1) 你提到必须使用 PDOStatement::prepare() 来防止 SQL 注入,后来提到使用它不是安全问题?好像会的。 2)您(和所有其他有经验的开发人员)能否就 W3School 信息是否为“最佳实践”发表意见?谢谢迈克
  • 我说如果您使用PDOStatement::prepare() 而不是PDO::query() 或PDO::exec(),这不是安全问题。然而,反过来肯定是一个安全问题,因为您会将用户定义的数据以纯文本形式放入查询中。
  • 关于 w3schools 的问题,请参阅:meta.stackoverflow.com/questions/280478/why-not-w3schools-com。大多数时候ok,但肯定有更好的页面。有人创建了this website,它曾经有很多理由说明为什么永远不应该使用 w3schools,但是他们后来改变了他们所说的。
  • 这是我见过的回答问题的最佳方式之一!
猜你喜欢
  • 1970-01-01
  • 2011-07-16
  • 2012-07-27
  • 2023-04-03
  • 2021-03-27
  • 2015-03-01
  • 2016-05-23
  • 2010-10-18
相关资源
最近更新 更多