2009-10-02 31 views
0

基本上我需要檢索從那裏他們已經通過獲得通過客戶端的客戶端的dBASE表的一些帳戶信息,帳戶放置日期(dateplaced)是通過GET從日曆字段再次傳遞的開始和結束日期之間。需要與一個MySQL/PHP查詢涉及日期幫助範圍

下面的查詢不返回行。我已驗證查詢的SELECT和FROM部分按預期工作,並且從GET中選擇的客戶端正常工作,因此會留下日期問題。 「dateplaced」作爲「dd/mm/yyyy」格式的varchar存儲在數據庫中。經過研究,我發現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 2009-10-02 16:08:11

0

首先,你已經將它們插入到你的查詢(見mysql_real_escape_string)前離開自己敞開的SQL注入通過不逃避你的用戶變量。

您的查詢不起作用的原因是因爲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());