2015-02-06 3 views
2

Теперь, тогда.Выберите строки между двумя датами, в которых датами являются переменные.

У меня есть инструкция SELECT в php, и мне нужно выбрать все строки таблицы, где столбец «дата» находится между датой начала и датой окончания, которая будет определяться переменными.

Я это прекрасно работает хорошо, когда я определяю дату непосредственно в ЗЕЬЕСТЕ, как показано ниже:

date BETWEEN "2015-02-03" AND "2015-02-05" 

Однако, когда я пытаюсь сделать то же самое, но с переменными, это не кажется работать:

date BETWEEN "$startdate" AND "$enddate" 

Где

$startdate = "2015-02-03"; 
$enddate = "2015-02-05"; 

Надежда все это имеет смысл, Приветствия в авансовый.

Полного фрагмент код здесь по запросу:

$startdate = "2015-02-03"; 
$enddate = "2015-02-05"; 

$sql = 'SELECT record_number, date, manmod, description, cal, serial, datein, dateout, retdate, refex, refexdate, sellersname, sellersaddress, buyersname, buyersaddress, rfddealer, del, warranty, months FROM record WHERE del="Live" AND date BETWEEN "$startdate" AND "$enddate" ORDER BY record_number DESC'; 
+0

Поскольку первый запрос (без переменных дат) работает нормально, проблема, вероятно, заключается в создании PHP запроса. Можете ли вы проверить, что выполняемый запрос в порядке? –

+1

Можете ли вы показать свой полный фрагмент, пожалуйста? – Mureinik

+0

только что добавил полный фрагмент кода, спасибо –

ответ

1

От PHP website:

Примечания : В отличие от синтаксисов double-quoted и heredoc, variables и escape se запросы для специальных символов не будут расширены, если они встречаются в одинарных кавычках string.

Другими словами, поскольку ваш запрос в одинарные кавычки, то $startdate и $enddate переменные не интерпретируются как переменные. SQL запрос, отправить в базу данных будет содержать буквально $startdate и $enddate, и, следовательно, будет выглядеть примерно так:

'SELECT column1, column2 FROM table WHERE date BETWEEN "$startdate" AND "$enddate" ORDER BY record_number DESC'; 

(я упростил запрос немного для целей удобочитаемости)

Очевидно, база данных не знает, как интерпретировать переменные PHP, она будет искать записи с датой между этими двумя строками, не находит ничего и поэтому возвращает 0 записей.

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

Вариант 1: заменить одиночные кавычки двойные кавычки

Если вы выбираете этот вариант, убедитесь, что вы либо избежать существующих двойные кавычки, или изменить их в одинарные кавычки:

$sql = "SELECT column1, column2 FROM table WHERE date BETWEEN '$startdate' AND '$enddate' ORDER BY record_number DESC"; 

вариант 2: сцепить строки вручную

Вы также можете вручную создать запрос вручную из нескольких частей и склеить их вместе с помощью оператора конкатенации PHP, точки (.).

$sql = 'SELECT column1, column2 FROM table WHERE date BETWEEN "' . $startdate . '" AND "' . $enddate; 
+0

Дамы и господа, у нас есть победитель, возьмите бант сэр. –

+0

Счастливые помочь. О, и если переменные '$ startdate' и' $ enddate' поступают с пользовательского ввода, убедитесь, что вы знаете, что такое SQL-инъекция и как ее предотвратить. В противном случае ваше приложение/веб-сайт может быть уязвимым для атак. –

0

Вы должны преобразовать его в больший и меньший, чем уравнение:

date > '$startdate' AND date < '$enddate' 
+0

Привет, я действительно пробовал это раньше, и он все еще не работал, спасибо за ввод. –

0

Проблема не с вашим SQL, а с вашим PHP.

Вам необходимо прочитать, как работает string concatenation, и как PHP обрабатывает строки, которые используют ' и " по-разному, когда обернут вокруг строк.

$sql = 'SELECT * FROM record WHERE date BETWEEN "$startdate" AND "$enddate"'; 

Должен быть изменен на один из следующих вариантов:

$sql = 'SELECT * FROM record WHERE date BETWEEN "' . $startdate . '" AND "' . $enddate . '"'; 

ИЛИ:

$sql = "SELECT * FROM record WHERE date BETWEEN '$startdate' AND '$enddate'"; 

Я упростил SQL, чтобы выделить реальную проблему под руку.

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