mysql — Использование графики с использованием PHP (создание гистограммы с данными из базы данных)

Мое задание — создать график с данными из базы данных. Я сделал следующий код PHP с заданной информацией.

<?php
# ------- The graph values in the form of associative array
$values1 = array (
"Shopping" => 8491,
"Transport" => 8098,
"Food & beverages" => 7975,
"Accommodation" => 6130,
"Expenditure" => 894,
"Others" => 2667
);

$values2 = array (
"Shopping" => 13149,
"Transport" => 10019,
"Food & beverages" => 9691,
"Accommodation" => 5028,
"Expenditure" => 1097,
"Others" => 3362
);


$img_width = 450;
$img_height = 300;
$margins = 20;


# ---- Find the size of graph by substracting the size of borders
$graph_width = $img_width - $margins * 2;
$graph_height = $img_height - $margins * 2;
$img = imagecreate($img_width, $img_height);


$bar_width = 20;
$total_bars = count($values1 + $values2);
$gap = ($graph_width - $total_bars * $bar_width ) / ($total_bars + 1);


# -------  Define Colors ----------------
$bar_color = imagecolorallocate($img, 0, 64, 128);
$bar_color2 = imagecolorallocate($img, 100, 64, 128);
$label_color = imagecolorallocate($img, 0, 0, 0);
$background_color = imagecolorallocate($img, 240, 240, 255);
$border_color = imagecolorallocate($img, 200, 200, 200);
$line_color = imagecolorallocate($img, 220, 220, 220);

# ------ Create the border around the graph ------

imagefilledrectangle($img, -10, 1, $img_width + 8, $img_height - 2, $border_color);
imagefilledrectangle($img, $margins, $margins, $img_width - 1 - $margins, $img_height - 1 - $margins, $background_color);


# ------- Max value is required to adjust the scale -------
$max_value = max($values2);
$ratio = $graph_height / $max_value;


# -------- Create scale and draw horizontal lines  --------
$horizontal_lines = 20;
$horizontal_gap = $graph_height / $horizontal_lines;

for($i = 1; $i <= $horizontal_lines; $i++) {
$y = $img_height - $margins - $horizontal_gap * $i ;
imageline($img, $margins, $y, $img_width - $margins, $y, $line_color);
$v = intval($horizontal_gap * $i / $ratio);
imagestring($img, 0, 0, $y - 5, $v, $bar_color);
}


# ----------- Draw the bars here ------
for($i = 0; $i < $total_bars; $i++) {
# ------ Extract key and value pair from the current pointer position
list($key, $value) = each($values1);
$x1 = $margins + $gap + $i * ($gap + $bar_width) ;
$x2 = $x1 + $bar_width;
$y1 = $margins + $graph_height - intval($value * $ratio) ;
$y2 = $img_height - $margins;
imagestring($img, 0, $x1 + 1, $y1 - 10, $value, $bar_color);
imagestring($img, 0, $x1 + 1, $img_height - 15, $key, $label_color);
imagefilledrectangle($img, $x1, $y1, $x2, $y2, $bar_color);
}

for($i = 0; $i < $total_bars; $i++) {
# ------ Extract key and value pair from the current pointer position
list($key, $value) = each($values2);
$x1 = ($margins + $gap + $i * ($gap + $bar_width)) + 22 ;
$x2 = $x1 + $bar_width;
$y1 = $margins + $graph_height - intval($value * $ratio) ;
$y2 = $img_height - $margins;
imagestring($img, 0, $x1 + 1, $y1 - 10, $value, $bar_color2);
imagefilledrectangle($img, $x1, $y1, $x2, $y2, $bar_color2);
}

header("Content-type:image/png");
imagepng($img);

Это не работает, когда я пытаюсь заменить данную информацию на следующий код.

include('conn.php');

# ------- The graph values in the form of associative array
$values1_query = mysql_query("SELECT * FROM domestic_visitors WHERE year = 2010");
if(!$values1_query) {
die("Database query failed: " . mysql_error());
}

while ($row = mysql_fetch_array($values1_query)) {
$values1_array = array($row["component"] => $row["total"]);
}

Пытаясь в течение нескольких дней, но я просто не знаю, в чем ошибка.

Спасибо вам за помощь.

1

Решение

Ваш код в нижней части имеет следующие проблемы:

  1. Если код точно такой, как вы показали, то $values1_array не то же имя переменной, что и $values1 Это означает, что ваш код рисования гистограммы не знает, откуда взять данные.
  2. Когда вы извлекаете данные из базы данных SQL, как вы это делали, для каждой итерации цикла строка $row = mysql_fetch_array($values1_query) означает, что переменная $row содержит массив данных в этой строке и только в этой строке! Подробнее об этом ниже.

Обработка данных (правильно)

Для кода, который вы используете для создания гистограммы,

$values1 = array (
"Shopping" => 8491,
"Transport" => 8098,
"Food & beverages" => 7975,
"Accommodation" => 6130,
"Expenditure" => 894,
"Others" => 2667
);

это то, что известно как ассоциативный массив. Это означает, что это массив, в котором ключ / индекс — это имя! (Это больше похоже на карту или словарь в других языках программирования). Принимая во внимание, что код внизу не создает этот массив правильно.

Например, если ваша таблица выглядит примерно так:

+---------+-----+----+
|component|total|year|
+---------+-----+----+
|Texas    |200  |2010|
+---------+-----+----+
|Georgia  |300  |2010|
+---------+-----+----+

Затем при первом запуске кода в цикле переменная $ row будет

$row = array (
"component" => "Texas",
"total" => 200,
"year" => 2010
);

и во второй раз переменная $ row будет

$row = array (
"component" => "Georgia",
"total" => 300,
"year" => 2010
);

Обратите внимание, что так как вы пишете $values1_array = array($row["component"] => $row["total"]);данные в $values1_array перезаписывается для каждой итерации цикла! Это означает, что после выполнения цикла while вы получите эквивалент:

$values1_array = array (
"Georgia" => 300
)

и вы потеряли все данные в предыдущих строках.

Я предполагаю, что вы, вероятно, захотите сделать (вы не упомянули ожидаемый результат), чтобы добавить / добавить данные из каждой строки в $values1 массив. Вот один из способов сделать это:

$values1 = array();
while ($row = mysql_fetch_array($values1_query)) {
$component = $row["component"];
$total = $row["total"];

$values1[$component] = $total;

// This can be shortened into:
// $values1[$row["component"]] = $row["total"];
}

По сути, этот код инициализирует $ values1 в пустой массив. Для каждой итерации цикла мы вставляем новую запись в массив, так что ключ записи componentи значение записи total,

Таким образом, используя тот же пример выше, перед циклом while, $values1 это пустой массив. После первой итерации

$values1 = array (
"Texas" => 200
)

После второй итерации добавляется следующая строка данных, и

$values1 = array (
"Texas" => 200,
"Georgia" => 300
)

Распечатайте ваши переменные как метод отладки

Не уверен, что вы уже знаете это, но часто бывает полезно напечатать содержимое ваших переменных, если у вас возникли проблемы. Затем вы можете проверить, содержат ли переменные ожидаемые вами данные. Например, в этом случае печать содержимого $values1_array (или же $values1(в зависимости от того, что считается правильным) покажет вам, что массив содержит данные только из последней строки данных, возвращаемых из запроса SQL. Некоторые полезные функции, которые вы можете использовать: print_r а также var_dump которые показывают вам больше информации, кроме простого echo (см. руководство по PHP для получения информации о том, как использовать эти функции), и вы можете использовать их, чтобы просмотреть содержимое массивов.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]