Como posso produzir uma tabela dinâmica de pivô MySQL com PHP?

O Que Eu tenho:

tenho uma tabela no MySQL chamada "updates" que contém actualmente a seguinte informação:

enter image description here

O Que Eu preciso:

o que eu preciso é do seguinte:

enter image description here

O que eu fiz até agora:

tenho a seguinte pergunta MySQL que funciona:

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;

a verdadeira questão

Eu não sou capaz de descobrir como executar isto usando PHP para que eu possa exibir esta saída em uma página web. E qualquer pessoa capaz de me fornecer o código PHP para realizar isso ou me apontar na direção certa da informação necessária.

Li vários artigos, mas acho que o problema é que não sei o que procuro. No início eu assumi que era como executar declarações preparadas dentro do PHP, mas isto não parece ajudar.

Author: Petay87, 2016-10-10

3 answers

Assumindo que está a usar o mysqli (e não o DOP), não pode usar uma consulta simples() porque quer executar vários comandos. Você precisará usar multi_query () em combinação com store_result(), more_result() e next_result().

Aqui está um código que usei uma vez:

$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() && $db->next_result());
}
$db->close();
 2
Author: Rik, 2016-10-10 21:24:10

Isto é um pouco de código de como aceder a uma base de dados com o MySQLI se isto o puder ajudar

<?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"];
        }       
    }
?>
 0
Author: ajir, 2016-10-10 15:59:21
A resposta é simples. Você pode sempre executar todas as consultas do seu conjunto como uma chamada de consulta separada (). esta é a regra universal para executar declarações multi-consulta.
$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));

Mas lembre-se que, por este tipo de consulta, está essencialmente a correr uma injecção de SQL na sua própria base de dados. Desde que o tipo de campo seja date ele não pode fazer nenhum mal, mas para qualquer tipo de texto - cuidado!

 0
Author: Your Common Sense, 2016-10-10 16:02:10