除非启用了错误报告,否则无查询结果

时间:2011-09-21 11:06:02

标签: php mysql

我有一个简单的查询和一个简单的提取行:

$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返回数组。禁用错误报告,不再返回任何内容。可能是什么问题?

2 个答案:

答案 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);
}