其他人已经告诉你如何解决问题。我将告诉你问题是什么。
问题
你需要知道以下几点:
PHP的布尔转字符串隐式转换
当隐式将布尔值转换为字符串时,PHP 表现有些奇怪。
$testVar = false;
echo (string)$testVar; //will output a empty string (as that evaluates to false)
$testVar = true;
echo (string)$testVar; //will output 1 (as that evaluates to true)
isset()
如何工作
根据PHP手册,
如果[作为参数提供的变量]存在且具有非NULL值,则返回TRUE
,否则返回FALSE。
尝试访问一个$_POST参数时会发生什么
正如您所知道的,当满足以下条件时,$_POST
参数可用于PHP脚本:
- 有一个HTML表单,其中
action
属性指向PHP脚本
- 用户提交了表单,有或没有数据
如果表单中的字段的name
属性是"username"
,则可以在表单提交后从PHP脚本中访问此信息:
$_POST["username"]
但如果处理 $_POST
参数的PHP脚本与HTML表单在同一个文件中,当最初访问该脚本时,将无法使用$_POST
参数。
如果尝试在没有任何参数的情况下访问$_POST
参数,则结果为Undefined index
。
这里发生了什么?
通过理解上述三点,我们可以推断出您的情况中发生了什么。
当您的文件首次加载到浏览器上时,PHP解释器必须先解释它。但是在这第一次中,不存在$_POST
变量。因此,当您尝试访问$_POST
参数时,将导致Undefined index
错误。
当您将$_POST["..."]
表达式包装在isset()
中时,isset()
将返回FALSE
,因为参数根本不存在。由于FALSE
转换为空字符串(""
),您的echo
语句不会产生任何可见内容。
当您提交表单时,
isset()
调用将返回
TRUE
,因为这次存在
$_POST
参数。正如上面所述,
TRUE
在转换为字符串时变为
"1"
。因此,您会得到输出
1
。
解决方案
在访问$_POST
参数之前,必须始终检查。
$username = "";
if (isset($_POST["username"])) {
$username = $_POST["username"];
}
或者简写:
$username = isset($_POST["username"]) ? $_POST["username"] : "";
<form action="" method="post">
将提交到当前URL,如果您决定稍后使用“漂亮的URL”,这将非常有用。它还保留了所有查询字符串参数。 - Niet the Dark Absol