Mysql pdo等于大于date的字符

时间:2018-05-28 05:04:34

标签: php mysql pdo

我通过非pdo使用该代码没有任何问题。

mysql_query("
  SELECT * FROM table
  WHERE date_start >= '$date_start'
  and date_end <= '$date_end'
");

但是当我尝试使用pdo时,代码无效。

$query = $this->db->prepare("
  SELECT * FROM table
  WHERE date_start >= :date_start
  and date_end <= :date_end
");

$query->execute(array(
  'date_start'=>'2017-05-01 00:00', 
  'date_end'=>'2017-05-30 00:00'
));

我可以获得帮助吗?哪里有问题?

更多信息:(已编辑)

系统:Windows(Appserv)

PHP版本:5.6.30

我没有在error.log文件中看到任何错误。

我猜问题来自$ params数组。因为这样工作:

$query = $db->prepare("SELECT * FROM brands WHERE brand_status=:brand_status and date_start >= :date_start and date_end <= :date_end");
$query->execute(array('brand_status'=>$brand_status, 'date_start'=>$date_s, 'date_end'=>$date_e));

但是当我使用execute(array($params))时没有工作。实际上如果我不使用日期参数工作,但当我使用日期参数不工作。我的示例代码如下:

$extra = '';
$params = array();

$sql = "SELECT * FROM brands ORDER BY brand_name";

$brand_status = "1";
$brand_name = "";
$date_start = "2017-05-01 00:00:00";
$date_end = "2017-06-30 23:59:59";

if ($brand_status) {
$extra .= "brand_status=:brand_status and ";
$params[] = array("brand_status" => $brand_status);
}

if ($brand_name) {
$extra .= "brand_name LIKE :brand_name and ";
$params[] = array("brand_name" => "%" . $brand_name . "%");
}

if (dbDate($date_start)==1 and dbDate($date_end)==1)
{
$extra .= "date_start >= :date_start and date_end <= :date_end and ";
//problem here:
$params['date_start'] = $date_start;
$params['date_end'] = $date_end;
}


if (count($params) > 0) {
    if (strlen($extra) > 0) {
        $extra = rtrim($extra, ' and ');
    }
    $sql = "SELECT * FROM brands WHERE $extra ORDER BY brand_name";
    $query = $db->prepare($sql);
    $result = $query->execute($params);
} else {
    $result = $query = $db->query($sql);
}

if($result)
    $num = $query->rowCount();
if($num > 0) {
    while($row = $query->fetch()) {
        echo $row['brand_name'] . "<br>";
    }
}


function dbDate($value)
{
$pattern = "/^1|2[0-9]{3}\-(0[1-9]|1[0-2])\-(0[1-9]|[1-2][0-9]|3[0-1])( [0-9]{2}:[0-9]{2}(:[0-9]{2})?)?$/";
if (preg_match($pattern, $value, $m)) { return 1; } else { return 0; }
}

如何解决日期的$ params问题?菲尔抱歉,我的英语不好。我完全不明白你的建议。我想你找到了问题的原因。

execute(['date_start' => $date_start, 'date_end' => $date_end])

1 个答案:

答案 0 :(得分:0)

最后我找到了问题的原因并解决了我的问题。实际上$ params在日期的执行数组中也没有任何问题。来自$extra=rtrim($extra, ' and ');的问题我再次更改为$extra=substr($extra, 0, -5);并修复了问题。

这是正确的sql with substr:

date_start >= :date_start and date_end <= :date_end

rtrim没有给其他参数带来任何错误,但是当我使用rtrim for date_end sql时就是这样:

date_start >= :date_start and date_end <= :date_e

(从sql中的date_end中删除了nd字符)

感谢您的回答和建议。