2011-09-21 65 views
0

我有一个简单的查询和简单的抓取行:没有查询结果,除非错误报告被打开

$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中,返回结果ok。

打印$row还是什么都没有返回,试着用fetch assoc,取数组。打开error_reporting(E_ALL);并瞧,print_r返回数组。禁用错误报告,不会再返回任何内容。可能是什么问题?

+0

http://www.php.net/manual/en/function.mysql-num-rows .php – hakre

+2

print_r()不是调试工具,它不受error_reporting的影响。你确定没有看到调试器(xdebug或类似的)的输出而不是普通的print_r()吗?此外,尝试var_dump(),而mysql_query()之后的一个die(mysql_error()),以防万一 –

+0

正如我所说的,没有mysql_errors,它的工作与error_reporting。 $ quer的var_dump返回:类型(mysql结果)的资源(57)和$ row上的var_dump返回bool(false)。 – wintercounter

回答

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); 
} 
+0

没有mysql错误,正如我所说。看看我对原始帖子的评论。 – wintercounter

+0

好的。然后尝试设置ini_set('display_errors',1);并在浏览器中启动脚本后查看源HTML代码。有没有错误? – classic

+0

没有mysql错误(说这20次现在很烦人,sry)。这有效:error_reporting(E_ALL); $ res = mysql_query($ q); $ row = mysql_fetch_row($ res); error_reporting(0);这是一种健康的方式,但它现在正在工作,直到我找到解决办法。 – wintercounter

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插入不带引号的$瓦尔是一个糟糕的坏主意

环绕所有$的单引号',如果他们是价值瓦尔如果它们是列名或表名,则在反引号`中。
这样,如果$ var包含一个空格或其他可能会跳到MySQL的东西,那么您的查询不会被弹出。
你还需要注意,如果你没有引用你的变量,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 
.... 
+0

那些基于其他值生成Where语句的变量,没有什么可担心的或者查询,即使我使用了一个简单的SELECT * – wintercounter

+1

@wintercounter,它仍然有问题,它**是一件值得担心的事情,因为它是一个足以运行高速公路的安全漏洞。 – Johan

+0

这里是:其中'uid' = '10'< - 变量返回这个值,其他两个在这种情况下是空的。现在你可以看到为什么我说这是无关紧要的,我在我的查询中使用了引号... – wintercounter

相关问题