php - MySQLi 准备的条件语句

标签 php mysql mysqli prepared-statement

我有四个可能的变量,只需要其中一个。我的问题是,如果查询的某些部分可能显示或不显示,我该如何准备语句/构造 SQL 查询。

我猜是这样的:

sql = "SELECT * FROM dogs WHERE name = ?"
if(isset($dogid)) {
sql .= "AND WHERE id = ?";
}

}
if(isset($dogcolour)) {
sql .= "AND WHERE colour = ?";
}

我的大脑完全崩溃了,我认为必须有一种比使用 $dogID = "true"; 这样的东西更好的方法来准备它。在每个 if 中,然后在最后用一堆 if 语句将其绑定(bind)。

最佳答案

好吧,我会定义一些空值,然后检查数据库中的所有内容。

$sql = "SELECT * FROM dogs WHERE (IF(? = 0, 1 = 1, name = ?)) AND (IF(? = 0, 1 = 1, colour = ?))"

此解决方案有一个缺点,您需要将所有参数传递两次:

$statement->bind_param('ssss', $name, $name, $colour, $colour);

如果 name 或 $colour 变量为 0,则在 where 语句中执行 1 = 1(witch 始终为 true)。应该有可能将 NULL 值传递给 mysqli,但是对我来说它不起作用,如果它起作用则可以简化查询。

$sql = "SELECT * FROM dogs WHERE name = (IFNULL(?, name)) AND colour = (IFNULL(?, colour))"

关于php - MySQLi 准备的条件语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27930690/

相关文章:

PHP 变量不会在后续查询中被覆盖

mysql - -C 和压缩 mysqldump 之间有什么区别?

php - "Mysql expects parameter 2 to be integer, string given in"错误类型

php - 如何将元素添加到 php 数组而不显示为新数组

php - 分页不显示 PHP PDO

php - 使用输出缓冲区的函数在开发中有效,但在生产中无效

MySQL/MariaDB 时间戳、日期时间数据类型

PHP fatal error : Interface not found, 使用带命名空间的工厂模式

php - mysql_affected_rows 不显示消息

php - 我的一些查询没有执行