Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有相同值的每行的PHP SQL显示列表_Php_Sql_List_Foreach - Fatal编程技术网

具有相同值的每行的PHP SQL显示列表

具有相同值的每行的PHP SQL显示列表,php,sql,list,foreach,Php,Sql,List,Foreach,我从sql数据库中的数据生成一个列表。问题是列表在每个备注前打印“系统”名称,而不是在一个备注下列出包含相同“系统”名称的所有行的“备注” 代码: <?php require("dbcon.php"); $query = " SELECT id, Date, System, Remark FROM records WHERE Date BETWEEN '$from' AND '$to'

我从sql数据库中的数据生成一个列表。问题是列表在每个备注前打印“系统”名称,而不是在一个备注下列出包含相同“系统”名称的所有行的“备注”

代码:

<?php
require("dbcon.php");
$query = " 
    SELECT 
        id, 
        Date, 
        System,
        Remark
    FROM records
    WHERE Date BETWEEN '$from' AND '$to'
    ORDER BY Date
    ";
echo "<div id='heading'>EVENT LOG: Last week</div><br />";

$result = mysql_query($query);
while ($row=mysql_fetch_array($result)) { ?>
    <ul><?php echo $row["System"]; ?>
    <li><?php echo $row["Remark"]; ?></li></ul>
<?php } ?>
但我想要的是:

Systemname1
- Log entry for Systemname 1
- Log entry for Systemname 1

Systemname2
- Log entry for Systemname 2
- Log entry for Systemname 2

这可能通过使用foreach()以某种方式得到修复,但我不确定如何:/

您可以使用PHP进行所有排序和组合,但这里有一个选项,其中数据库进行分组:

<?php
require("dbcon.php");
$query = " 
    SELECT 
        id, 
        Date, 
        System,
        GROUP_CONCAT(Remark, SEPARATOR ':::') AS Remark
    FROM records
    WHERE Date BETWEEN '$from' AND '$to'
    ORDER BY Date
    GROUP BY Date
    ";
echo "<div id='heading'>EVENT LOG: Last week</div><br />";

$result = mysql_query($query);
while ($row=mysql_fetch_array($result)) { ?>
    <ul><?php echo $row["Date"]; ?>
    <?php foreach(explode(':::', $row["Remark"]) as $remark) { ?>
        <li><?php echo $remark; ?></li>
    <?php } // END foreach ?>
    </ul>
<?php } // END while ?>

我会选择使用临时变量与日期进行比较,但这个问题有多种解决方案:

$result = mysql_query($query);
$temp_date = '';
if(mysql_num_rows($result)) {
  echo "<ul>";  // Start the list only if data exist
  while ($row=mysql_fetch_array($result)) {
    if($row["Date"]!=$temp_date) {  // If 'Date' is equal to the previous one, skip
      if($temp_date!='') {  // If it's not the first list 
        echo "</ul><ul>";   // close the previous one and start another
      } 
      echo $row["Date"];
      $temp_date=$row["Date"]; 
    }
    echo "<li>".$row["Remark"]."</li>";
  }
  echo "</ul>";
}
$result=mysql\u查询($query);
$temp_date='';
if(mysql_num_行($result)){
echo“
    ”;//仅当数据存在时才启动列表 while($row=mysql\u fetch\u数组($result)){ 如果($row[“Date”!=$temp_Date){//如果“Date”等于上一个,则跳过 如果($temp_date!=''){//如果它不是第一个列表 echo“
    ”;//关闭上一个,然后启动另一个 } echo$行[“日期”]; $temp_date=$row[“date”]; } 回音“
  • ”$行[“备注”]。“
  • ”; } 回声“
”; }
您的查询是正确的:)

我将用代码分两步解决这个问题:

首先将sql结果格式化为可用于渲染的内容:

$nestedResult = array();
foreach (mysql_fetch_assoc($result) as $row) {
    if (!isset($nestedResult[$row['Date']])) {
        $nestedResult[$row['Date']] = array();
    }
    $nestedResult[$row['Date']][] = $row['Remark'];
}
然后实际渲染:

echo '<ul>';
foreach ($nestedResult as $date => $remarks) {
    echo '<li>' . htmlspecialchars($date) . '<ul>';
    foreach ($remarks as $remark) {
        echo '<li>' . htmlspecialchars($remark) . '</li>';
    }
    echo '</ul></li>';
}
echo '</ul>';
echo'
    '; foreach($nestedResult作为$date=>$备注){ 回音“
  • ”.htmlspecialchars($date)。“
      ”; foreach($备注为$备注){ 回音“
    • ”.htmlspecialchars($remark)。“
    • ”; } 回音“
  • ”; } 回声“
”;
备注“Remark1”和“Remark2”的实际值是多少?如果是这样的话,那么您可以通过一些字符串操作来完成,但并不是您的db调用或代码造成了您的痛苦;也许你的意思是:foreach(explode(“::”,$row[“Remark”])作为$Remark)谢谢你的捕获-这就是当你肆无忌惮地复制粘贴时发生的事情!
echo '<ul>';
foreach ($nestedResult as $date => $remarks) {
    echo '<li>' . htmlspecialchars($date) . '<ul>';
    foreach ($remarks as $remark) {
        echo '<li>' . htmlspecialchars($remark) . '</li>';
    }
    echo '</ul></li>';
}
echo '</ul>';