如何在Mysqli准备的语句中使用PHP常量

如何在Mysqli准备的语句中使用PHP常量,php,mysql,mysqli,prepared-statement,constants,Php,Mysql,Mysqli,Prepared Statement,Constants,我正在构建一个包含大量db查询的API。为了避免在每个查询中重复一些预先建立的值,我创建了一些PHP常量。但是,我不确定在Mysqli编写的语句中包含它们的正确方式。我知道常量不能通过引用传递。因此,我想知道是应该为包含常量的查询创建一个变量,还是可以直接将带有常量的字符串传递给prepare()函数。因此,如果我这样做,或者应该在调用prepare()之前创建一个变量并将字符串存储在那里,这是可以的 对 $query = "SELECT city FROM masters WHERE emai

我正在构建一个包含大量db查询的API。为了避免在每个查询中重复一些预先建立的值,我创建了一些PHP常量。但是,我不确定在Mysqli编写的语句中包含它们的正确方式。我知道常量不能通过引用传递。因此,我想知道是应该为包含常量的查询创建一个变量,还是可以直接将带有常量的字符串传递给prepare()函数。因此,如果我这样做,或者应该在调用prepare()之前创建一个变量并将字符串存储在那里,这是可以的

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

由于您使用的是一个常量值,因此通过将该值连接到查询中,您不会受到潜在的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(“s”,STATE_INACTIVE)-为什么不起作用?@MatthewPage它不起作用,因为不能通过引用传递常量。试试看,你就会明白。而且,这些不是PDO语句…@deceze-yep,它们是[mysqli]。如果它们是PDO,那么他可以使用bindParam作为第一个参数,bindpalue作为第二个参数,并使用常量?(请注意“ss”)PDO有一个灵活的非绑定
execute()
方法,这使它更容易实现。您可以传入一个普通的
数组
$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);