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:
O Que Eu preciso:
o que eu preciso é do seguinte:
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.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();
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"];
}
}
?>
$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!