Php 使用开关和某些函数的意外Infite循环

Php 使用开关和某些函数的意外Infite循环,php,Php,基本上我有一段代码,它有一个switch语句和一些函数。它使用浏览器提供的参数“?step=X”转到开关语句,然后选择适当的函数 我的问题是,即使在我指定的每个函数的末尾转到下一个switch语句,它也从未执行过,而且不知何故,它变成了我在浏览器中使用“step=x”选择的函数的无限循环 为什么被困在1个函数中而不遍历它们?(该步骤的代码在脚本末尾突出显示) 我在浏览器中获得任何选定函数的输出。因此,它进入开关和选定的功能。。。但是它变成了无限循环,因为在broswer中我得到了300条相同的回

基本上我有一段代码,它有一个switch语句和一些函数。它使用浏览器提供的参数“
?step=X
”转到开关语句,然后选择适当的函数

我的问题是,即使在我指定的每个函数的末尾转到下一个switch语句,它也从未执行过,而且不知何故,它变成了我在浏览器中使用“step=x”选择的函数的无限循环

为什么被困在1个函数中而不遍历它们?(该步骤的代码在脚本末尾突出显示)

我在浏览器中获得任何选定函数的输出。因此,它进入开关和选定的功能。。。但是它变成了无限循环,因为在broswer中我得到了300条相同的回音语句。它永远无法遍历它们或退出所选函数

<?php 
//DB Config File
$dbFile = 'dbconfig.php';

$username = $_GET['username'];
$password = $_GET['password'];
$server = $_GET['server'];
$dbname = $_GET['dbname'];
$step = $_GET["step"];





function createfile ($dbFile) {
        //Creates File and populates it.
        $fOpen = fopen($dbFile, 'w');
global $username, $password, $server, $dbname;
            $fString .= "<?php\n";
            $fString .= "// Database Constants\n";
            $fString .= "\$DB_SERVER =" . "\"" . $server . "\";\n";
            $fString .= "\$DB_USER =" . "\"" . $username . "\";\n";
            $fString .= "\$DB_PASS =" . "\"" . $password . "\";\n";
            $fString .= "\$DB_NAME =". "\"" . $dbname . "\";\n";
            $fString .= "?>";

        fwrite($fOpen, $fString);
        fclose($fOpen);
return true;
}




try {
$db = new PDO ('mysql:host=' .$server.';dbname='.$dbname,$username,$password);

if ($db) { //if succesful at connecting to the DB

if (file_exists($dbFile)){
    if (is_readable($dbFile) && is_writable($dbFile)){ 

        //Creates File, populates it and redirects the user

    if (createfile($dbFile)) { 
    echo "nelxt";
    stepFunction($step);
    exit ();
            }


        } else { 

        echo "The file {$dbFile} cannot be accessed. Please configure the file manualy or grant Write and Read permission.";  }

    } else {

        //Creates File, populates it and redirects the user

    if (createfile($dbFile)) {

    echo "next";
        stepFunction($step);
    exit ();
            }

        }


}

} catch (PDOException $e) { //Catchs error if can't connect to the db.
    echo  'Connection failed: ' . $e->getMessage();
}

// Prepare SQL Statements
$IDB = $db->prepare( 
 "CREATE TABLE pages (
  id int(11) NOT NULL auto_increment,
 subject_id int(11) NOT NULL,
  menu_name varchar(30) NOT NULL,
  position int(3) NOT NULL,
  visible tinyint(1) NOT NULL,
  content text NOT NULL,
  PRIMARY KEY  (id)
)ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8");

$IDB2 = $db->prepare("
CREATE TABLE subjects (
  id int(11) NOT NULL auto_increment,
  menu_name varchar(30) NOT NULL,
  position int(3) NOT NULL,
  visible tinyint(1) NOT NULL,
  PRIMARY KEY  (id)
)ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8");

$IDB3 = $db->prepare("
CREATE TABLE users (
  id int(11) NOT NULL auto_increment,
  username varchar(50) NOT NULL,
  hashed_password varchar(40) NOT NULL,
  PRIMARY KEY  (id)
)ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8");

//Set Option to True or False
if (empty ($_GET['fot']) ) { 
    $fOT = false; 
    } else { $fOT = true;
        }

///////////////////////////////
// PROBLEMATIC STEP BEGINS HERE 
///////////////////////////////

function createTablePages (){

    global $db,$IDB;

                echo "0 <br>";
                stepFunction (1);

}
function createTableSubjects ($fOT){

    global $db,$IDB2;


                echo "1 <br>";
                stepFunction (2);
}

function createTableUsers ($fOT){

    global $db,$IDB3;
    echo "3 <br>";

}

function stepFunction ($step,$fOT){
global $db,$IDB1,$IDB2,$step,$fOT;



switch ($step) {
    case 0: echo "hola";
            createTablePages ($fOT);
            break;
    case 1: echo "hola2";
            createTableSubjects($fOT);
            break;
    case 2: createTableUsers ($fOT);
            break;
    }


}
?>
修复


您正在使用同名的全局变量覆盖
$step
变量。因此,当您使用
?step=0
调用
stepFunction
时,它会转到
createTablePages
,然后转到
stepFunction
并使用
1
,但会立即替换为0(因为这就是全局
$step
的值)一次又一次…

它转到stepFunction函数,并为其提供参数2,我希望随后将其传递到switch语句。。。然后转到案例2…stepFunction具有
$step,$fOT
并且您使用
stepFunction(2)
调用它是否一切正常(仅1个值而不是定义的2个值)?顺便问一句,
您得到了哪些
echo语句?:)您是说
step函数
永远不会获取基于数字的参数,因为所选变量是
$step
?编辑:我去掉了2个参数,只将其设为1个参数
$step
,如果我无限次地输入“
step=0
”我得到输出“hola 0”。。。。如果我把
step=1
我得到了“hola2 1”等等,非常感谢你的时间:)你是否也认为全局变量的使用是不好的,我应该使用数组将变量传递给函数?是的,不建议使用全局变量。除非变量数量是动态的,否则无需将变量作为数组传递。如果以单个变量而不是数组发送数据,代码的可读性会更好。再次提取它们会使代码看起来有点难看,可读性较差。另外,对于globals问题,使用OOP并拥有公共和私有变量,例如,您的方法将被包装在一个类中,并且您可以在任何非静态方法中访问$this->db。这不仅可以避免经常需要重新声明,还可以使脚本更加安全。
function stepFunction ($step,$fOT){
global $db,$IDB1,$IDB2,$step,$fOT;
function stepFunction ($step){
global $db,$IDB1,$IDB2;