2009-10-02 8 views
0

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

В нижеприведенном запросе нет строк. Я проверил, что части запроса SELECT и FROM работают по назначению, а клиентский выбор из GET работает отлично, поэтому это оставляет проблемы с датой. «dateplaced» хранится в базе данных как varchar в формате «dd/mm/yyyy». При исследовании я обнаружил, что mysql хочет видеть даты в формате «yyyy-mm-dd». Я собрал две части сравнения между данными 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()); 

ответ

3

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

Создайте дату создания за пределами запроса. Легче отлаживать.

$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

Спасибо! Оба ответа на этот вопрос решают мою проблему! Я не могу отметить оба, так как я принимаю это, потому что он был первым. – DWilliams

0

Прежде всего, вы оставили себя широко открытым для 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());