簡體   English   中英

在涉及日期范圍的MySQL / PHP查詢方面需要幫助

[英]Need help with a MySQL/PHP query involving date ranges

從本質上講,我需要從dbase表中檢索一些客戶信息,在該數據庫中,他們具有已通過GET傳遞的客戶的客戶,並且帳戶放置日期(已放置日期)介於再次通過GET從日歷字段傳遞的開始和結束日期之間。

下面的查詢不返回任何行。 我已經驗證查詢的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());

str_to_date()采用現有字符串的格式,而不是所需的字符串。 因此,您需要str_to_date(dateplaced, '%d/%m/%Y')來獲取Ymd。

在查詢之外創建日期。 調試起來更容易。

$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()

首先,通過在將用戶變量插入查詢中之前不轉義用戶變量,您可以自由地進行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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM