同一页面上的准备语句和 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
我假设“在同一页面中”是指在单个 .php 文件中;那么这样做绝对没有问题。请记住,PHP 解析器会将所有 php 脚本(当您确实包含/需要时...)附加在一起,然后解析它们。
【讨论】:
【参考方案3】:是否将两者混合使用确实是一个偏好问题。在这种情况下,我想说这并没有太大的区别。
准备好的语句与普通查询之间存在性能差异。作为查询,您的第一个查询会更慢(假设您通过mysqli_real_escape_string
运行输入,这必须与数据库服务器通信)。但是,由于第二个不接受输入,因此将其设置为准备好的语句会将执行分为准备和执行,并产生一些开销。当它是一个只执行一次且不接受脚本外部输入的查询时,query
会稍微快一些(我怀疑您的速度需求是否真的会产生影响)。
我确实想知道为什么您要获得所有活跃用户,而不是过滤掉以获得您想要的用户,但是没有足够的信息表明这不是您应该做的。如果您最终只是遍历这些结果并抓住了您感兴趣的少数几个,最好将此标准放在WHERE
子句中。
【讨论】:
以上是关于同一页面上的准备语句和 mysqli_query的主要内容,如果未能解决你的问题,请参考以下文章