基本上我需要从dbase表中检索一些帐户信息,其中他们有通过GET传递的客户端客户端,并且帐户放置日期(dateplaced)位于从日历字段再次传递的开始日期和结束日期之间通过GET。
以下查询不返回任何行。我已经验证查询的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());
答案 0 :(得分: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()
是您应该使用的。
答案 1 :(得分: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());