【问题标题】:How do present my WHERE conditions to return rows correctly?如何呈现我的 WHERE 条件以正确返回行?
【发布时间】:2012-09-24 19:22:29
【问题描述】:

我正在努力找出为什么我的查询返回零行。我已经在this question 广泛尝试解决这个问题,但没有得到体面的结果。

它的要点是:

    $mydate=date("Y-m-d",strtotime("-3 months"));

    $foo_query=$DBH->prepare("SELECT * FROM BarTable WHERE postdate = :postdate AND postdate > '$mydate' ORDER BY postdate DESC");
    $foo_query->execute( array('postdate' => $_REQUEST['postdate']) );

编辑:这个查询应该说获取日期,将其设置为过去三个月,然后将其命名为 $mydate。然后从 BarTable 中取出 postdate 大于 $mydate 的所有字段,然后执行查询。

刚刚有人向我指出,我所说的是我正在选择 postdate 等于 3 个月前并且也大于 $mydate 的行。

我不明白我在说什么。 :postdate 不等于 3 个月前,所以 postdate = :postdate 不能选择 postdate 等于 3 个月前的行。

为了正确显示我的行,我之前输入了WHERE postdate > '$mydate'

如何键入postdate = :postdate AND postdate > '$mydate' 以便我使用参数并确保根据大于$mydate 选择数据?

【问题讨论】:

  • 您的postdate 不能等于某个日期并且大于某个日期。你的意思是使用OR
  • 您到底想查询什么?三个月后的行,或$_REQUEST['postdate'] 中指定日期的行,或两者兼而有之?
  • 你想要达到什么目的?您想要晚于 3 个月前的帖子吗?还是您想要发布于 :postdate 的帖子??
  • 又是这样:postdate = :postdate AND postdate > '$mydate' 一个日期怎么可能等于一个日期并且大于一个日期?
  • @JvdBerg - 他比较的两个日期是分开定义的。 $mydate 来自 strtotime,而 postdate 来自 $_REQUEST

标签: php pdo


【解决方案1】:

如果我对您的理解正确(我完全不确定),您需要OR 而不是AND

$foo_query=$DBH-&gt;prepare("SELECT * FROM BarTable WHERE postdate = :postdate <strong>OR</strong> postdate &gt; '$mydate' ORDER BY postdate DESC");

这样,您可以同时获得 3 个月前的帖子和在 :postdate 上发布的帖子。

【讨论】:

  • 这可能与我上面提出的问题有关。 OR 是否适合查询?我想同时满足 postdate 等于参数 :postdate,并且 postdate 大于 $mydate 中设置的日期(三个月前)
  • @tomdot:如果您想同时满足这两个条件,即即使请求(但太旧)也不显示查询,而不是 AND。如果两者都需要,请使用 OR。
【解决方案2】:

您需要为postdate 绑定参数。此外,要同时满足这两个条件 postdate = :postdate and postdate &gt; $mydate,您需要在查询中使用 OR

$mydate=date("Y-m-d",strtotime("-3 months"));
$foo_query=$DBH->prepare("SELECT * FROM BarTable WHERE postdate = :postdate OR postdate > '$mydate' ORDER BY postdate DESC");
$foo->bindParam(':postdate', $_REQUEST['postdate'], PDO::PARAM_STR);
$foo_query->execute();

或者与您在问题中提到的类似,您在分配 :postdate 时错过了 :

 $mydate=date("Y-m-d",strtotime("-3 months"));
 $foo_query=$DBH->prepare("SELECT * FROM BarTable WHERE postdate = :postdate OR postdate   '$mydate' ORDER BY postdate DESC");
 $foo_query->execute( array(':postdate' => $_REQUEST['postdate']) );

【讨论】:

  • 抱歉,我没有包含绑定,但这也是我不确定是否需要包含的区域。我为什么要使用 OR?我希望标准满足两者,而不是其中一个?
  • 假设$mydate = '2012-07-03', and :postdate = '2012-08-05',当你说postdate = :postdate AND postdate &gt; '$mydate'时,它只会检查postdate = '2012-08-05'时的值,因为=运算符将要搜索的值设置为'2012-08-05 '。它不会拉记录说postdate = '2012-08-10'
  • 如果这就是你想要的,那么保持查询原样,使用AND
  • 另外,要使用运算符&gt;,您需要在$mydate=date("Ymd",strtotime("-3 months"));这一行中将日期格式设置为'Ymd',以便比较整数。
  • 以这种方式使用 OR 时,此查询是否仍被视为参数化?显然,防止 SQL 注入很重要,所以通过使用 OR,所有结果都会包含该参数吗?我觉得是吗?
【解决方案3】:

我推荐“BETWEEN”:

$foo_query=$DBH->prepare(
  "SELECT * FROM BarTable 
  WHERE postdate between ':somedate' AND '$mydate' 
  ORDER BY postdate DESC");

【讨论】:

  • 这不起作用,因为查询最终不应显示早于 $mydate 中设置的日期的结果,而是显示所有其他结果
【解决方案4】:

如果你想做参数绑定,你可以试试这个,假设你的 postdate 是一个日期字段

$foo_query=$DBH->prepare("
   SELECT * FROM BarTable 
   WHERE postdate = :postdate AND postdate > '$mydate' ORDER BY postdate DESC");
$foo_query->bindParam(':postdate', $_REQUEST['postdate'], PDO::PARAM_STR);
$foo_query->execute(); 

但是,如果您的 postdate 是 时间戳,它应该如下所示:

$foo_query=$DBH->prepare("
   SELECT * FROM BarTable 
   WHERE postdate = :postdate AND postdate > '$mydate' ORDER BY postdate DESC");
$foo_query->bindParam(':postdate', $_REQUEST['postdate'], PDO::PARAM_INT);
$foo_query->execute(); 

【讨论】:

  • 感谢您提供有关字段是日期还是时间戳的信息。这会很有帮助!
猜你喜欢
  • 2013-03-20
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
相关资源
最近更新 更多