【问题标题】:php to display table; column one with mysql column comments and column two transposed row resultsphp 显示表格;第一列带有 mysql 列注释和第二列转置的行结果
【发布时间】:2013-08-21 21:09:33
【问题描述】:

抱歉标题可能很糟糕 - 最好直观地展示我的目标:

当用户访问 SomeURL.com/test.php?id=101 时,我希望在页面上显示类似的内容

| Questions      | Answers       |
----------------------------------
| 1(a) First Name| Pedro         |
----------------------------------
| 1(b) Surname   | Millers       |
----------------------------------
| 2(a) Weight    | 150lbs        |
----------------------------------

这将通过对 mysql 数据库的查询来实现。首先:

SELECT * FROM Questionnaire WHERE idQuestionnaire=101;

返回:

| idQuestionnaire | FirstName    | Surname    | Weight    |
-----------------------------------------------------------
| 101             | Pedro        | Millers    | 150lbs    |

在我的表格设置中,我设置了 Column cmets。即对于列“FirstName”,cmets 读取“1(a) First Name”。要检索所有这些 cmets,我可以执行另一个查询:

SELECT COLUMN_NAMES FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='Questionnaire';

返回:

| COLUMN_COMMENTS |
-------------------
| 1(a) First Name |
-------------------
| 1(b) Surname    |
-------------------
| 2(a) Weight     |
-------------------

我想用数组/循环而不是硬代码来自动化代码的原因是因为我使用的实际表有超过 400 个字段,并且字段可能会被修改或添加,所以我不想一直更改当这种情况发生时,php 代码也是如此。这似乎是一项非常简单的任务,但我一生都找不到相关的文档解决方案。

【问题讨论】:

    标签: php mysql arrays loops information-schema


    【解决方案1】:

    我建议您对结果集使用 mysqli fetch_fields() 函数,以获取有关结果集中包含的列的信息,而不是在 INFORMATION_SCHEMA 中查询视图。

    fetch_fields() 适用于仅引用表中列的子集的查询,或返回表达式的查询,或从多个表返回列。

    http://php.net/manual/en/mysqli.quickstart.metadata.php

    【讨论】:

    • 我无法理解链接。 select 1 as _One 到底是什么?此外,输出不是 HTML 表格格式。感谢提示,但这并没有让我找到实际的解决方案。
    • 该链接指向 PHP 文档。 http://www.php.net/manual/en/mysqli-result.fetch-fields.php 查询返回结果集后,循环遍历 fetch_fields 返回的字段(它为您提供每个字段的名称,因此您可以输出它,以及按名称检索字段值。
    • 我错过了您实际上想要的列 cmets,而不是您对 INFORMATION_SCHEMA.COLUMNS 的查询中指出的 COLUMN_NAME
    • 好的。所以我将不得不使用信息模式查询。因此,如果我得到一个结果集,如我的问题所示,包含所有列 cmets,如何循环通过此输出作为表列,请记住相邻列需要是第一个查询的结果集的结果(即“答案”)
    【解决方案2】:

    试试这个:

    (SELECT 
     "1(a) First Name" as Questions,
     Firstname as Answers
    FROM Questionnaire WHERE idQuestionnaire=101)
     union
    (SELECT 
     "1(b) Surname" as Questions,
      Surname as Answers
    FROM Questionnaire WHERE idQuestionnaire=101)
     union
    (SELECT 
     "2(a) Weight" as Questions,
     Weight as Answers
    FROM Questionnaire WHERE idQuestionnaire=101);
    

    【讨论】:

    • 不幸的是,正如问题中所述,我不想像这样进行硬编码,因为我的实际表格有 400 多个字段,并且所有问题文本都已存储在表格的 column_cmets 中。
    【解决方案3】:

    最后,解决方案。 Spencer7593 让我上路,但所需的最终代码如下:

    $con=mysqli_connect("localhost","user","password","test");
    if (mysqli_connect_errno($con)) {echo "MySQL conn. err:".mysqli_connect_error();}
    
     $sql = "SELECT column_comment,column_name FROM information_schema.columns  
      WHERE table_name = 'mytablename';";
     $query = mysqli_query($con,$sql) or die(mysql_error());
     $columnArray = array();
    
     while(($result = mysqli_fetch_array($query, MYSQL_ASSOC))){
    
     if($result['column_comment'])
      {
      $CurCol = $result['column_comment'];
      }
     else
      {
      $CurCol = "No text stored";
      } 
    
        $CurName = $result['column_name'];
    
        $columnArray[$CurName]=$CurCol;
    
     }
    
     //echo $columnArray['FirstName']; //test example to return "1(a) First Name"
    

    所以我循环通过 fetch_fields 来获取对应的列 cmets,然后循环通过 answers 查询的结果,将每个答案显示在下一个 table 列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-17
      • 2023-04-10
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多