【问题标题】:Creating ledger account with help of PHP, MySQL, and HTML table借助 PHP、MySQL 和 HTML 表创建分类帐帐户
【发布时间】:2018-08-04 22:47:32
【问题描述】:

正如标题所说,一切对我来说都很好,但问题在于 HTML 表格

我得到了什么:

我想要什么:

我正在执行的代码:

<?php
    $id = $rowpt['Id'];
    $lstmt = $user_home->runQuery("SELECT * FROM received WHERE Id = :fn");
    $lstmt->bindParam(':fn',$id);
    $lstmt->execute();
    // Left Hand Side Columns
        while($lrow=$lstmt->fetch(PDO::FETCH_ASSOC))
        {
            extract($lrow);

?>    
    <tr>
    <td><?php echo $Date; ?></td>
    <td><?php echo $Reason; ?></td>
    <td><?php echo $Amnt; ?></td>
    <td></td><td></td><td></td><td></td>
    </tr>
    <?php
    }
    $lstmtc = $user_home->runQuery("SELECT * FROM payment WHERE Id = :fn ORDER BY Sr ASC");
    $lstmtc->bindParam(':fn',$id);
    $lstmtc->execute();
    // Right Hand Side Columns
        while($lrowc=$lstmtc->fetch(PDO::FETCH_ASSOC))
        {
            extract($lrowc);

?>    
    <tr>
    <td></td><td></td><td></td><td></td>
    <td><?php echo $Date; ?></td>
    <td><?php echo $Reason; ?></td>
    <td><?php echo $Amnt; ?></td>
    </tr>
    <?php
    }
    ?>

我应该对代码进行哪些更改才能获得预期的结果?

更新

在执行answer by JokerDan 提供的代码后工作正常。增加更多行后,我得到的结果为:

右列重复

【问题讨论】:

  • 未关闭的tr 标签,&lt;tr&gt; => &lt;/tr&gt;
  • 感谢您提醒我,标签现已关闭
  • 在那之后结果没有任何变化?
  • 不,之后没有任何变化......
  • 有很多方法可以做到这一点。例如:首先获取'received'和'payment'数据并将它们存储在一个数组中。然后创建表并从数组中挑选数据,直到没有人留下任何数据。冒险:使用函数!

标签: php html mysql html-table


【解决方案1】:

您的问题在于您的表结构。

您的第一个查询会这样输出一个表;

<tr>
    <td><?php echo $Date; ?></td>
    <td><?php echo $Reason; ?></td>
    <td><?php echo $Amnt; ?></td>
    <td></td><td></td><td></td><td></td>
</tr>

这是 3 个已填充的单元格,然后是 4 个未填充的单元格在一行上,然后关闭表的行并转到第二个 SQL 事务的下一部分。

<tr>
    <td></td><td></td><td></td><td></td>
    <td><?php echo $Date; ?></td>
    <td><?php echo $Reason; ?></td>
    <td><?php echo $Amnt; ?></td>
</tr>

这是一个新行,您将放置 4 个未填充的单元格,然后放置 3 个填充的单元格。因此,您的交易表有点偏离。

至于如何解决它,最好将查询作为一个连接来查看,以便同时获取收款和付款表数据,然后构建表。

这是一篇关于对表进行连接的文章/指南。 https://www.tutorialspoint.com/sql/sql-using-joins.htm


如果不正确了解您的设置,这是与您当前实施最接近的最佳解决方案;

<?php
$id = $rowpt['Id'];
$lstmt = $user_home->runQuery("SELECT * FROM received WHERE Id = :fn");
$lstmt->bindParam(':fn',$id);
$lstmt->execute();

while($left = $lstmt->fetch(PDO::FETCH_ASSOC)) {
  extract($left);
  echo "<tr>";
  echo "<td>" . $left["date"] . "</td>" . "<td>" . $left["reason"] . "</td>" . "<td>" . $left["amnt"] . "</td>" . "<td></td>";
  $tRow = 1;
  $lstmtc = $user_home->runQuery("SELECT * FROM payment WHERE Id = :fn ORDER BY Sr ASC");
  $lstmtc->bindParam(':fn',$id);
  $lstmtc->execute();
  while($right = $lstmtc->fetch(PDO::FETCH_ASSOC)) {
    extract($right);
    if ($right["id"] == $left["id"]) {
      if ($tRow != 1) { echo "<tr><td></td><td></td><td></td><td></td>"; }
      echo "<td>" . $right["date"] . "</td>" . "<td>" . $right["reason"] . "</td>" . "<td>" . $right["amnt"] . "</td>";
      if ($tRow != 1) { echo "</tr>"; }
      $tRow++;
    }
  }
  echo "</tr>";
}
?>

更新,在完全意识到您需要什么之后,我将一些表放在一起并将它们放在一起,我正在使用 mariaDB 并且我认为可以正常工作的连接由于某种原因而不起作用,所以在这里我们进行了两个不同的调用,建立双方表,然后将它们一起输出。

<?php
// My test DB connection
$db = new PDO("mysql:dbname=test;host=localhost", "test", "test");
// ID we are looking for
$id = 1;

$received = "SELECT * FROM received WHERE id = :fn";
$payments = "SELECT * FROM payments WHERE id = :fn";

$dbQuery = $db->prepare($payments);
$dbQuery->bindParam(':fn', $id);
$dbQuery->execute();

$leftRows = [];

while ( $left = $dbQuery->fetch(PDO::FETCH_ASSOC) ) {
  $leftRows[] = ("<td>" . $left["date"] . "</td>" . "<td>" . $left["reason"] . "</td>" . "<td>" . $left["amnt"] . "</td>" . "<td></td>");
}

$rightRows = [];

$dbQuery = $db->prepare($received);
$dbQuery->bindParam(':fn', $id);
$dbQuery->execute();

while ( $right = $dbQuery->fetch(PDO::FETCH_ASSOC) ) {
  $rightRows[] = ("<td>" . $right["date"] . "</td>" . "<td>" . $right["reason"] . "</td>" . "<td>" . $right["amnt"] . "</td>");
}

echo "<table>";
for ($i = 0; $i < count($leftRows) || $i < count($rightRows); $i++) {
  echo "<tr>";
  if (empty($leftRows[$i])) echo "<td></td><td></td><td></td><td></td>"; else echo $leftRows[$i];
  if (empty($rightRows[$i])) echo "<td></td><td></td><td></td>"; else echo $rightRows[$i];
  echo "</tr>";
}
echo "</table>";
?>

【讨论】:

  • 我已经编辑了这个问题,并添加了一些与您的答案相关的更新,感谢您的帮助。
  • @Namo 所以右栏在不应该重复的时候重复?您的付款表中这些行的 ID 是什么?
  • Id 在我的代码中的含义是,客户的 Id。所以,Id 用于支付和接收表是相同的
  • 哦,所以左边不是绑在桌子右边吗?您只是想基本上并排输出两个表格,但在一个 html 表格中?
  • 是的,你明白了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2020-10-15
相关资源
最近更新 更多