Нужна помощь с запросом MySQL / PHP, включающим диапазоны дат - PullRequest
0 голосов
/ 02 октября 2009

По сути, мне нужно получить некоторую информацию об учетной записи из таблицы dbase, где у них есть клиент клиента, который был передан через GET, а дата размещения счета (dateplaced) находится между начальной и конечной датами, снова переданными из полей календаря через GET.

Запрос ниже не возвращает строк. Я проверил, что части запроса SELECT и FROM работают так, как задумано, и выбор клиента из GET работает нормально, так что остаются проблемы с датой. «dateplaced» хранится в базе данных в виде архива в формате «дд / мм / гггг». После исследования я обнаружил, что mysql хочет даты в формате "гггг-мм-дд". Я собрал воедино две части сравнения между данными GET и уверен, что они правильно отформатированы. Я просто попытался использовать dateplaced вместо str_to_date (), и это не сработало, поэтому я попробовал str_to_date (), как показано ниже, но все равно не работает.

Может кто-нибудь определить мою проблему здесь? Это сводит меня с ума.

$query = mysql_query("SELECT accountnumber, firstname, middlename, lastname, currentbalance FROM dbase WHERE clientname = '" . $_GET['client'] . "' AND str_to_date(dateplaced, '%Y-%m-%d') BETWEEN '" . $_GET['calendar_start_year'] . "-" . $_GET['calendar_start_month'] . "-" . $_GET['calendar_start_day'] . "' AND '" . $_GET['calendar_end_year'] . "-" . $_GET['calendar_end_month'] . "-" . $_GET['calendar_end_day'] . "' ORDER BY lastname") or die(mysql_error());

Ответы [ 2 ]

3 голосов
/ 02 октября 2009

str_to_date() принимает формат существующей строки, а не желаемую строку. Так вам нужно str_to_date(dateplaced, '%d/%m/%Y') чтобы получить Y-м-д.

Создайте дату вне запроса. Проще отладить.

$clean_name=mysqli_real_escape_string($_GET['client']);
$start_date=date_create("{$_GET['calendar_start_year']}-{$_GET['calendar_start_month']}-{$_GET['calendar_start_day']}")->format('Y-m-d');
$end_date=date_create("{$_GET['calendar_end_year']}-{$_GET['calendar_end_month']}-{$_GET['calendar_end_day']}")->format('Y-m-d');

$q="SELECT accountnumber, firstname, middlename, lastname, currentbalance 
FROM dbase 
WHERE clientname = '{$clean_name}' 
  AND str_to_date(dateplaced, '%d/%m/%Y') BETWEEN '$start_date' AND '$end_date' 
ORDER BY lastname;

PS, убери все свои переменные. Там могут быть кавычки или другие символы, которые нужно экранировать (или попытки злого хакера). mysqli_real_escape_string() это то, что вы должны использовать.

0 голосов
/ 02 октября 2009

Прежде всего, вы оставили себя широко открытыми для внедрения SQL-кода, не экранируя свои пользовательские переменные перед вставкой их в ваш запрос (см. mysql_real_escape_string).

Причина, по которой ваш запрос не работает, заключается в том, что второму параметру STR_TO_DATE нужен формат исходной строки, а не формат, в который вы пытаетесь преобразовать.

// extract variables
$client = $_GET['client'];

$startYear = $_GET['calendar_start_year'];
$startMonth = $_GET['calendar_start_month'];
$startDay = $_GET['calendar_start_day'];

$endYear = $_GET['calendar_end_year'];
$endMonth = $_GET['calendar_end_month'];
$endDay = $_GET['calendar_end_day'] ;

// parse variables
$startDate = mktime(0, 0, 0, $startMonth, $startDay, $startYear);
$endDate = mktime(0, 0, 0, $endMonth, $endDay, $endYear);

// query database
$sql = sprintf(
   "SELECT accountnumber,
           firstname,
           middlename,
           lastname,
           currentbalance
    FROM dbase
    WHERE clientname = '%s'
    AND STR_TO_DATE(dateplaced, '%d/%m/%Y') BETWEEN '%s' AND '%s'
    ORDER BY lastname",
    mysql_real_escape_string($client),
    date('Y-m-d', $startDate),
    date('Y-m-d', $endDate));

$result = mysql_query($sql) or die(mysql_error());
...