在 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 子句中使用通配符的主要内容,如果未能解决你的问题,请参考以下文章

在 where 子句中具有多个条件的 PDO 准备语句

在mysql select语句中使用条件where子句

mysql语句where条件中的是啥意思

MySQL-过滤数据(WHERE语句)

MySQL where 子句

简单选择语句的where子句中的MySQL未知列