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

使用PHP函数打印HTML会产生被浏览器错误解释的输出,php,html,Php,Html,也许我太累了,或者错过了一些基本的东西,但我越来越沮丧 我有一个包含数据的表。我编写了php函数,它从数据库中获取数据并构造html表 我的问题是,表中的第一行遗漏了最后一个表单元格中的元素 PHP函数: function printTable($stmt) { $result = '<table>'; while ($data = $stmt -> fetch()) { $result .= '<tr>'

也许我太累了,或者错过了一些基本的东西,但我越来越沮丧

我有一个包含数据的表。我编写了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;
}
函数打印表($stmt){
$result='';
而($data=$stmt->fetch()){
$result.=''
“.$data['id']”
“.$data['name']”
. ''
. ''
. '
“编辑”
. ''
. ''
. '';
}
$result.='';
返回$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>

1.
福
编辑
2.
酒吧
编辑
3.
富吧
编辑

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

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


请参见或

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


请参见或

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


请参见或

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


查看或

浏览器中的输出肯定与您显示的不一样,因为您的PHP代码没有输出任何缩进

因此,您可能向我们展示的是浏览器经过处理的DOM,它可能表示也可能不表示发送到浏览器的实际代码

很可能浏览器接收到的代码以某种方式无效,而您看到的是浏览器试图更正错误

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

正如我所说,这主要是猜测,如果没有看到页面的其余部分,我将无法更准确地解释,但我认为这可能是一个相当接近的猜测

在任何情况下,您都可以通过W3C的HTML验证器运行代码来发现问题的真正所在。您可以在此处找到它和其他代码验证工具:

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

它会很快告诉您代码有什么问题


祝您好运。

浏览器中的输出肯定与您显示的不一样,因为您的PHP代码没有输出任何缩进

因此,您可能向我们展示的是浏览器经过处理的DOM,它可能表示也可能不表示发送到浏览器的实际代码

很可能浏览器接收到的代码以某种方式无效,而您看到的是浏览器试图更正错误

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

正如我所说,这主要是猜测,如果没有看到页面的其余部分,我将无法更准确地解释,但我认为这可能是一个相当接近的猜测

在任何情况下,您都可以通过W3C的HTML验证器运行代码来发现问题的真正所在。您可以在此处找到它和其他代码验证工具:

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

它会很快告诉您代码有什么问题


祝您好运。

浏览器中的输出肯定与您显示的不一样,因为您的PHP代码没有输出任何缩进

因此,您可能向我们展示的是浏览器经过处理的DOM,它可能表示也可能不表示发送到浏览器的实际代码

很可能浏览器接收到的代码以某种方式无效,而您看到的是浏览器试图更正错误

在没有看到页面的其余部分的情况下,我无法确定无效代码的实际外观,但我猜在输出表之前,您已经打开了一个
元素。不能嵌套
s,因此浏览器
$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;
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;
}