Мое задание — создать график с данными из базы данных. Я сделал следующий код 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"]);
}
Пытаясь в течение нескольких дней, но я просто не знаю, в чем ошибка.
Спасибо вам за помощь.
Ваш код в нижней части имеет следующие проблемы:
$values1_array
не то же имя переменной, что и $values1
Это означает, что ваш код рисования гистограммы не знает, откуда взять данные.$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 для получения информации о том, как использовать эти функции), и вы можете использовать их, чтобы просмотреть содержимое массивов.
Других решений пока нет …