我有一个简单的查询和一个简单的提取行:
$quar=mysql_query("SELECT
COALESCE(sum(impression),0) as imps
,COALESCE(sum(clk_count),0) as clks
,COALESCE(sum(money_spent),0) as monspen,time
FROM `$table_name`
WHERE $uid_str $aid_str $timestr time=$temp_time_main
GROUP BY time
ORDER BY time");
$row=mysql_fetch_row($quar);
echo '<pre>';
print_r($row);
查询运行正常,没有错误,没有返回false。回应查询并在PhpMyAdmin中尝试,返回结果确定。
打印$row
仍然没有返回任何内容,尝试使用fetch assoc,也获取数组。打开error_reporting(E_ALL);
并且瞧,print_r返回数组。禁用错误报告,不再返回任何内容。可能是什么问题?
答案 0 :(得分:2)
此查询存在许多问题:
$quar=mysql_query("SELECT
COALESCE(sum(impression),0) as imps
,COALESCE(sum(clk_count),0) as clks
,COALESCE(sum(money_spent),0) as monspen
,time
FROM `$table_name`
WHERE $uid_str $aid_str $timestr time=$temp_time_main
GROUP BY time
ORDER BY time");
1这个where子句是什么意思?
WHERE $uid_str $aid_str $timestr time=$temp_time_main
where子句的格式通常为:field1 = 'A' AND field2 = 'B' AND field3 > 'C'
2插入未加引号的$ vars是一个坏主意
如果它们是值,则用单引号'
覆盖所有$ vars;如果是列名或表名,则用反引号`
覆盖。
这样,如果$ var包含一个空格,或者其他可能会使MySQL崩溃的东西,你的查询就不会爆炸
您还需要注意,如果您没有引用您的vars,mysql_real_escape_string()
将无效
但是使用动态表名会使该点静音,请参见下面的第3点。
3动态表或列名称是等待发生的SQL注入
使用白名单检查列/表名称是否有效
请参阅此问题:How to prevent SQL injection with dynamic tablenames?
4 COALESCE
看起来不对。
即使单个null
行也会将您的总和还原为0.我建议您使用此代码:
....
SUM(COALESCE(impression,0)) as imps
....
答案 1 :(得分:0)
这可能有助于调试问题:
$query = "select COALESCE(sum(impression),0) as imps,COALESCE(sum(clk_count),0) as clks,COALESCE(sum(money_spent),0) as monspen,time from `$table_name` where $uid_str $aid_str $timestr time=$temp_time_main group by time order by time";
$result = mysql_query($query) || die('Error: ' . mysql_error());
while (($row=mysql_fetch_row($result)) !== false) {
var_dump($row);
}