Как мне создать динамическую сводную таблицу MySQL с помощью PHP?

#php #mysql #mysqli

#php #mysql #mysqli

Вопрос:

Что у меня есть:

У меня есть таблица в MySQL с именем «обновления», которая в настоящее время содержит следующую информацию:

введите описание изображения здесь

Что мне нужно:

Что мне нужно, так это следующее:

введите описание изображения здесь

Что я сделал до сих пор:

У меня есть следующий запрос MySQL, который работает:

 SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT
     CONCAT(
       'MAX(IF(Date = ''',
   Date,
   ''', Description, NULL)) AS ',
   CONCAT("'",Date,"'")
 )
   ) INTO @sql
FROM updates;

SET @sql = CONCAT('SELECT Action, ', @sql, ' FROM updates GROUP BY Action');

PREPARE stmt FROM @sql;
EXECUTE stmt;
  

Актуальный вопрос

Я не могу понять, как выполнить это с помощью PHP, чтобы я мог отобразить этот вывод на веб-странице. Кто-нибудь может либо предоставить мне PHP-код для выполнения этого, либо указать мне правильное направление требуемой информации.

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

Комментарии:

1. Всегда ли количество столбцов фиксировано?

2. Забудьте вопрос, как вы сгенерировали эту таблицу? : D

3. Какой из них? Вторая таблица? Если это так, я просто запускаю свой последний раздел кода, который я опубликовал в MySQL. ПРИМЕЧАНИЕ: это не работает в phpmyadmin, его необходимо запускать из командной строки MySQL.

Ответ №1:

Предполагая, что вы используете mysqli (а не PDO), вы не можете использовать простой запрос (), потому что вы хотите выполнить несколько команд. Вам нужно будет использовать multi_query() в сочетании с store_result(), more_results() и next_result() .

Вот некоторый код, который я использовал однажды:

 $db=mysqli_connect($databasehost,$databaseuser,$databasepass,$databasename) or die ("Connection failed!");
$result = $db->multi_query($sql);

if ($err=mysqli_error($db)) { echo $err."<br><hr>"; }

if ($result) {
  do {
  if ($res = $db->store_result()) {
      echo "<table width=100% border=0><tr>";

      // printing table headers
      for($i=0; $i<mysqli_num_fields($res); $i  )
      {
          $field = mysqli_fetch_field($res);
          echo "<td bgcolor=lightgray><b>{$field->name}</b></td>";
      }
      echo "</tr>n";

      // printing table rows
      while($row = $res->fetch_row())
      {
          echo "<tr>";
          foreach($row as $cell) {
            if ($cell === NULL) { $cell = '(null)'; }
            echo "<td>$cell</td>";
          }
          echo "</tr>n";
      }
      $res->free();
      echo "</table>";

    }
  } while ($db->more_results() amp;amp; $db->next_result());
}
$db->close();
  

Комментарии:

1. Похоже, это именно то, что мне нужно для проверки созданной страницы. Однако я получаю следующее сообщение об ошибке: Предупреждение: mysqli_num_fields() ожидает, что параметр 1 будет mysqli_result, логическое значение, заданное в C:wampwwwActionPlanupdates.inc.php в строке 60

2. @Petay87 Привет, странно, что я не понял этого раньше. ДА. $result является логическим значением в случае multi_query() . Возможно, это осталось от моего примера с одним запросом (). Если вы измените $result in $res в части // printing table headers , она должна работать лучше (я думаю). (изменено в ответе)

Ответ №2:

Это немного кода, как получить доступ к базе данных с помощью MySQLI, если это может вам помочь

 <?php
$servername = "hostIP";
$username = "lescours_username";
$password = "password of the data base";
$dbname = "lescoursDB";
 //Create connection
$conn = new mysqli($servername, $username, $password);
 if ($conn->connect_error) {
    echo "La connexion au serveur a etez interompu, Merci d'essayez plus tard";
}else{
    $sql = 'SELECT nom FROM uiotable where nom= '' . $nom_ut . ''';
    //$numRows = $result0->num_rows;
    if (!$conn->query($sql)) {
        echo "Nom d'utilisteur incorrecte ";return;
    }else
        {   $result = $conn->query($sql);

        if ($result->num_rows > 0) {
        // output data of each row
            $row = $result->fetch_assoc();
            echo $row["mo_pas"];
        }       
    }
?>
  

Ответ №3:

Ответ прост. Вы всегда можете запускать каждый запрос из своего набора как отдельный вызов query() . это универсальное правило для выполнения операторов с несколькими запросами.

 $mysqli->query('SET @sql = NULL');
$mysqli->query(<<<HERE
SELECT
  GROUP_CONCAT(DISTINCT
     CONCAT(
       'MAX(IF(Date = ''',
   Date,
   ''', Description, NULL)) AS ',
   CONCAT("'",Date,"'")
 )
   ) INTO @sql
FROM updates;
HERE
);
$mysqli->query("SET @sql = CONCAT('SELECT Action, ', @sql, ' FROM updates GROUP BY Action');");
$mysqli->query("PREPARE stmt FROM @sql");

$res = $mysqli->query("EXECUTE stmt");
var_dump($res->fetch_all(MYSQLI_ASSOC));
  

но, пожалуйста, помните, что с помощью такого запроса вы, по сути, выполняете SQL-инъекцию в свою собственную базу данных. Пока тип поля date равен, он не может причинить никакого вреда, но для любого типа текста — будьте осторожны!