我使用的代码没有任何问题,通过非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条答案
按热度按时间b4wnujal1#
最后我找到了问题的原因并解决了我的问题。实际上$params在日期的执行数组中也没有任何问题。问题来自
$extra=rtrim($extra, ' and ');
我改成$extra=substr($extra, 0, -5);
再次和问题解决。这是带substr的正确sql:
rtrim没有给出其他参数的任何错误,但当我将rtrim用于date\u end sql时,情况是这样的:
(从sql中的日期\u结束处删除了第nd个字符)
谢谢你的回答和建议。