PHP流逻辑问题

时间:2010-07-01 12:18:46

标签: php mysql

我的PHP代码有点问题,我根据收到的内容将值分配给流的不同状态的变量,但由于某种原因,它一直停滞不前,这是代码。

if (isset($session)) {  
    //if the user is in the database
    if ($row == 1) {

        $from = $_GET['from'];

            if (isset($from)) { 

                $page = $_GET['page'];

                switch ($page) {
                    case "game":

                        $page = "game";
                        sendVars($page);//send the variable

                        break;
                    case "gallery":

                        $page = "gallery";
                        sendVars($page);//send the variable

                        break;
                    case "leaderboard":

                        $page = "leaderboard";
                        sendVars($page);//send the Variable                     
                        break;

                }
        }else {             
                $page = "game";

                sendVars($page);//send the variable
            }

        //if the user is not in the database
        }else {

            //do this
        }

} else {

    //register
}

现在出于一些奇怪的原因,它会继续将$ page的值设置为游戏,即使我将页面变量设置为图库http://www.mydomai.com/?from=set&page=gallery。我能想到的唯一原因是我的开关不能正常工作吗?或者它以某种方式绕过开关?

提前Thanx!

4 个答案:

答案 0 :(得分:5)

我删除了一些无用的变量赋值后才运行你的代码:

<?php

// I added this function just for testing
function sendVars($page) {
  echo $page;
}

if (isset($_GET['from'])) {

  $page = $_GET['page'];

  switch ($page) {
    case "game":
      sendVars($page); //send the variable

      break;
    case "gallery":
      sendVars($page); //send the variable

      break;
    case "leaderboard":
      sendVars($page); //send the Variable
      break;
  }
} else {
  $page = "game";

  sendVars($page); //send the variable
}

这一切看起来都很好,xxx.php?from = 1&amp; page = gallery echos out“gallery”,尝试在脚本顶部执行print_r($ _ GET)并查看打印出来的内容并告诉我们

另一方面,我认为以下内容对您来说可能更短,但仍然做同样的事情:

if (isset($_GET['from'])) {
  // Check if $_GET['page'] exsists and is either game, gallery or leaderboard
  if (isset($_GET['page']) && in_array($_GET['page'], array('game', 'gallery', 'leaderboard')))
    sendVars($_GET['page']);
}
else
  sendVars('game');

我希望这会有所帮助

干杯 路加

答案 1 :(得分:1)

尝试执行var_dump($ page);退出;在切换之前,看看它吐出来的东西。

你也可以做一个var_dump($ from)并查看吐出的内容 - 它可能会转到其他地方,因此它甚至可能无法进入交换机。

答案 2 :(得分:1)

如果这是一个函数内部,我个人更喜欢看守风格的条款,而不是不断增加缩进的级别。我们的想法是你挑选出恶劣的条件(即如果出现问题)来“保护”更大的逻辑块。

在你的情况下,这是switch语句。

if (!isset($session))
    return ...; // register

if ($row != 1)
    return ...; // do this

$from = $_GET['from'];
$page = $_GET['page'];

if (isset($from)) switch ($page) {
    case "game":
        $page = "game";
        break;

    case "gallery":
        $page = "gallery";
        break;

    case "leaderboard":
        $page = "leaderboard";                   
        break;
}

else $page = "game";

return sendVars($page);// don't need to repeat this if all cases do it!

这只是一种代码风格,并不能解决所有问题(如果有的话)。实际上,此代码中不需要切换块。我看不出它在做什么。

答案 3 :(得分:0)

您不一定需要switch语句。我看不出你的逻辑有明显的问题,但我认为这会做同样的事情:

if (isset($session))
{  
    //if the user is in the database
    if ($row == 1)
    {
        $page = (in_array($_GET['page'],array('game','gallery','leaderboard'))) ? $_GET['page'] : "game";
        sendVars($page); //send the variable
    }
    else //if the user is not in the database
    { 
        //do this
    }
}
else
{
    //register
}

刚看到 Luke 使用相同的in_array方法,但在我之前25分钟。为我缓慢服务吧!