我无法使用以下代码:
// dd/mm/yyyy for dates in SQL queries
$todayforw = date('d/m/Y');
$aweekago = date('d/m/Y', time() - 604800);
$week_e_check = mysql_query("SELECT * FROM earningslog WHERE user_id = '".$info['id']."' WHERE day >='".$aweekago."' AND day <'".$todayforw."'");
while ($week_e_info = mysql_fetch_array($week_e_check)) {
$week_e = $week_e + $week_e_info['user_earnings_amnt'];
}
查询返回零行,但是,它应该返回符合条件的数据。
答案 0 :(得分:1)
尝试将字符串的格式从d / m / Y更改为Y-m-d。
MySQL可能会在第一年就期待它。在这种情况下,它可能用d / m / Y做错了。
也不要两次使用WHERE子句。相反,使用AND组合条件,例如:
WHERE user_id = '".$info['id']."'
AND day >='".$aweekago."'
AND day <'".$todayforw."'
顺便说一下,您也可以尝试说WHERE day BETWEEN ".$aweekago." AND ".$todayforw."
,这可能是更容易阅读的语法(只要您将$ todayforw更改为前一天)。
答案 1 :(得分:1)
检查您的日期格式:
应该是:
YYYY-mm-dd HH:mm:ss
E.G。 2012-01-01 00:00:00(2012年1月1日当地时间午夜)
其他日期格式可以工作,但最好的方法是使用MySQL在显示日期时使用的相同格式,这是我知道每次都有效的唯一方式。
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
你的语法也不正确,你有两个,你应该使用AND。
答案 2 :(得分:1)
仔细查看您的查询:
SELECT * FROM earningslog WHERE user_id = '".$info['id']."' WHERE day >='".$aweekago."' AND day <'".$todayforw."'"
您的Where子句出现两次。
要考虑的两件事 - 当您选择数据时,请尝试远离选择* - 您可能会得到意外的表格结果。
其次,尝试将查询创建为参数化查询,而不是将参数直接注入到where子句中。通过以您的方式直接注入您的标准,您可以自己开始SQL注入攻击。
通过将其转换为参数化查询,您可以直接针对数据库调试查询,从而减少将查询工具复制到代码中所需的工作量。
答案 3 :(得分:1)
您的问题似乎与您的查询语法有关。您正在说明WHERE两次,而您应该只声明一次,然后使用AND或OR运算符作为进一步的标准。我还建议您将语句移动到变量中或使用die()
来帮助调试。
$week_e_check = mysql_query("SELECT * FROM earningslog WHERE user_id = '".$info['id']."' AND day >='".$aweekago."' AND day <'".$todayforw."'") or die(mysql_error());
此外,您不应该使用mysql扩展名,因为不鼓励使用此扩展名。相反,请使用MySQLi或PDO_MySQL扩展名。使用这些替代扩展之一将有助于防止SQL注入的第一步。我还建议你避免使用*
并指定要返回的列名。
使用PDO:
<?php
/* Execute a prepared statement by passing an array of values */
$sth = $dbh->prepare('SELECT * FROM earningslog WHERE user_id = ? AND day >= ? AND day < ?');
$sth->execute(array($info['id'], $aweekago, $todayforw));
$results = $sth->fetchAll();
?>