我对以下代码的如何感到困惑。在我的脑海中,我想象每个php块作为一个整体执行并呈现为HTML。事实上,第一个块有一个不完整的悬挂支架不能很好地与我想象PHP工作。当PHP模块到达PHP结束标记时,它会做什么? PHP标记内的代码如何影响PHP标记之外的明文输出,即只是有条件地输出表单?
我原本以为要完成以下操作,你实际上必须使用echo语句来有条件地回显表单。
<html>
<head></head>
<body>
<?php
/* if the "submit" variable does not exist, the form has not been submitted - display initial page */
if (!isset($_POST['submit'])) {
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Enter your age: <input name="age" size="2">
<input type="submit" name="submit" value="Go">
</form>
<?php
}
else {
/* if the "submit" variable exists, the form has been submitted - look for and process form data */
// display result
$age = $_POST['age'];
if ($age >= 21) {
echo 'Come on in, we have alcohol and music awaiting you!';
}
else {
echo 'You're too young for this club, come back when you're a little older';
}
}
?>
</body>
</html>
答案 0 :(得分:4)
PHP manual解释得非常不错:
...当PHP点击
?>
结束标记时,它只是开始输出它找到的任何内容(除了紧接着的新行 - 请参阅指令分离),直到它遇到另一个开始标记...但输出大退出PHP解析模式的文本块通常比通过echo()
或print()
发送所有文本更有效...
答案 1 :(得分:3)
php标签之外的部分被视为在程序流程的那部分输出的文字。
答案 2 :(得分:3)
反过来想一想。整个文档是PHP,带有隐含的?&gt;在开始和隐含&lt;?在最后。然后你得到这些等价物:
?>HTML TAGS<?
等同于
echo 'HTML TAGS';
换句话说,每对反向的PHP打开/关闭括号都封装了一个echo语句。
答案 3 :(得分:2)
如果条件失败,它会跳到php块中的大括号。其他所有内容都被视为直接进入页面的文字(而不是被视为代码)。
答案 4 :(得分:0)
PHP开发人员经常在输出发送到浏览器后遇到发送标头和cookie的问题,但是这个问题也可能在无意的输出时发生。如果在PHP代码块结束后插入空格,则在包含该PHP脚本时会产生无意的输出。
答案 5 :(得分:0)
+1 Bernard的答案。
通过使用模板化控制结构(如格式良好的标签),您可以使这种外观不那么奇怪/破坏,例如:
<?php if (!isset($_POST['submit'])) { ?>
<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
<label for="age">Enter your age:</label>
<input name="age" id="age">
<input type="submit" name="submit" value="Go">
</form>
<?php } else { ?>
<?php
// Read submitted age
//
$age= intval($_POST['age']);
?>
<?php if ($age >= 21) { ?>
Come on in, we have alcohol and music awaiting you!
<?php } else { ?>
You're too young for this club, come back when you're a little older.
<?php } ?>
<?php } ?>
请注意htmlspecialchars
周围的$_SERVER['PHP_SELF'];
- 这是示例代码中的跨站点脚本漏洞。另外,上一个echo
中的撇号存在明显的问题。