为了账号安全,请及时绑定邮箱和手机立即绑定

PHP GD 从 MYSQL 表创建图形

PHP GD 从 MYSQL 表创建图形

PHP
牛魔王的故事 2022-11-12 10:02:44
我目前正在使用 GD 为 PHP 创建一个条形图(inb4 使用 Java 脚本,我不能。这是一个要求)就目前而言,我在 GD 中有一个正常工作的条形图,我可以显示正常数字,但现在我是试图从 MYSQL 表中检索数据并将其显示在图表中。require "connect.php";$sql = "SELECT title, searchcountFROM moviesORDER BYsearchcount DESC LIMIT 10";$result = $conn->query($sql);if (mysqli_num_rows($result) > 0) {    while($row = mysqli_fetch_array($result))    {        $data = [            $row['title'] => substr_count($row['searchcount'], "1"),        ];    }}上述代码目前可用于检索所需的 10 个结果之一。我想不通的是如何找回其他 9 个,我们将不胜感激。https://imgur.com/m8sU8QG 这是图表当前状态的链接图形是如何绘制的。/* * Chart settings and create image */// Image dimensions$imageWidth = 700;$imageHeight = 400;// Grid dimensions and placement within image$gridTop = 40;$gridLeft = 50;$gridBottom = 340;$gridRight = 650;$gridHeight = $gridBottom - $gridTop;$gridWidth = $gridRight - $gridLeft;// Bar and line width$lineWidth = 1;$barWidth = 20;// Font settings$font = 'OpenSans-Regular.ttf';$fontSize = 10;// Margin between label and axis$labelMargin = 8;// Max value on y-axis$yMaxValue = 25;// Distance between grid lines on y-axis$yLabelSpan = 5;// Init image$chart = imagecreate($imageWidth, $imageHeight);// Setup colors$backgroundColor = imagecolorallocate($chart, 255, 255, 255);$axisColor = imagecolorallocate($chart, 85, 85, 85);$labelColor = $axisColor;$gridColor = imagecolorallocate($chart, 212, 212, 212);$barColor = imagecolorallocate($chart, 47, 133, 217);imagefill($chart, 0, 0, $backgroundColor);imagesetthickness($chart, $lineWidth);/* * Print grid lines bottom up */}
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

好的,我测试了你的代码并且它有效,所以我的猜测是格式不正确或者你没有从数据库获得正确的输出。尝试更改此行:


$data = [

            $row['title'] => substr_count($row['searchcount'], "1"),

        ];

对此:


$data[$row['title']] = substr_count($row['searchcount'], "1");

正如你期望得到一$key => $value对,所以$value不是array(). 这是test我使用的数据和结果:


<?php


$data = array(

    'test1' => 10,

    'test2' => 4,

    'test3' => 10,

    'test4' => 4,

    'test5' => 10,

    'test6' => 4,

    'test7' => 10,

    'test8' => 4,

    'test9' => 10,

    'test10' => 4

);



/*

 * Chart settings and create image

 */


// Image dimensions

$imageWidth = 700;

$imageHeight = 400;


// Grid dimensions and placement within image

$gridTop = 40;

$gridLeft = 50;

$gridBottom = 340;

$gridRight = 650;

$gridHeight = $gridBottom - $gridTop;

$gridWidth = $gridRight - $gridLeft;


// Bar and line width

$lineWidth = 1;

$barWidth = 20;


// Font settings

$font = getcwd() . '/arial.ttf'; // I switched to use Arial font 

$fontSize = 10;


// Margin between label and axis

$labelMargin = 8;


// Max value on y-axis

$yMaxValue = 25;


// Distance between grid lines on y-axis

$yLabelSpan = 5;


// Init image

$chart = imagecreate($imageWidth, $imageHeight);


// Setup colors

$backgroundColor = imagecolorallocate($chart, 255, 255, 255);

$axisColor = imagecolorallocate($chart, 85, 85, 85);

$labelColor = $axisColor;

$gridColor = imagecolorallocate($chart, 212, 212, 212);

$barColor = imagecolorallocate($chart, 47, 133, 217);


imagefill($chart, 0, 0, $backgroundColor);


imagesetthickness($chart, $lineWidth);


/*

 * Print grid lines bottom up

 */


for($i = 0; $i <= $yMaxValue; $i += $yLabelSpan) {

    $y = $gridBottom - $i * $gridHeight / $yMaxValue;


    // draw the line

    imageline($chart, $gridLeft, $y, $gridRight, $y, $gridColor);


    // draw right aligned label

    $labelBox = imagettfbbox($fontSize, 0, $font, strval($i));

    $labelWidth = $labelBox[4] - $labelBox[0];


    $labelX = $gridLeft - $labelWidth - $labelMargin;

    $labelY = $y + $fontSize / 2;


    imagettftext($chart, $fontSize, 0, $labelX, $labelY, $labelColor, $font, strval($i));

}


/*

 * Draw x- and y-axis

 */


imageline($chart, $gridLeft, $gridTop, $gridLeft, $gridBottom, $axisColor);

imageline($chart, $gridLeft, $gridBottom, $gridRight, $gridBottom, $axisColor);


/*

 * Draw the bars with labels

 */


$barSpacing = $gridWidth / count($data);

$itemX = $gridLeft + $barSpacing / 2;


foreach($data as $key => $value) {

    // Draw the bar

    $x1 = $itemX - $barWidth / 2;

    $y1 = $gridBottom - $value / $yMaxValue * $gridHeight;

    $x2 = $itemX + $barWidth / 2;

    $y2 = $gridBottom - 1;


    imagefilledrectangle($chart, $x1, $y1, $x2, $y2, $barColor);


    // Draw the label

    $labelBox = imagettfbbox($fontSize, 0, $font, $key);

    $labelWidth = $labelBox[4] - $labelBox[0];


    $labelX = $itemX - $labelWidth / 2;

    $labelY = $gridBottom + $labelMargin + $fontSize;


    imagettftext($chart, $fontSize, 0, $labelX, $labelY, $labelColor, $font, $key);


    $itemX += $barSpacing;

}


/*

 * Output image to browser

 */


imagepng($chart, 'chart.png');



?>

输出

//img1.sycdn.imooc.com//636efefa0001174006500363.jpg

查看完整回答
反对 回复 2022-11-12
  • 1 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信