在 MySQL 准备语句的 WHERE 子句中使用通配符
Posted
技术标签:
【中文标题】在 MySQL 准备语句的 WHERE 子句中使用通配符【英文标题】:Use wildcard in WHERE clause in MySQL prepared statement 【发布时间】:2014-12-15 14:41:19 【问题描述】:我有以下 mysql 语句:
$sql = "SELECT * FROM `table` WHERE `field`=?;";
$prepare = $connect -> prepare( $sql );
$prepare -> bind_param( "i" , $value );
$value = $_GET["value"];
//etc.
但是,“未过滤”是一个选项。有没有办法将通配符传递到语句中,例如:
if ( ! isset ( $_GET["value"] ) ) $value = SOME_WILDCARD_INDICATOR;
...或者我是否必须为未过滤的查询提供一个完整的单独代码块?
【问题讨论】:
什么?你想要表格的所有行吗?只需删除WHERE
子句。 SELECT * FROM table
您可以在准备之前添加一些逻辑以将查询扩展到 WHERE 子句。
如果我只是删除WHERE
子句,那么bind_param()
会返回错误,因为查询中没有占位符。
@JayBlanchard:如果$_GET["value"]
是null
,你的意思是WHERE 0=?
和$value = 0;
?嗯……聪明。
简单写if (!isset($_GET['value'])) $stmt = $connect->query('SELECT * FROM table'); else $stmt = $connect->prepare('SELECT * FROM table WHERE field = ?'); $stmt->bind_param('i', $value); $rows = $stmt->fetchAll();
...那会是最简单的事情
【参考方案1】:
只需使用一点逻辑 -
$value = $_GET["value"];
$sql = "SELECT * FROM `table`";
if (isset($value))
$sql .= "WHERE `field`=?";
$prepare -> bind_param( "i" , $value );
$sql .= ";";
【讨论】:
$prepare = $connect -> prepare( $sql );
会去哪里?
您对OOP MySQLi 的使用有点混乱,因为我没有连接信息,所以很难说。如果您使用更多信息编辑您的 OP,我可以帮助您。【参考方案2】:
正如其他人所说,如果值存在,您只想添加 where 条件。
<?php
$sql = "SELECT * FROM `table`";
$value = $_GET['value'];
if ($value)
$sql .= " WHERE `field` = ?"
$query = $db->prepare ($sql);
if ($value)
$query->bind_param ('i', $value);
【讨论】:
这看起来有点像 PDO。我正在使用 MySQLi。这在 MySQLi 中有效吗?我不认识bindValue()
;这是bind_param()
吗?
是的,你是绝对正确的——习惯的力量,我道歉!将根据您的原始查询进行编辑。【参考方案3】:
当你说“添加一些逻辑”时,@Jay-Blanchard,我以为你是这个意思,而且效果很好:
$filter = " WHERE 0=?";
$value = 0;
if ( isset ( $_GET["value"] ) )
$filter = " WHERE `field`=?";
$value = $_GET["value"];
$sql = "SELECT * FROM `table`" . $filter . ";";
$prepare = $connect -> prepare( $sql );
$prepare -> bind_param( "i" , $value );
//etc.
好灵感!
【讨论】:
以上是关于在 MySQL 准备语句的 WHERE 子句中使用通配符的主要内容,如果未能解决你的问题,请参考以下文章