PHP中isset()判断空或未定义的$_GET参数为何返回true?
问题原因
- 前端URL拼接时的隐式类型转换
你在拼接GET参数时,JS会自动将不同类型的值转为字符串:
- 空字符串的
fromDate、toDate拼接后对应参数值为空字符串,参数键依然存在 - 值为
undefined的apptmnt会被转为字符串"undefined",最终完整的请求URL为forms/quote.php?fromDate=&toDate=&apptmnt=undefined,三个参数的键都完整存在于请求URL中。
- PHP
isset()的判断逻辑符合官方定义isset()仅判断变量/数组元素是否存在且值不为NULL:
- 你请求的三个参数都存在于
$_GET数组中 - 空字符串
""、字符串"undefined"都不属于NULL类型,因此三个参数的isset()判断结果都为true,最终整个条件返回true。
解决方案
你可以根据业务需求选择以下任意一种方案修复:
- 前端提交前做校验:判断
fromDate、toDate不为空,apptmnt有选中值之后再发起请求,避免无效参数提交。 - 前端拼接参数时过滤空/undefined值:如果值为
undefined或者空字符串,就不把对应的参数拼到URL中,此时后端$_GET中就不会存在对应的键,isset()会正确返回false。 - 后端增加非空校验:除了
isset()之外,额外判断参数值是否符合预期,示例代码如下:
if ( isset($_GET['fromDate'], $_GET['toDate'], $_GET['apptmnt']) && $_GET['fromDate'] !== '' && $_GET['toDate'] !== '' && $_GET['apptmnt'] !== 'undefined' ) { echo 'true'; } else { echo 'false'; }
内容的提问来源于stack exchange,提问作者w461
相关产品推荐
相关产品推荐

