<?php
if($_GET['token'] or $_POST['token2'] == $_SESSION['token'] or $_SESSION['token2']) {
echo 'not allowed';
} else {
echo "";
?>
// other codes
<? }; unset($_SESSION['token1'] or $_SESSION['token2']); ?> --> Line:112
我使用上面的代码,我收到以下组合错误:
解析错误:语法错误,意外T_LOGICAL_OR,期待&#39;,&#39;要么 &#39;)&#39;在...第112行
我在做错误的地方?
答案 0 :(得分:3)
您只能将变量传递给unset()
,而不是语句。 始终阅读手册以了解如何正确使用功能。
unset($_SESSION['token1'], $_SESSION['token2'])
仅供参考,我们的IF声明无效。您只能在PHP中进行一次比较:
if($_GET['token'] == $_SESSION['token']
or $_POST['token2'] == $_SESSION['token']
$_GET['token'] == $_SESSION['token2']
or $_POST['token2'] == $_SESSION['token2']
) {
您还可以使用包含POST和GET变量的$_REQUEST
来简化此操作:
if($_REQUEST['token'] == $_SESSION['token']
or $_REQUEST['token2'] == $_SESSION['token2']
) {
答案 1 :(得分:3)
unset()
只能与变量一起使用。表达式$_SESSION['token1'] or $_SESSION['token2']
是无效参数。
如果要取消设置这两个变量,请使用:
unset($_SESSION['token1'], $_SESSION['token2']);
您也不需要在;
之后使用}
。
此外,虽然您的if
语句在语法上无效,但如果$_GET['token']
或$_POST['token2']
等于$_SESSION['token']
或{{$_SESSION['token2']
,则会给出您要测试的展示。 1}},如果那就是你想在这里测试的东西,你就错了。你不能测试那样的东西。您必须单独测试所有案例。
逻辑方法是:
if (
$_GET['token'] == $_SESSION['token'] OR
$_GET['token'] == $_SESSION['token2'] OR
$_POST['token2'] == $_SESSION['token2'] OR
$_POST['token2'] == $_SESSION['token2']
) {
您也可以选择使用此资源:
if (array_intersect(
[$_GET['token'], $_POST['token2']],
[$_SESSION['token'], $_SESSION['token2']]
)) {
虽然这不是通常的做法。
答案 2 :(得分:0)
unset
关键字仅适用于变量或数组条目。在您的代码中,表达式$_SESSION['token1'] or $_SESSION['token2']
被解析为布尔值(因为or
关键字),不能取消设置。因此,unset的语法只需要一个变量或一个数组条目,这解释了PHP对关键字or
的阻塞。
此外,您的初始测试可能不是您的意思,它将被评估为:
if(($_GET['token'] or $_POST['token2']) == ($_SESSION['token'] or $_SESSION['token2'])
(注意优先级的括号),
因为==
是非关联的。就像未设置的表达式一样,等式的两边都将被评估为布尔值,wihch意味着如果任一数组条目只是在每一侧设置,则if
测试将被视为{ {1}}。
请改为尝试:
true