【问题标题】:How do I produce a dynamic MySQL pivot table with PHP?如何使用 PHP 生成动态 MySQL 数据透视表?
【发布时间】:2016-10-10 15:40:41
【问题描述】:

我有什么:

我在 MySQL 中有一个名为“updates”的表,当前包含以下信息:

我需要什么:

我需要的是以下内容:

到目前为止我做了什么:

我有以下有效的 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 中运行准备好的语句,但这似乎没有帮助。

【问题讨论】:

  • 列数总是固定的吗?
  • 忘记你是如何生成该表的问题的? :D
  • 哪一个?第二张桌子?如果是这样,我只需运行我在 MySQL 中发布的最后一段代码。注意:这在 phpmyadmin 中不起作用,它必须从 MySQL 命令行运行。

标签: php mysql mysqli


【解决方案1】:

假设您使用的是 mysqli(而不是 PDO),您不能使用简单的 query(),因为您想执行多个命令。您需要将 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() && $db->next_result());
}
$db->close();

【讨论】:

  • 这似乎正是我在检查页面创建后所需要的。但是,我收到以下错误消息:警告:mysqli_num_fields() 期望参数 1 为 mysqli_result,在第 60 行的 C:\wamp\www\ActionPlan\updates.inc.php 中给出的布尔值
  • @Petay87 嘿,奇怪的是我以前没听懂。是的。在 multi_query() 的情况下,$result 是一个布尔值。也许这是我的一个单一查询()示例遗留下来的。如果您在// printing table headers 部分更改$res 中的$result,它应该会更好(我认为)。 (改变了答案)
【解决方案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,它就不会造成任何伤害,但对于任何文本类型 - 请注意!

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多