【问题标题】:PHP while loops and tablesPHP while 循环和表格
【发布时间】:2013-03-28 02:07:54
【问题描述】:

我无法将它放到一张桌子上。现在我正在使用两张桌子并将它们并排放置,但我认为这不是最好的解决方案。我已经把桌子都摆好了,我只是不知道怎么把它变成一张桌子。

while ($row = mysql_fetch_assoc($query)) {

$result .= "<tr> <td> {$row['a']} the {$row['b']} </td>      </tr>";
 }

  echo $thegames;

这会产生类似:

       james the giant
       rick the monster
       chris the goblin

我想要的是能够从单独的 while 循环中添加更多 tds...

  while($secondrow = mysql_fetch_assoc($secondquery)) { 
   $first = "<td> {$secondrow['alias']} </td>";
   $second = "<td> {$secondrow['number']} </td>";
  }

所以最后我希望它看起来像这样:

   james the giant $secondrow['alias']  $secondrow['number'] 
   rick the monster $secondrow['alias']  $secondrow['number']

等等……

希望这是有道理的。我现在正在做的是创建两个单独的表并尝试将它们排列起来,但不喜欢这种方法。任何帮助都会很棒。

【问题讨论】:

标签: php while-loop html-table


【解决方案1】:

从您的代码来看,您实际上不需要执行两个查询。如果您希望每行有 4 列,则也无需执行多个 while 循环。相反,更改查询结构以使用 JOIN;这将使您能够一次获得完整的结果集。

如前所述,请不要在新代码中使用mysql_* 函数。它们不再被维护并被正式弃用。

我将向您展示如何使用 PDO 进行 JOIN,并根据您目前显示的代码对您的表名和主键进行一些假设:

$pdo = new PDO("mysql:host=localhost;dbname=database", '-username-', '-password-');
$sql = '
    SELECT 
        `players`.`id`, 
        `players`.`a`,
        `players`.`b`, 
        `player_info`.`alias`,
        `player_info`.`number`   
    FROM 
        `players` 
    LEFT JOIN
        `player_info` ON  `players`.id = `player_info`.`player_id`
';
$players = $pdo->query($sql);

$row_data= array();
while ($row = $players->fetch()) {
    $row_data[] = '
        <td>'.$row->a.' the '.$row->b.'</td>
        <td>'.$row->alias.'</td>
        <td>'.$row->number.'</td>   
    ';
}

echo '<table><tr>'.implode('</tr><tr>', $row_data).'</tr></table'>;

如果连接被证明是不切实际的(不是典型的),那么你应该构建你的数据数组并生成 HTML 作为两个单独的步骤:

// gather the data
$data = array();
$first = $pdo->query($sql);
while($arow = $first->fetch()) {
    $one_data['a'] = $arow->a;
    $one_data['b'] = $arow->b;

    $second = $pdo->query($second_sql);
    while($brow = $second->fetch()) {
        $one_data['alias'] = $brow->alias;
        $one_data['number'] = $brow->number;
    }
    $data[] = $one_data;
}

// now generate HTML
print '<table>';
foreach ($data as $row) {
    print '
        <tr>
            <td>'.$row['a'].' the '.$row['b'].'</td>
            <td>'.$row['alias'].'</td>
            <td>'.$row['number'].'</td> 
        </tr>
    ';
}
print '</table>';

附带说明...名为ab 的列只是一个想法。这些列代表数据,因此为它们提供反映数据内容的标签。今天处理神秘专栏可能会很好......你记得他们的意思。 6个月后?一年后?为所有列和变量使用有意义的名称——为什么不呢?

文档

【讨论】:

  • 感谢您的详细回答...可能是一个愚蠢的问题,但要开始使用 PDO,我需要下载任何东西或从 MAMP 切换吗?
  • 您需要确保您拥有 MySQL PDO 驱动程序。它是大多数堆栈(如 MAMP)的标准配置,尽管我并不特别熟悉那个堆栈。如果没有,通常很容易添加。检查您的phpinfo,您应该会看到一个 PDO 部分,并且 mysql 应该列在驱动程序中。
  • 甜蜜。谢谢我找到它并启用它。猜猜我会开始学习那些东西。谢谢鬃毛。
  • 没问题!如果您刚刚开始使用 PHP,那么您实际上比已经学会了旧方法但现在必须改掉一个习惯的人要好得多:您可以从正确的角度开始。与 PDO 最重要且最大的区别是 prepare 方法,请务必阅读相关文档。您不会像使用 mysql_ 那样通过将字符串与 PDO 组合来将变量构建到查询中。
【解决方案2】:

您可以将 2 个集合组合成 1 个数组,并在打印时循环遍历该数组。

编辑;有人发现这是一个不好的答案,但这意味着您同意上述结果,即在您的模板中提取 sql 行。

您首先为模板准备数据,然后循环并打印它。

【讨论】:

  • 不确定谁投了反对票,但参考或诋毁其他答案来支持您自己的答案是没有必要或有帮助的。
  • 无论如何,正如我在回答中提到的,我进行了编辑以改进。我建议的方法之一是我相信您在这里提出的建议,所以我要 +1。
  • 确实,这正是我的意思+1
猜你喜欢
  • 2011-06-02
  • 1970-01-01
  • 2011-06-23
  • 2015-12-06
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2019-02-01
  • 2017-11-20
相关资源
最近更新 更多