以下是使用这些方法(带链接)的W3示例的摘要。我感到焦虑的是,我花了这么多时间研究的材料是否是最新和最常用的惯例。
有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使用预准备语句和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,这是我在线的互联网编程学院课程的指定资源。这是教练第一次教授课程,而且他确实生锈了。我喜欢到他的办公室亲自问问我,因为我觉得沟通更容易。然而,它经常导致他在那时谷歌搜索,这让我想知道他所给出的所有答案是否是他发现谷歌搜索的第一件事,而不是被认为是最佳实践的答案(我希望如此)。多年后,我回到大学攻读计算机科学二级学位。这一次,我必须说它似乎更像是被意识到事物,并提到在网上找出"如何"比我过去的课程。
答案 0 :(得分:5)
我制作了一个流程图,试图帮助您确定在任何特定情况下应该使用哪个:
我们必须使用PDOStatement::prepare()
并绑定用户数据变量的原因是为了防止SQL注入攻击。您永远不应将用户输入直接放入查询中。实际上,这只是个人偏好,但即使我将值硬编码到查询中,我通常也会使用PDOStatement::prepare()
。也许今天我对它进行硬编码。明天我从数据库中取出它,之后我允许用户在数据库中编辑该字段。但是我会记得回去更新查询以使用预准备语句吗?可能不是。将变量绑定到查询也可以防止查询中的意外语法错误。
在使用不同变量重用查询时使用PDOStatement::prepare()
的原因是,当您执行此操作时,它会将准备好的语句发送到数据库服务器,而不是值。当您execute()
PDOStatement
时,您将值发送到数据库服务器。因此,对于后续查询,您需要发送的只是值而不是整个查询。
但是,如果您决定使用PDO::query()
而不是PDO::exec()
,或者使用PDOStatement::prepare()
而不是其他两个中的任何一个,那么这不是安全问题,而是更多效率问题。
P.S。对不起老鼠。