PHP / MySQL — как перенести данные (столбцы в строки) с динамическими именами столбцов в таблицу

#php #mysql #transpose

#php #mysql #транспонировать

Вопрос:

Я знаю, что есть другие вопросы / ответы на подобные вещи, но мне потребовалось некоторое время, чтобы разобраться в этом конкретно, поэтому я решил поделиться этим с сообществом, поскольку, вероятно, есть другие, кому это могло бы пригодиться.

Я собрал код, подобный следующему, который работал нормально, но если вам нужно было добавить столбец, это означало добавление имени 4 раза, прежде чем вы даже доберетесь до добавления его туда, где вы хотели в таблице:

 <?php
// Prepare statement amp; retreive data from database
$sql_retreive = $con->prepare("
SELECT widget_id
     , widget_name
     , widget_price
     , widget_upc
     , widget_color
     FROM widgets
 WHERE widget_price > ?
");
$bind_process = $sql_retreive->bind_param('d',$price); 
$sql_retreive->execute();
$result = $sql_retreive->get_result(); 
// Initiate arrays to place variables from query in order to transpose data from database
$widget_id = [];
$widget_name = [];
$widget_price = [];
$widget_upc = [];
$widget_color = [];
// If there are results, fetch values for each row and add values to each corresponding array
if($result->num_rows > 0 ){
    while($row=$result->fetch_assoc()){
        $widget_id[] = $row['widget_id'];
        $widget_name[] = $row['widget_name'];
        $widget_price[] = $row['widget_price'];
        $widget_upc[] = $row['widget_upc'];
        $widget_color[] = $row['widget_color'];
    } // end of while
} // end of if num_rows > 0
// Build dynamic table with results transposed 
echo "<table class='table'><thead>";
echo "<tr><th>Widgets</th>"; for ($i=0; $i<count($crop_name);$i  ) {echo "<th>".$widget_name[$i]." (".$widget_id[$i].")</th>";}
echo "</tr></thead><tbody>";
echo "<tr><td>widget_price</td>"; for ($i=0; $i<count($widget_price);$i  ) {echo "<td>".$widget_price[$i]."</td>";} echo "</tr>";
echo "<tr><td>widget_upc</td>"; for ($i=0; $i<count($widget_upc);$i  ) {echo "<td>".$widget_upc[$i]."</td>";} echo "</tr>";
echo "<tr><td>widget_color</td>"; for ($i=0; $i<count($widget_color);$i  ) {echo "<td>".$widget_color[$i]."</td>";} echo "</tr>";
echo "</tbody></table>";
?>
  

Итак, я хотел найти лучший способ … смотрите мой ответ ниже…

Ответ №1:

Потратив некоторое время на работу над этим, я пришел к следующему:

 <?php
// Prepare statement amp; retreive data from database
$sql_retreive = $con->prepare("SELECT widget_id, widget_name, widget_price, widget_upc, widget_color FROM widgets WHERE widget_price > ?");
$bind_process = $sql_retreive->bind_param('d',$price); 
$sql_retreive->execute();
$result = $sql_retreive->get_result(); 
if($result->num_rows > 0 ){ // If there are results, fetch values for each row and add values to each corresponding array
    // Initiate an array for each field specified, in which to place variables from query, in order to transpose data from database
    for($i = 0; $i < mysqli_num_fields($result); $i  ) { // loop through fields
        $field_info = mysqli_fetch_field($result); // for each, retreive the field info
        $column = $field_info->name; // retreive the field name from the field info
        $$column = []; // note double $$, create a blank array using the field name, will loop through for each
    } // end of for loop
    while($row=$result->fetch_assoc()){ // for each row of responses, place the data into the above created arrays
        $field_info = mysqli_fetch_fields($result); // retreive the field info
        foreach ($field_info as $field_value) { // for each, retreive the field info
            $column = $field_value->name; // retreive the field name from the field info
            $$column[] = $row[$column]; // note double $$, using the array (which uses the field name), place the row data in, and loop through for each
        } // end of foreach loop
    } // end of while
} // end of if num_rows > 0
// Build dynamic table with results transposed 
echo "<table class='table'><thead>";
echo "<tr><th>Widgets</th>"; for ($i=0; $i<count($crop_name);$i  ) {echo "<th>".$widget_name[$i]." (".$widget_id[$i].")</th>";}
echo "</tr></thead><tbody>";
echo "<tr><td>widget_price</td>"; for ($i=0; $i<count($widget_price);$i  ) {echo "<td>".$widget_price[$i]."</td>";} echo "</tr>";
echo "<tr><td>widget_upc</td>"; for ($i=0; $i<count($widget_upc);$i  ) {echo "<td>".$widget_upc[$i]."</td>";} echo "</tr>";
echo "<tr><td>widget_color</td>"; for ($i=0; $i<count($widget_color);$i  ) {echo "<td>".$widget_color[$i]."</td>";} echo "</tr>";
echo "</tbody></table>";
?>
  

Это позволяет вам просто добавить имя столбца / поля в запрос, а затем использовать значения там, где вы хотите в таблице.

Пожалуйста, поддержите, если найдете это полезным!