Mysql pdo равно меньше, чем больше символов для даты - PullRequest
0 голосов
/ 28 мая 2018

Я использую этот код без проблем через не-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

IВ файле 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 голосов
/ 29 мая 2018

Наконец-то я нашел причину проблемы и решил ее.На самом деле $ params не имеет никаких проблем в массиве execute для дат.Проблема с $extra=rtrim($extra, ' and '); Я снова изменился на $extra=substr($extra, 0, -5);, и проблема исправлена.

Это правильный sql с substr:

date_start >= :date_start and date_end <= :date_end

rtrim не выдал ошибку для других параметров, нокогда я использовал rtrim для date_end sql, это произошло следующим образом:

date_start >= :date_start and date_end <= :date_e

(nd символ удален из date_end в sql)

Спасибо за ваши ответы и ваши предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...