如何在Mysqli预处理语句中使用PHP常量

4
我正在构建一个带有许多数据库查询的API。为了避免在每个查询中重复一些预先设定的值,我创建了一些PHP常量。但是我不确定在Mysqli准备语句中正确的包含它们的方式。我知道常量不能通过引用传递。因此,我想知道是否应该为包含常量的查询创建一个变量,还是直接将带有常量的字符串传递给prepare()函数。所以,如果我这样做可以吗?或者我应该在调用prepare()之前创建一个变量并将字符串存储在那里?
$stmt = $this->conn->prepare("SELECT city FROM masters WHERE email = ? AND estado != '" . STATE_INACTIVE . "'");
$stmt->bind_param("s", $email );

对比

$query = "SELECT city FROM masters WHERE email = ? AND estado != '" . STATE_INACTIVE . "'";
$stmt = $this->conn->prepare($query);
$stmt->bind_param("s", $email );

2
这两者之间有什么区别? - deceze
4
$stmt->bind_param("s", STATE_INACTIVE ); 这个语句为什么不能工作? - Matthew Page
3
不起作用是因为你不能通过引用传递一个常量。尝试一下,你就会明白。 - Brian Driscoll
2
这些也不是 PDO 语句... - deceze
1
@deceze 是的,它们是 [mysqli]。如果它们是PDO,那么他可以使用bindParam作为第一个参数,bindValue作为第二个参数,并使用常量。 - Brian Driscoll
显示剩余3条评论
1个回答

7

由于您正在使用常量值,因此通过将该值连接到查询中,您不会使自己暴露于潜在的SQL注入攻击。所以,我认为您现在的做法是可以的。另一个选项是将常量值分配给变量并进行绑定,如下所示:

$query = "SELECT city FROM masters WHERE email = ? AND estado != ?";
$inactiveState = STATE_INACTIVE;
$stmt = $this->conn->prepare($query);
$stmt->bind_param("ss", $email, $inactiveState);

值得指出的是,这里使用的是mysqli而不是PDO。如果你使用PDO,可以这样做:
$query = "SELECT city FROM masters WHERE email = ? AND estado != ?";
$stmt = $this->conn->prepare($query);
$stmt->bindParam(1, $email, PDO::PARAM_STR);
$stmt->bindValue(2, STATE_INACTIVE, PDO::PARAM_STR);

应该是 $stmt->bind_param("ss", $email, $inactiveState); 吗?(注意 "ss") - dWinder
PDO具有灵活的非绑定execute()方法,这使得操作变得更加容易。您可以传递一个普通的array - tadman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接