2010-08-07 5 views
0

나는 다음과 같은 SQL이 있습니다SQL 날짜 시간 변환

`table1`.`DateField` >= DATE_SUB(NOW(), INTERVAL {$days} DAY 

내 table1.DateField은 2010-03-10 10시 5분 50초의 형식으로되어 있습니다.

{$ days}의 값은 4 시간 또는 3 일이 될 수 있습니다. 위의 SQL을 어떻게 알 수있을만큼 똑똑하게 만들 수 있습니까? 나는 당신이, 당신이 해결해야 할 수

`table1`.`DateField` >= DATE_SUB(NOW(), INTERVAL {$days} DAY_HOUR 

답변

4

"4 시간 삼일 될 수있다"- 그것은 4 HOUR 또는 3 DAY 수 없습니다?
잘못된 단위 나 악의적 인 (사용자) 입력에 대해 걱정해야합니까?
주어진 문자열을 테스트하고 MySQL을 이해할 수있는 단위로 "변환"할 수 있습니다.

<?php 
$pattern = '!^(\d+) (.+)$!'; 
$units = array(
    'days'=>'DAY', 
    'hours'=>'HOUR', 
    'minutes'=>'MINUTE' 
); 

foreach(array('14 days', '7 hours', '11 hours', '1 or 1=1') as $userinput) { 
    echo "\n", $userinput, ': '; 
    if (!preg_match($pattern, $userinput, $m) || !isset($units[$m[2]])) { 
    echo "error, cause: ...\n"; 
    continue; 
    } 

    $sql = sprintf(' ... 
    WHERE 
     `table1`.`DateField` >= Now() - INTERVAL %d %s', $m[1], $units[$m[2]] 
); 
    echo $sql, "\n"; 
} 

인쇄

14 days: ... 
    WHERE 
     `table1`.`DateField` >= Now() - INTERVAL 14 DAY 

7 hours: ... 
    WHERE 
     `table1`.`DateField` >= Now() - INTERVAL 7 HOUR 

11 hours: ... 
    WHERE 
     `table1`.`DateField` >= Now() - INTERVAL 11 HOUR 

1 or 1=1: error, cause: ... 
1

을 사용해야합니다

"`table1`.`DateField` >= DATE_SUB(NOW(), 
    INTERVAL {$hoursOrDays} ".($isDays?"DAY":"HOUR")