1

Phil Sturgeon の RESTful Server for CodeIgniterを RESTful API として使用する Android アプリを構築しています。
Android アプリが POST リクエストを作成してユーザーを登録するとfacebook oauth data、サーバー側に到達したときに次のメソッドが呼び出されます。動作しますが、1 つ以上optional paramsが空の場合0、データベースに挿入されます。
これを防ぐにはどうすればよいですか?何も入力しないか、null にすることをお勧めします。

 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;
    }
 }
4

1 に答える 1

2

問題は、投稿パラメーターが''値に空の文字列を渡していることです (少なくとも $_POST 配列はそれを認識します)。0次に、これを数値列に挿入しようとすると、別のデフォルト値が設定されていても、Mysql は魔法のようにそれをキャストします。

$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...

値のないものを投稿パラメーターに入れないようにすることで、クライアント要求側でこれを防ぐこともできますが、クライアント POST 要求側だけでなく、Web サービス側でも常にこれを防ぎます。

''また、これは日付とタイムスタンプでも発生することがわかります...それらを設定しようとすると、0000-00-00 00:00:00.

空の文字列を数値フィールドまたはその他の非文字フィールドに詰め込もうとすると、挿入が失敗する原因となる Mysql の厳密モードをオンにすることができます (ただし、これは強くお勧めしません)。

于 2012-12-31T19:51:49.223 に答える