2015-01-26 1 views
2

Я пытаю следующее:PHP PDO заявление: кавычки в кавычках вызывают запрос на неудачу

$stmt = $db->prepare("SELECT * FROM table WHERE date 
         BETWEEN :year-:month-01 AND :year-:month-01 + 
         INTERVAL 1 MONTH"); 
$stmt->bindValue(':year', $year, PDO::PARAM_STR); 
$stmt->bindValue(':month', $_POST["month"], PDO::PARAM_STR); 
$stmt->execute(); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 

Когда $year равна 2015 и $_POST["month"] равен 06, то запрос должен давать результаты, но это не делает. Я мог бы сделать $year a PDO::PARAM_INT, но это все равно оставляет меня с $_POST["month"], который является строкой (01 .. 12).

Однако при тестировании с этой небольшой корректировки, удаление привязок ...

BETWEEN "2015-06-01" AND "2015-06-01" + 
INTERVAL 1 MONTH"); 

Запрос преуспевает и результаты показывают. Я думаю, что это происходит потому, что между-датами, которые сервер получает выглядеть следующим образом:

'2015'-'06'-01 

Итак, мой вопрос заключается в следующем:

Как «побег» или «удалить» кавычки внутри PDO подготовленные заявления? Должен быть элегантный способ решить эту проблему.

+0

Edit, для записи: я забыл добавить кавычки в моей 'настройки'. Оба экземпляра 2015-06-01 должны быть в кавычках. Я соответствующим образом отредактировал свой вопрос. – Dave

ответ

1

Я бы даже не стал пытаться связывать части параметра. Кроме того, вы не можете повторно использовать именованные параметры (в большинстве случаев), см http://php.net/manual/pdo.prepare.php

Вы не можете использовать именованный маркер параметра с тем же именем более одного раза в подготовленном заявлении, если режим эмуляции не включен.

Просто связать все требуемое значение, например

BETWEEN :start AND :end + INTERVAL 1 MONTH 

и ...

$date = sprintf('%04d-%02d-01', $year, $month); 
$stmt->bindParam(':start', $date); 
$stmt->bindParam(':end', $date); 
+0

TBH Phil, я не был полностью уверен в моем ответе. Я удалил его. –

+0

Спасибо, это решило мою проблему еще более элегантным способом, чем я подозревал. – Dave

Смежные вопросы