【问题标题】:Prepared statement & mysqli_query on same page同一页面上的准备语句和 mysqli_query
【发布时间】: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
  1. 我应该在这里也使用准备好的语句还是简单的 $db->query(//code);会好吗?
  2. 我不应该在同一个页面中混合简单的 mysqli 查询和准备语句吗?

【问题讨论】:

    标签: php 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 子句中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-24
        • 1970-01-01
        • 1970-01-01
        • 2016-04-06
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        相关资源
        最近更新 更多