2012-12-31 13 views
1

我正在構建一個使用Phil Sturgeon's RESTful Server for CodeIgniter作爲RESTful API的Android應用程序。
當android應用程序發出一個POST請求來註冊一個用戶facebook oauth data時,下面的方法在到達服務器端的時候被調用。它可以工作,但如果optional params中的一個或多個爲空,它會在我的數據庫中插入0
我該如何預防?我更喜歡它什麼都不輸入或者爲空。從POST參數數組中插入「0」的變量db到

function fb_register_post(){ 


     if($this->get_request_method() != "POST"){ 
       $this->response('',406); 
      } 



     $oauth_email = $this->input->post('OAUTH_EMAIL');  
     $oauth_uid = $this->input->post('OAUTH_UID'); 
     $oauth_provider = $this->input->post('OAUTH_PROVIDER'); 
     $first_name = $this->input->post('FIRST_NAME'); 
     $last_name = $this->input->post('LAST_NAME'); 

     if(!empty($oauth_provider) and !empty($oauth_uid) and !empty($oauth_email) and !empty($first_name) and !empty($last_name)){ 

      if(filter_var($oauth_email, FILTER_VALIDATE_EMAIL)){ 

       $new_member_insert_data = array(
       'first_name' => $first_name, 
       'last_name' => $last_name, 
       'email' => $oauth_email, 
       'OAUTH_EMAIL' => $oauth_email, 
       'OAUTH_PROVIDER' => $oauth_provider, 
       'OAUTH_UID' => $oauth_uid, 


       //OPTIONAL DATA 
       'gender' => $this->post('GENDER'), 
       'hometown' => $this->post('HOMETOWN'), 
       'bio' => $this->post('BIO'), 
       'birthday' => $this->post('BIRTHDAY') 
       ); 
       $this->load->model('membership_model'); 
       $data['user'] = $register = $this->membership_model->oauth_register($new_member_insert_data); 


       $this->response($data, 200); 


      } 
     }else{ 
      $message = array('message' => 'FAIL'); 
      $this->response($message, 201); 
     } 

     $message = array('message' => 'FAIL!'); 
     $this->response($message, 200); // 200 being the HTTP response code  

    }  

被稱爲該模型的功能是:

function oauth_register($new_member_insert_data) 
{ 
    $insert = $this->db->insert('users', $new_member_insert_data); 
    if($insert){ 
    $UID = $new_member_insert_data['OAUTH_UID']; 

    $q = $this->db->query("SELECT * FROM users WHERE OAUTH_UID = $UID LIMIT 1 ") or die(mysql_error()); 
    if($q->num_rows() > 0) 
    { 
     foreach($q->result() as $row) 
     { 
     $data[] = $row; 
     } 
     return $data; 
    } 
    } 
    else 
    { 
     return false; 
    } 
} 
+0

使數據庫默認爲空,而不是0 –

回答

2

的問題是,您的帖子參數傳遞一個空字符串''的價值(至少這是什麼$ _POST陣列將它看作) 。然後嘗試插入到一個數字列這與Mysql神奇地被它鑄造0 - 即使你已經有了另一默認值設定。

您可以做的最好的事情是在將它們添加到$new_member_insert_data數組之前檢查參數是否爲空,其中任何值都是數字(假設此數組用於構造插入語句)。下面是具有空值未設置陣列成員一個明顯的例子:

//assuming all non-optional details have values 
$new_member_insert_data = array(  
           'first_name' => $first_name, 
           'last_name' => $last_name, 
           'email' => $oauth_email, 
           'OAUTH_EMAIL' => $oauth_email, 
           'OAUTH_PROVIDER' => $oauth_provider, 
           'OAUTH_UID' => $oauth_uid 
           ) ; 
    //OPTIONAL DATA 
    $gender = $this->post('GENDER')? $this->post('GENDER'):null; 
    if(!empty($gender)){ 
      $new_member_insert_data['gender'] = $gender; 
    } 

    $hometown = $this->post('HOMETOWN')? $this->post('HOMETOWN'):null; 
    if(!empty($hometown)){ 
      $new_member_insert_data['hometown'] = $hometown; 
    } 

    ...etc... 

您也可以防止這種情況的客戶端請求方通過不把任何東西沒有價值到您的文章參數,但我總是防止這在Web服務端,而不僅僅是客戶端POST請求端。

您還會看到這發生在日期和時間戳中...當您嘗試將它們設置爲''時,最終像0000-00-00 00:00:00一樣。

您可以打開MySQL中的嚴格模式將導致當您嘗試的東西一個空字符串到數字字段或其他非字符字段(我強烈建議反對這個雖然)插入失敗。

+0

如果你問我,但仍然看起來像一個低效率的頭痛 – ChuckKelly

+0

如何「檢查參數爲空之前,將它們添加到$ new_member_insert_data數組」,補充說是存在,而如果一個或多個值爲空沒有被停止的值? – ChuckKelly

+0

@ user1861766看到我如果爲性別和家鄉沒有價值沒有創造數組索引的例子。 – Ray