组合错误? (PHP)

时间:2014-07-18 21:32:20

标签: php

<?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行

我在做错误的地方?

3 个答案:

答案 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