为什么缺少!empty($ _ GET)会产生错误?

时间:2016-08-17 13:32:35

标签: php

我的PHP代码是:

<?php

    if ((!empty($_POST)) && ($_POST['action'] == 'addRunner'))
    {
        $fname = htmlspecialchars($_POST['txtFirstName']);
        $lname = htmlspecialchars($_POST['txtLastName']);
        $gender = htmlspecialchars($_POST['ddlGender']);
        $minutes = htmlspecialchars($_POST['txtMinutes']);
        $seconds = htmlspecialchars($_POST['txtSeconds']);

        if(preg_match('/[^\w\s]/i', $fname) || preg_match('/[^\w\s]/i', $lname)) 
        {
            fail('Invalid name provided.');
        }
        if( empty($fname) || empty($lname) ) 
        {
            fail('Please enter a first and last name.');
        }
        if( empty($gender) ) 
        {
            fail('Please select a gender.');
        }

        $time = $minutes.":".$seconds;
        $query = "INSERT INTO runners SET first_name='$fname', last_name='$lname',
        gender='$gender', finish_time='$time'";
        $result = db_connection($query);
        if ($result) 
        {
            $msg = "Runner: ".$fname." ".$lname." added successfully" ;
            success($msg);
        } 
        else 
        { 
            fail('Insert failed.');
        } 
        exit;
    }
    elseif($_GET['action'] == 'getRunners')
    {

        $query = "SELECT first_name, last_name, gender, finish_time FROM runners ORDER BY finish_time ASC";
        $result = db_connection($query);

        $runners = array();

        while($row = mysqli_fetch_array($result))
        {
            array_push($runners, array('fname' => $row['first_name'], 'lname' => $row['last_name'], 'gender' => $row['gender'], 'time' => $row['finish_time']));
        }

        echo json_encode(array("runners" => $runners));
        exit;
    }

    function db_connection($query)
    {
        $dbc = mysqli_connect('127.0.0.1','runner_db_user','runner_db_password','race_info')
            or die('Error connecting to Database');

        return mysqli_query($dbc,$query);
    }

    function fail($message) 
    {
        die(json_encode(array('status' => 'fail', 'message' => $message)));
    }
    function success($message) 
    {
        die(json_encode(array('status' => 'success', 'message' => $message)));
    }

?>

请注意,本书中提供的原始代码为

if ($_POST['action'] == 'addRunner')

而不是

if ((!empty($_POST)) && ($_POST['action'] == 'addRunner'))

但是,原始代码会生成错误

  

注意:未定义的索引:第3行的E:\ wamp \ www \ Z_jquery \ ch9 \ service.php中的操作

我猜这是因为除非生成POST请求,否则$ _POST ['action']的值不会赋值。这是正确的吗?

但是,即使代码不包含检查$_GET['action']是否为空的步骤,代码仍然可以正常运行,即使发生POST请求(并且可能$_GET['action']为NULL )。为什么会这样?

为什么以下工作:

elseif($_GET['action'] == 'getRunners')

并且,为什么我不必写:

elseif((!empty($_GET)) && ($_GET['action'] == 'getRunners'))
  

请注意,http://localhost/z_jquery/ch9/service.php?action=addRunners会按预期生成一个空白页面,并且没有警告或错误。

2 个答案:

答案 0 :(得分:2)

我猜这是因为除非生成POST请求,否则$ _POST ['action']的值不会赋值。这是对的吗?

是的,这是正确的。除非请求是POST请求,否则$_POST数组为空。

即使发生POST请求(可能是$ _GET ['action']为NULL)。为什么会这样?为什么以下工作:elseif($_GET['action'] == 'getRunners')

这是有效的,因为如果请求是POST请求,它将进入第一个if块,而不是实际运行else if,甚至尝试被else if条件评估为它进入了第一个if区块。

请注意,http://localhost/z_jquery/ch9/service.php?action=addRunners会按预期生成一个空白页面,并且没有警告或错误。

由于else if正在寻找名为action的GET参数,因此不会生成任何警告。如果你运行了这个http://localhost/z_jquery/ch9/service.php?mytest=addRunners,你会得到一个未定义的索引警告,因为GET数组中不存在参数action

答案 1 :(得分:1)

空测试检查$ _POST EXISTS(即表单已将数据发布到此代码而不是您只是在浏览器中输入其URL,这不会导致它包含数据的有效负载)并且因为您正在使用{ {1}}如果$ _POST不存在,它就不会打扰进行第二次测试,如果&&不存在则会产生错误。