【问题标题】:Using like and = in same mysqli prepared statement在同一个mysqli准备好的语句中使用like和=
【发布时间】: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 ?),然后绑定到SkipDateTermFromDateToDate

标签: select mysqli prepared-statement sql-like


【解决方案1】:

日期格式很可能不兼容。许多数据库使用本地 ISO 8601 日期 (yyyy-mm-dd)。您能确保您的请求日期格式正确吗?

【讨论】:

  • 您能否运行一些测试代码,例如选择日期(?)、日期(?)并将其绑定到您的输入日期,以演示它们是如何被解释的?
猜你喜欢
  • 1970-01-01
  • 2015-04-07
  • 2011-03-07
  • 2012-12-01
  • 1970-01-01
  • 2016-07-22
  • 2017-09-02
  • 2011-07-19
  • 1970-01-01
相关资源
最近更新 更多