2013-11-14 2 views
0

У меня есть страница, показывающая активность пользователя, я создал форму, в которой пользователь может фильтровать это по дате.Отфильтровать поля базы данных по дате

Вот форма

<form action='filter_activity.php' method='get'> 
    From: <input type='text' name='from' value='dd/mm/yyyy'> 
    To: <input type='text' name='to' value='dd/mm/yyyy'> 
    <input type='submit' value='Filter'> 

Вот filter_activity.php страница:

$from=$_GET["from"]; 
$to=$_GET["to"]; 

$result=mysql_query("SELECT * FROM member WHERE personID=$user AND created between $from and $to "); 

Однако это ничего не показывает, кто может помочь?

+0

1. Вы широко открыты для SQL-инъекций 2. Вы должны инкапсулировать строки в кавычки в своем запросе 3. Ваш формат даты недействителен –

+0

Как дата хранится в вашей базе данных? Какой формат? – Gavin

+0

@ Gavin - хранится как '2013-11-14 19: 45: 00' (отметка времени) –

ответ

2

Ваши опубликованные даты находятся в недопустимом формате для использования БД. Вам необходимо преобразовать их перед использованием в БД.

$from = DateTime::createFromFormat('d/m/Y', $_GET['from']); 
$to = DateTime::createFromFormat('d/m/Y', $_GET['to']); 

$sql = " 
    SELECT * 
    FROM member 
    WHERE personID = $user AND created BETWEEN '%s' AND '%s' 
"; 
$sql = sprintf($sql, $from->format('Y-m-d'), $to->format('Y-m-d')); 

Кроме того, вы должны проверить, если $_GET ключи существует и после этого, проверьте $from и $to являются DateTime объекта, а не false.

+0

Спасибо, Однако, похоже, это ничего не значит? –

+0

@ user2149630: можете ли вы показать мне, что означает переменная '$ sql' после функции' sprintf() '? –

+0

Не могли бы вы открыть разговор? –

0

вам нужно бросить его на сегодняшний день, как:

$result=mysql_query("SELECT * FROM member WHERE personID=$user AND created BETWEEN DATE('$from') AND DATE('$to')") or die(mysql_error()); 

с сайта:

Для достижения наилучших результатов при использовании BETWEEN с указанием даты или времени значения, используйте CAST() явно преобразовать значение к желаемому типу данных. Примеры. Если вы сравниваете значение DATETIME с двумя значениями DATE , преобразуйте значения DATE в значения DATETIME. Если вы используете строковую константу, такую ​​как «2001-1-1» в сравнении с DATE, передают строку в DATE.

+0

MySQL 'DATE()' функция не конвертирует формат, а просто извлекает дату из формата даты. Попробуйте запустить 'SELECT DATE ('10/11/2013 ')' и посмотреть, что вы получаете. –

+0

Я не сказал этого –

0

Pass правильный формат даты в БД:

$from = date('Y-m-d', strtotime(str_replace('/', '-', $_GET["from"]))); 
$to = date('Y-m-d', strtotime(str_replace('/', '-', $_GET["to"]))); 

$result = mysql_query("SELECT * FROM member WHERE personID=$user AND created BETWEEN '$from' AND '$to'"); 

Действительно думать об изменении формата в форму. Я бы использовал выбор даты, раскрывая вниз год/месяц/день или javascript.

Также читайте другие комментарии о цитировании, SQL-инъекции и т. Д. И выходите из функций mysql_ *.

+0

'dd/mm/yyyy' недопустимый формат для PHP, поэтому' strtotime() 'будет терпеть неудачу, когда день будет больше 12. Это потому, что PHP предполагает, что данная дата является американским форматом даты' мм/дд/yyyy'. ** [Попробуйте] (https://eval.in/68217) **. –

+0

Ах, да, я не обращал на это внимания, просто это был не формат БД. Если - используется, он будет работать. Ред. 'strtotime()' любит 'm/d/Y' и' d-m-Y'. – AbraCadaver

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