我的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会按预期生成一个空白页面,并且没有警告或错误。
答案 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不存在,它就不会打扰进行第二次测试,如果&&
不存在则会产生错误。