PHPでグラフ表示画面を作るには

■ 処理の概要

ここでは、登録されたデータをもとに簡単な棒グラフを作成する方法を紹介します。棒グラフの材料はtsumikki_tblのageで、どの年齢にどれだけの人数がいるのかを表示してみたいと思います。

グラフの出力は予め用意しておいたPNG画像を引き伸ばす形式で行います。用意する画像は10×10ピクセルの大きさで、この画像の幅をIMAGEタグで調整することによって棒グラフを表現します。また、年齢の集計はSELECT文のGROUP BY句を使って行います。グラフ出力のスクリプトはgraph.phpで、使用する画像の名前はblock.pngとします。また、今回は年齢ごとの人数を集計するので、適当なデータを作成して置いてください。

■ グラフ出力スクリプトの作成

グラフの出力は、まず元となるデータを取得することから始まります。年齢ごとにどれだけの人数がいるかを確認するには、SELECT文でGROUP BY句を使います。今回は年齢ごとなので、ageでグルーピングをかけます。取得する項目は年齢とその人数なので、ageとcount(*)を指定します。対象のデータが取得できれば後はグラフを出力するだけです。スクリプトは次のようになります。

graph.php

<html>
<body>
<?
// データベースに接続
if(!$con=mysql_connect("localhost","mysql","passwd")){
echo"接続失敗";
exit;
}

// データベースを選択
if(!mysql_select_db("tsumiki",$con)){
echo"データベース選択エラー";
exit;
}

// SELECT文を実行
$sql="select age,count(*) as cnt from tsumiki_tbl ";
$sql.="group by age order by cnt desc,age";
if(!$res=mysql_query($sql)){
echo "SQL実行エラー敗<BR>";
exit;
}

// 全人数を格納
$all_num=0;
while($row=mysql_fetch_array($res)){
$all_num+=$row["cnt"];
}

// データ取得位置を先頭に戻す
if (!mysql_data_seek ($res, 0)){
echo "データ取得位置の移動失敗<BR>";
exit;
}

// 検索した結果を全部表示
echo "<table border=1>";
echo "<tr><td>年齢</td><td>グラフ</td><td>人数</td><td>";
while($row=mysql_fetch_array($res)){
$percent=$row["cnt"]/$all_num*100;
echo "<tr>";
echo "<td>". $row["age"] . "</td>";
echo "<td>";
echo "<img src=block.png height=10 width=";
echo $percent*2;
echo "> ";
echo round($percent,1),"%";
echo "</td>";
echo "<td>". $row["cnt"] . "</td>";
echo "</tr>";
}
echo "</table>";

// 結果セットの解放
mysql_free_result($res);

// データベースから切断
mysql_close($con);
?>
</body>
</html>

1. SELECT文はGROUP BY句でageを指定してグルーピングをかけています。ORDER BYにはcntつまりcount(*)を指定して、件数が多いもの順に出力するようにしています。descはdescendの略で「降順で」という意味です。

2. データの取得が完了した後は、全データを見て全体の人数を取得しています。これはグラフの幅を算出するために全体の人数が必要になるためです。全データの取得が完了したら、mysql_data_seekという関数を使って、レコードの取得開始位置を先頭に戻しています。

3. 全体の人数が取得できたら、今度はグラフの出力を行います。年齢ごとのパーセンテージは「各年齢ごとの人数÷全体の人数×100」で取得できるので、その数値を変数$percentに格納します。グラフの幅はこのpercentで算出します。単純にこのpercentを幅としてもかまいませんが、この場合、100ピクセルが最大幅となり、ここでは*2を付け加えて最大200ピクセルの幅にしています。グラフイメージの後には、パーセンテージの文字を出力しています。roundは四捨五入の関数で、数値の後に1を指定して、小数点1桁で四捨五入を行っています。

■ 実行結果の確認

graph.phpにアクセスして、実行結果を確認してみましょう。

<< 戻る
RIKO's Trial Page | Shirley's i-box | Shirley's little box