使用PHP函数打印HTML会产生浏览器错误解释的输出

时间:2015-06-16 15:41:50

标签: php html

也许我太累了或遗失了一些非常基本的东西,但我越来越感到沮丧。

我有包含数据的表。我编写了php函数,它从数据库中获取数据并构造html表。

我的问题是,表中的第一行错过了最后一个表格单元格中的元素。

PHP函数:

function printTable($stmt) {
    $result = '<table>';
    while ($data = $stmt -> fetch()) {
         $result .= '<tr>'
                     . '<td><span>' . $data['id'] . '</span></td>'
                     . '<td><span>' . $data['name'] . '</span></td>'
                     . '<td>'
                        . '<form method="post" action="">'
                           . '<input type="hidden" name="id" value="' . $data['id'] . '">
                           . '<button type="submit" name="edit">Edit</button>'
                        . '</form>'
                     . '</td>'
                 . '</tr>';
    }
    $result .= '</table>';
    return $result;
}

问题是浏览器忽略第一行中的表单元素。隐藏的输入和按钮保持不变,但没有父表单。所以浏览器中的输出如下所示:

<table>
   <tr>
      <td><span>1</span></td>
      <td><span>Foo</span></td>
      <td>
         <input type="hidden" name="id" value="1">
         <button type="submit" name="edit">Edit</button>
      </td>  
   </tr>
   <tr>
      <td><span>2</span></td>
      <td><span>Bar</span></td>
      <td>
         <form method="post" action="">
            <input type="hidden" name="id" value="2">
            <button type="submit" name="edit">Edit</button>
         </form>
      </td>  
   </tr>
   <tr>
      <td><span>3</span></td>
      <td><span>Foo Bar</span></td>
      <td>
         <form method="post" action="">
            <input type="hidden" name="id" value="3">
            <button type="submit" name="edit">Edit</button>
         </form>
      </td>  
   </tr>
</table>

此外,如果我转储此函数的返回值,例如:var_dump(htmlspecialchars(printTable($stmt)));它表示第一个表单存在,但在浏览器中突然错过。它神奇地消失形式魔法吗?

4 个答案:

答案 0 :(得分:1)

嗯,似乎这种行为与嵌套表单以及浏览器如何处理它们有关。嵌套表单因规范而无效。

请参阅Is it valid to have a hrml form inside another html form?Chrome is eating my first inner form why?

答案 1 :(得分:1)

浏览器中的输出肯定不会像你显示的那样,因为你的PHP代码不会输出任何缩进。

所以你可能向我们展示的是浏览器处理过的DOM,它可能代表也可能不代表发送给浏览器的实际代码。

浏览器接收的代码可能会以某种方式无效,您所看到的是浏览器尝试纠正错误。

如果没有看到页面的其余部分,我无法确定无效代码的实际外观,但我的猜测是,在输出表之前,您已经打开了一个<form>元素。您不能嵌套<form>,因此浏览器会看到表格中的第一个并且自己说“哦,这是无效的”。所以它试图修复它,结果是内部表单被删除了。

正如我所说,这主要是猜测,如果没有看到页面的其余部分,我就不能再准确了,但我认为这可能是一个相当接近的猜测。

在任何情况下,您都可以通过W3C的HTML验证器运行代码,亲自了解问题的真正原因。您可以在此处找到它以及其他代码验证工具:https://www.w3.org/developers/tools

最简单的方法是在浏览器中打开页面,然后使用“查看源代码”选项查看实际的HTML代码(即开发工具中显示的DOM代码),然后将其复制+粘贴到验证器中的表单中。

它应该很快告诉你代码的问题。

祝你好运。

答案 2 :(得分:1)

只是因为我的建议不明确我把你的代码拿出来伪造你的数据

$allData = [
    ['id' => 1, 'name' => 'Foo'],
    ['id' => 2, 'name' => 'Bar'],
    ['id' => 3, 'name' => 'Baz']
];
$result = '<form method="post" action=""><table>';
foreach ($allData as $data) {
    $result .= '<tr>'
        . '<td><span>' . $data['id'] . '</span></td>'
        . '<td><span>' . $data['name'] . '</span></td>'
        . '<td>'
            . '<button type="submit" name="edit" value="' . $data['id'] . '">Edit</button>'
        . '</td>'
    . '</tr>';
}
$result .= '</table></form>';
echo $result;

答案 3 :(得分:0)

根据HTML规范,您不能在表格单元格中包含表单,但可以在表单内部放置表格。宣泄&#39;答案是正确的,但我很困惑为什么你的第一个打开和关闭表单标签已经消失,你的代码必须有其他部分导致这种情况发生。无论如何,我会采取表格之外的形式,为了便于阅读,用HEREDOC代码替换所有的连接代码。

function printTable($stmt) {
    $result = '<form method="post">';
    $result .= '<table>';
    while ($data = $stmt -> fetch()) {
         $result .= <<<HTML
             <tr>
                <td>{$data['id']}</td>
                <td>{$data['name']}</td>
                <td><button type="submit" name="edit" value="{$data['id']}">Edit</button></td>

             </tr>
HTML;
    }
    $result .= '</table>';
    $result .= '</form>';
    return $result;
}