准备好的声明和mysqli_query在同一页面上


Prepared statement & mysqli_query on same page

我正在使用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 查询和预处理语句吗?

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

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

getActiveUsers()

而不是每次都编写查询。

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

  • 我应该在这里也使用预准备语句还是简单的 $db->query(//code); 会很好吗?

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

  • 我不应该在同一页面中混合简单的 mysqli 查询和预处理语句吗?

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

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

预准备语句与纯查询之间存在性能差异。您的第一个查询作为查询会更慢(假设您通过 mysqli_real_escape_string 运行输入,这必须与数据库服务器通信)。但是,由于第二个语句不带输入,因此使其成为预准备语句会将执行中断为准备和执行,并产生一些开销。当它是一个查询时,你只执行一次,不需要来自脚本外部的输入,query更快,稍微(我怀疑你的速度需求是否真的会有所不同)。

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