我通过非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])
答案 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字符)
感谢您的回答和建议。