技术开发 频道

PHP和FusionCharts创建交互式钻取报表

  步骤6 使用LinedCharts转换为钻取报表

  有两个方法去将子图表嵌入到父图表中去。我们或者可以通过把新的数据字符串增加到父图表的数据源,也可以仅仅把子图表的数据链接地址加到父图表中去。假如直接在父图表中嵌入子图表的数据,对于我们的例子不大合适,因为有12个月,每个月有30天,每天有24小时,这样显示起来的话会有点混乱。这里我们采用的是数据URL链接的方式,只需要在父图表中要点击的区域设置链接即可。

  下面修改代码,让能够产生三种不同类型的子图表:月、日、时,代码如下:

<?php
//处理输入,分别获得年、月,日
$Type  = $_GET['type'];
$Year  = intval($_GET['year']);
$Month = intval($_GET['month']);
$Day   = intval($_GET['day']);
//月份名称
$MonthsNames = array(null, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
switch($Type)
{
    
default:
    
case 'monthly':
        
$Query = "SELECT MONTH(Time) AS Value, COUNT(*) AS Total FROM `users` WHERE YEAR(Time)={$Year} GROUP BY Value";
        
$ResultArray = array_fill(1, 12, 0);
        
$ChartHeading = 'Monthly New Users for the Year: '.$Year;
        
$XaxisName = 'Months';
        
break;

    
case 'daily':
        
$Query = "SELECT DAY(Time) AS Value, count(*) AS Total FROM `users` WHERE YEAR(Time)={$Year} AND MONTH(Time)={$Month} GROUP BY Value";
        
$ResultArray = array_fill(1, 31, 0);  
        
$ChartHeading = 'Daily New Users for the Month: '.$MonthsNames[$Month].'/'.$Year;
        
$XaxisName = 'Days';
        
break;

    
case 'hourly':
        
$Query = "select HOUR(Time) AS Value, count(*) AS Total FROM `users` WHERE YEAR(Time)={$Year} AND MONTH(Time)={$Month} AND DAY(Time)={$Day} GROUP BY Value";
        
$ResultArray = array_fill(0, 24, 0);  
        
$ChartHeading = 'Hourly New Users for the Date: '.$Day.'/'.$MonthsNames[$Month].'/'.$Year;
        
$XaxisName = 'Hours';
        
break;
}
//连接数据库
require 'connect-to-database.php';

//查询数据库
$QueryResult = mysql_query($Query);

while($Row = mysql_fetch_assoc($QueryResult))
    
$ResultArray[$Row['Value']]=$Row['Total'];

//生成XML数据
$Output = '<chart caption="'.$ChartHeading.'" xAxisName="'.$XaxisName.'" yAxisName="Users" showNames="1" bgColor="E6E6E6,F0F0F0" bgAlpha="100,50" bgRatio="50,100" bgAngle="270" showBorder="1" borderColor="AAAAAA" baseFontSize="12">';

//根据月、日和时间,生成XML的主体数据
switch($Type)
{
    
default:
    
case 'monthly':
        
foreach($ResultArray as $MonthNumber => $value)  // MonthNumber is month number (1-12)
            $Output .= '<set value="'.$value.'" name="'.$MonthsNames[$MonthNumber].'" link="newchart-xmlurl-get-data.php?type=daily&year='.$Year.'&month='.$MonthNumber.'"/>';
        
break;
    
case 'daily':
        
foreach($ResultArray as $DayNumber => $value)  // DayNumber is day (1-31)
            $Output .= '<set value="'.$value.'" name="'.$DayNumber.'" link="newchart-xmlurl-get-data.php?type=hourly&year='.$Year.'&month='.$Month.'&day='.$DayNumber.'"/>';
        
break;
    
case 'hourly':
        
foreach($ResultArray as $HourNumber => $value)  // HourNumber is hour (0-23)
            $Output .= '<set value="'.$value.'" name="'.$HourNumber.'"/>';
        
break;
}

$Output .= '</chart>';

header('Content-type: text/xml');

//输出
echo $Output;
?>

  下面我们简单解析下上面修改了的部分。

  首先,设置了type这个变量来存放图表类型,这里可以是月,日或者是小时。

  接着,我们建立了一个$MonthNames数组,这是用来存放每个月的用户访问数据的,注意这里设置了第0个元素是null,因为第1个元素位置代表的是1月份。

  根据图表的类型,变量$Query, $ResultArray, $ChartHeading和$XAsixName都会设置为不同的值。如果$Type没有值的话,则默认选择的是月份的图表。

  接下来连接数据库,执行查询语句,把结果集存放到$ResultArray中,并且生成XML文件中的头部。

  XML文件的主体部分(即生成符合FusionCharts格式的XML)是根据图表的类型而有一点不同,具体为:

  月份:基本都是相同的,除了link属性。Link中设定了如下的值:newchart-xmlurl-get-data.php。这里newchart指明了这里是要创建新的一个图表,xmlurl表明数据是通过url的形式去获得的,比如获得1月份的数据,则链接为newchart-xmlurl-get-data.php?type=hourly&Year=2010&Month=1。

  日:跟月份也差不多,只不过链接中有day日期这个属性而已。

  小时:由于查看图表的最小单位是小时,小时是最后一层的图表了,所以这里对link不做任何的设置。

  重新将该文件改名保存为get-data.php,然后运行http://localhost/fcdemo/get-data.php?year=2010,即可看到如下的XML文件:

     <chart caption="Monthly New Users for the Year: 2010" xAxisName="Months" yAxisName="Users" showNames="1" bgColor="E6E6E6,F0F0F0" bgAlpha="100,50" bgRatio="50,100" bgAngle="270" showBorder="1" borderColor="AAAAAA" baseFontSize="12">
    
<set value="486" name="Jan" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=1"/>
    
<set value="443" name="Feb" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=2"/>
    
<set value="553" name="Mar" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=3"/>
    
<set value="550" name="Apr" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=4"/>
    
<set value="634" name="May" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=5"/>
    
<set value="622" name="Jun" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=6"/>
    
<set value="710" name="Jul" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=7"/>
    
<set value="772" name="Aug" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=8"/>
    
<set value="850" name="Sep" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=9"/>
    
<set value="1044" name="Oct" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=10"/>
    
<set value="1175" name="Nov" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=11"/>
    
<set value="761" name="Dec" link="newchart-xmlurl-get-data.php?type=daily&year=2010&month=12"/>
</chart>

  最后,运行http://localhost/fcdemo/demo.html,即可看到如下效果图:

使用LinedCharts转换为钻取报表

  首先这个是显示了1-12月份的数据,而当点每个月份的柱型图时,将会显示一个新的图,即显示每个月31天的数据,如下图: 

使用LinedCharts转换为钻取报表

  而当每天的柱型图时,又会显示一个新图表,显示一天内每个小时的用户访问数,如下图:

使用LinedCharts转换为钻取报表

0
相关文章