2009-10-02 6 views
0

기본적으로 GET을 통해 전달 된 클라이언트의 클라이언트가있는 dbase 테이블에서 일부 계정 정보를 검색해야하며 계정 배치 날짜 (dateplaced)는 다음과 같습니다. 캘린더 필드에서 GET을 통해 다시 전달 된 시작일과 종료일 사이.날짜 범위와 관련된 MySQL/PHP 쿼리에 대한 도움이 필요합니다.

아래 쿼리는 행을 반환하지 않습니다. 쿼리의 SELECT 및 FROM 부분이 의도 한대로 작동하고 GET에서 클라이언트 선택이 올바르게 작동하여 날짜 문제가 남았 음을 확인했습니다. "dateplaced"는 "dd/mm/yyyy"형식의 varchar로 데이터베이스에 저장됩니다. 연구에 나는 mysql이 "yyyy-mm-dd"형식으로 날짜를 원한다는 것을 발견했습니다. 나는 GET 데이터와 비교할 때의 두 부분을 종합 해 보았습니다. 올바르게 형식화되었는지는 확실합니다. str_to_date() 대신 "dateplaced"를 사용하여 정상적으로 시도했지만 작동하지 않으므로 아래에 표시된 것처럼 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()은 원하는 문자열이 아닌 기존 문자열의 형식을 취합니다. Y-m-d를 얻으려면 str_to_date(dateplaced, '%d/%m/%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

감사합니다. 이 질문에 대한 답은 모두 내 문제를 해결합니다! 나는 둘 다 받아 들일 수있는 것으로 표시 할 수 없으므로 처음부터 이걸 치고있다. – 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());