【发布时间】:2014-04-11 09:17:00
【问题描述】:
我在 mysqli 准备语句中获得所需结果时遇到问题。我在 where 条件下同时使用 like 和 =。
//我的搜索变量
$a = "%{$_REQUEST['a']}%";
$b = "%{$_REQUEST['b']}%";
$search_from_date = $_REQUEST['from_date'];
$search_to_date = $_REQUEST['to_date'];
//我的查询
$q = $mysqli->prepare("SELECT t1.* from table1 t1 where (t1.a like ? and t1.b like ?) and (date(last_updated) between ? and ?) limit ".$start.','.$per_page);
$q->bind_param('ssss',$a,$b,$search_from_date,$search_to_date);
如果在搜索时考虑了日期,我将无法获得结果。如果我从其他字段的语句搜索中删除日期,效果很好。
告诉我,如果没有针对该搜索条件的输入,我如何从语句中删除搜索条件本身。我的意思是,如果未指定 to_date,则查询应将该列替换为 1
即使没有指定搜索条件,我也会得到默认的 30 行。
【问题讨论】:
-
您也应该使用占位符来表示开始和每页变量
-
感谢您将更新它。告诉我如果没有针对该搜索条件的输入,我如何从语句中删除搜索条件本身。我的意思是,如果未指定 to_date,则查询应将该列替换为 1
-
您可以为您的查询设置一个字符串,并在您的 PHP(或等效项)中使用一个 IF 语句来选择性地将 AND 项添加到您的 WHERE 子句中。然后,一旦你的字符串完成,你就可以使用它了。
-
@Chrisky 没那么简单。使用未知数量的占位符,您可以使用 call user func stuff
-
如果您使用绑定功能并有占位符,那么您确实必须巧妙地填写这些占位符。但是,如果您连接格式良好的术语来构造 SQL,则可以成功地完成此类操作。另一种方法:有一些“SkipDateTerm”布尔参数,然后在SQL中你有:
AND (? = 1 OR timestamp between ? and ?),然后绑定到SkipDateTerm、FromDate和ToDate。
标签: select mysqli prepared-statement sql-like