也许我太累了或遗失了一些非常基本的东西,但我越来越感到沮丧。
我有包含数据的表。我编写了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)));
它表示第一个表单存在,但在浏览器中突然错过。它神奇地消失形式魔法吗?
答案 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;
}