Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何显示我的WHERE条件以正确返回行?_Php_Pdo - Fatal编程技术网

Php 如何显示我的WHERE条件以正确返回行?

Php 如何显示我的WHERE条件以正确返回行?,php,pdo,Php,Pdo,我正在努力找出为什么我的查询返回零行。我曾在一次会议上广泛地试图弄明白这一点,但没有取得令人满意的结果 它的jist是: $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");

我正在努力找出为什么我的查询返回零行。我曾在一次会议上广泛地试图弄明白这一点,但没有取得令人满意的结果

它的jist是:

    $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']) );
EDIT:这个查询应该说取日期,将其设置为过去三个月,并将其命名为$mydate。然后从BarTable中获取postdate大于$mydate的所有字段,然后执行查询。

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

我不明白我是怎么说的
:postdate
不等于3个月前,因此
postdate=:postdate
不能选择postdate等于3个月前的行

为了正确显示我的行,我之前键入了
WHERE postdate>“$mydate”


如何键入
postdate=:postdate和postdate>“$mydate”
,以便我使用一个参数并确保选择的数据大于
$mydate

如果我理解正确(我完全不确定),您希望使用
而不是
$foo_query=$DBH->prepare("SELECT * FROM BarTable WHERE postdate = :postdate OR postdate > '$mydate' ORDER BY postdate DESC");
$foo_query=$DBH->prepare(“从BarTable中选择*,其中postdate=:postdate或postdate>“$mydate”按postdate DESC排序”)


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

上发布的帖子。您需要绑定
postdate
的参数。此外,为了满足这两个条件,
postdate=:postdate和postdate>$mydate
,您需要在查询中使用

$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']) );
我推荐“中间人”:


如果您想进行参数绑定,可以尝试这样做,假设您的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(); 

您的
postdate
不能等于某个日期,也不能大于某个日期。您的意思是使用
还是
?您到底想查询什么?最近三个月以上的行,或在
$\u REQUEST['postdate']
中指定的日期的行,或两者都有?您想要实现什么?你想要比3个月前晚的帖子吗?或者你想要在:postdate?上发布的帖子吗?又是:
postdate=:postdate和postdate>“$mydate”
一个日期怎么可能等于一个日期而大于一个日期?@JvdBerg-他比较的两个日期是分开定义的
$mydate
来自strotime,postdate来自
$\u REQUEST
。抱歉,我没有包括绑定,但我不确定是否需要包括该区域。我为什么要使用或?我希望标准同时满足这两个条件,而不是一个或另一个?假设
$mydate='2012-07-03',和:postdate='2012-08-05'
,当您说
postdate=:postdate和postdate>'$mydate'
时,它只会在
postdate='2012-08-05'时检查值,由于
=
运算符将要搜索的值设置为“2012-08-05”。如果这是您想要的,它将不会提取say
postdate='2012-08-10'
的记录,然后保持查询原样,使用
,要使用操作符
,您需要在这一行中的日期格式为
'Ymd'
$mydate=date(“Ymd”,strotime(-3个月”)以便比较整数。当以这种方式使用或时,此查询是否仍被视为参数化?显然,SQL注入预防很重要,所以通过使用或所有结果都将包含该参数?我感觉是吗?这不起作用,因为查询最终不应该显示早于$mydate中设置的日期的结果,而是显示所有其他结果这可能与我上面提出的问题有关。是否适用于该查询?我想同时满足postdate等于参数:postdate,并且postdate大于$mydate中设置的日期(三个月前)@tomdot:如果您想同时满足这两个条件,即即使请求查询(但太旧),也不要显示查询,而不是您和。如果两者都需要,请选择或。感谢提供有关字段是日期还是时间戳的信息。这将是有益的!
$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();