Php 为什么会缺少!空($\u GET)是否生成错误?

Php 为什么会缺少!空($\u GET)是否生成错误?,php,Php,我的PHP代码是: <?php if ((!empty($_POST)) && ($_POST['action'] == 'addRunner')) { $fname = htmlspecialchars($_POST['txtFirstName']); $lname = htmlspecialchars($_POST['txtLastName']); $gender = htmlspecialchars($

我的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 ((!empty($_POST)) && ($_POST['action'] == 'addRunner'))
但是,原始代码会生成一个错误:

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

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

但是,即使代码不包含检查
$\u GET['action']
是否为空的步骤,即使出现POST请求(并且假定
$\u GET['action']
为空),代码仍能正常运行。为什么会发生这种情况

为什么以下方法有效:

elseif($_GET['action'] == 'getRunners')
还有,我为什么不写:

elseif((!empty($_GET)) && ($_GET['action'] == 'getRunners'))
请注意,正如预期的那样,生成一个空页面,并且没有警告或错误

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

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


即使发生POST请求(推测$\u GET['action']为空)。为什么会发生这种情况?为什么以下操作有效:
elseif($\u GET['action']=='getRunners')

这是因为如果请求是POST请求,它将进入第一个
if
块,而不是实际运行
else if
或甚至在进入第一个
if
块时尝试由
else if
条件进行评估


请注意,正如预期的那样,生成一个空页面,并且没有警告或错误


如果正在查找名为操作的GET参数,则不会生成任何警告。如果运行此命令,
http://localhost/z_jquery/ch9/service.php?mytest=addRunners
由于get数组中不存在参数
action
,您将得到一个未定义的索引警告

空测试将检查$\u POST是否存在(即,表单已将数据发布到此代码中,而不是仅在浏览器中输入其URL,这不会导致表单包含有效数据)而且,由于您使用的是
&
如果$\u POST不存在,它就不会麻烦进行第二次测试,如果
$\u POST
不存在,则会产生错误。

。我猜这是因为除非生成POST请求,否则$\u POST['action']的值不会被赋值。正确吗?是的。
elseif((!empty($_GET)) && ($_GET['action'] == 'getRunners'))