同一页面上的准备语句和 mysqli_query

Posted

技术标签:

【中文标题】同一页面上的准备语句和 mysqli_query【英文标题】:Prepared statement & mysqli_query on same page 【发布时间】:2013-11-19 13:56:19 【问题描述】:

我正在使用 mysqli 准备好的语句

$email=$_POST['email'];
$password=$_POST['password'];


$sql="SELECT * from users where email=? and password=?";
$result=$db->prepare($sql);
$result->bind_param('ss',$email,$password);
$result->execute();

由于帖子值来自用户,因此我遵循此方法,但例如.. 我想像所有用户一样从数据库中获取一些东西

SELECT * from users where active=1
    我应该在这里也使用准备好的语句还是简单的 $db->query(//code);会好吗? 我不应该在同一个页面中混合简单的 mysqli 查询和准备语句吗?

【问题讨论】:

【参考方案1】:

尽可能使用准备好的语句是一种很好的做法。如果您的应用程序会增长,而您必须用用户输入替换硬编码变量怎么办?

实际上,为此使用 ORM 会更好,因为它可以让您在需要时重用准备好的查询。即使你不准备它们,ORM 也会鼓励你编写这样的方法:

getActiveUsers()

而不是每次都编写查询。

阅读SOLID 原则和DRY 规则以了解更多信息。

【讨论】:

如果我使用 ORM,我是否必须处理 sql 注入,否则 Orm 会为我做这件事? 大多数 ORM 都会为您解决这个问题。当然,您可以绕过其中的安全性构建,但您必须努力做到这一点:)【参考方案2】: 我应该在这里也使用准备好的语句还是简单的 $db->query(//code);会好吗?

如果查询是静态的(没有动态变量),就像你写的那样, 你可以使用简单的mysqli::query

我不应该在同一个页面中混合简单的 mysqli 查询和准备语句吗?

我假设“在同一页面中”是指在单个 .php 文件中;那么这样做绝对没有问题。请记住,PHP 解析器会将所有 php 脚本(当您确实包含/需要时...)附加在一起,然后解析它们。

【讨论】:

【参考方案3】:

是否将两者混合使用确实是一个偏好问题。在这种情况下,我想说这并没有太大的区别。

准备好的语句与普通查询之间存在性能差异。作为查询,您的第一个查询会更慢(假设您通过mysqli_real_escape_string 运行输入,这必须与数据库服务器通信)。但是,由于第二个不接受输入,因此将其设置为准备好的语句会将执行分为准备和执行,并产生一些开销。当它是一个只执行一次且不接受脚本外部输入的查询时,query 会稍微快一些(我怀疑您的速度需求是否真的会产生影响)。

我确实想知道为什么您要获得所有活跃用户,而不是过滤掉以获得您想要的用户,但是没有足够的信息表明这不是您应该做的。如果您最终只是遍历这些结果并抓住了您感兴趣的少数几个,最好将此标准放在WHERE 子句中。

【讨论】:

以上是关于同一页面上的准备语句和 mysqli_query的主要内容,如果未能解决你的问题,请参考以下文章

使用 mysqli 和准备好的语句时命令不同步 [重复]

通过准备好的语句从数据库中获取行

来自 2 个表的数据未显示在同一页面上

mysqli_query 上的未定义变量

准备学习Java的准程序员应该明确的前五年学习和职业计划

MySQL上的LIMIT关键字与准备好的语句[重复]