2016-08-17 128 views
1

我的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')) 

然而

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

代替,原來的代碼生成一個錯誤說

聲明:未定義指數:行動E:\ WAMP \ WWW \ Z_jquery \ CH9 \ service.php上線3

我猜這是因爲,除非生成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產生一個空白頁,符合市場預期,並沒有警告或錯誤。

+4

* ..我猜這是因爲除非產生一個POST請求,$ _POST ['action']的值沒有賦值。這是正確的嗎?*是的。 –

回答

2

我猜這是因爲除非產生一個POST請求,$ _POST ['action']的值沒有賦值。那是對的嗎?

是的,這是正確的。除非請求是POST請求,否則$_POST數組爲空。


即使POST請求發生(並且假定$ _GET [ '動作']是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你會得到一個未定義的指標警告作爲參數action GET數組中不存在

1

空測試檢查$ _ POST是否存在(即形式已發佈數據的代碼,而不是你只需在瀏覽器中輸入它的URL,這不會導致它包含數據的有效載荷),並且因爲如果$ _POST不存在,您將使用&&,因此不會執行第二個測試,如果$_POST不存在,則會生成錯誤。

相關問題