mysql pdo小于或大于日期字符

oo7oh9g9  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(252)

我使用的代码没有任何问题,通过非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])
b4wnujal

b4wnujal1#

最后我找到了问题的原因并解决了我的问题。实际上$params在日期的执行数组中也没有任何问题。问题来自 $extra=rtrim($extra, ' and '); 我改成 $extra=substr($extra, 0, -5); 再次和问题解决。
这是带substr的正确sql:

date_start >= :date_start and date_end <= :date_end

rtrim没有给出其他参数的任何错误,但当我将rtrim用于date\u end sql时,情况是这样的:

date_start >= :date_start and date_end <= :date_e

(从sql中的日期\u结束处删除了第nd个字符)
谢谢你的回答和建议。

相关问题