我有一个mysql datetime字段,用'2013-12-25 00:00:00'
格式存储日期
我需要使用以下查询选择表中任何月份的所有记录:
$sql = "SELECT *
FROM `images`
WHERE (photodate BETWEEN '2003-11-01 00:00:00' AND '2003-12-03 00:00:00')
ORDER BY photodate DESC
LIMIT 30";
上面的选择查询可以很好地完成工作。
为了更改日期,我需要将'2003-11-01 00:00:00'AND'2003-12-03 00:00:00'
替换为变量,因此我使用来自$startyear
和$startmonth
的两个下拉列表中的输入数据设置变量并进行转换我认为这是正确的形式使用:
$startdate = $startyear."-".$startmonth."-01 00:00:00";
我通过将$enddate
添加到1
来对$startmonth
执行相同操作。
我的代码变为:
$sql = "SELECT *
FROM `images`
WHERE (photodate BETWEEN $startdate AND $enddate)
ORDER BY photodate DESC
LIMIT 30";
这根本不起作用并且给出了MySQL错误。经过一个月的挣扎,在任何使用变量而不是文本的论坛上什么都没找到,我完全不知道如何做到这一点。所有帮助表示赞赏。
答案 0 :(得分:3)
你很容易受到SQL injection attacks的攻击,这就是为什么它无效。您正在生成文字查询
... WHERE (photodate BETWEEN 2003-11-01 00:00:00 AND 2013-12-03 00:00:00)
2003-11-01
和2013-12-03
将被解释为一系列数学减法,而00:00:00
将是一个简单的平坦语法错误。您需要至少引用这些值:
... WHERE (photodate BETWEEN '$startdate' AND '$enddate')
^----------^-----^--------^--- note the quotes
这样mysql就可以看到整个日期作为日期值,而不是一些任意破坏的字符串。
答案 1 :(得分:0)
我猜你错过了一些撇号......试试这个:
$sql = "SELECT * FROM images WHERE (photodate BETWEEN '$startdate' AND '$enddate') ORDER BY photodate DESC LIMIT 30";
答案 2 :(得分:0)
您可能遇到逻辑问题。在$enddate
中,在开始月份中添加1不会给你13?
尝试在变量出现时打印出内容$sql
,并查看它与工作$sql
的对比情况。
答案 3 :(得分:0)
请添加撇号查询(并使用mysql_real_escape_string,PDO绑定值,mysqli_real_escape_string清理变量):
$sql = 'SELECT * FROM 'images' WHERE (photodate BETWEEN '.$startdate.' AND '.$enddate.') ORDER BY photodate DESC LIMIT 30';
稍微提醒一下,你不应该使用MySQL(不推荐使用旧的......而不是那么快),如果你使用MySQLi或者要使用它,请像这样清理你的变量,因为Marc B说它可能会破坏您的脚本和应用安全性:
<?php
// Starting MySQLi Connection
$db = mysqli_connect("host", "user", "password", "dbname");
// Sanitizing your variables
$startdate = mysqli_real_escape_string($db, $startdate);
$enddate = mysqli_real_escape_string($db, $enddate);
// Query
$sql = "SELECT * FROM 'images' WHERE (photodate BETWEEN ".$startdate." AND ".$enddate.") ORDER BY photodate DESC LIMIT 30";
// Doing the query and print the result array
$var = mysqli_query($db, $sql);
print_r($var);
// Closing connection
mysqli_close($db);
?>
请参考to this获取PDO方式或to this获取MySQLi方式,您也可以将MySQL_real_escape_string检查为PHP文档,但自PHP 5.5以来不推荐使用MySQL函数