【问题标题】:variable from array of POST params inserting "0" into dbPOST参数数组中的变量将“0”插入数据库
【发布时间】:2012-12-31 19:49:19
【问题描述】:

我正在构建一个使用 Phil Sturgeon's RESTful Server for CodeIgniter 作为 RESTful API 的 Android 应用。
当 android 应用发出 POST 请求以使用 facebook oauth data 注册用户时,当它到达服务器端时会调用以下方法。它可以工作,但如果一个或多个 optional params 为空,它将在我的数据库中插入一个 0
我该如何防止这种情况?我更希望它不输入任何内容或为空。

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

【问题讨论】:

  • 使数据库默认为 null 而不是 0

标签: php arrays codeigniter post insert


【解决方案1】:

问题是您的 post 参数为值传递了一个空字符串 ''(至少 $_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...

您也可以在客户端请求端防止这种情况发生,方法是不要将任何没有值的东西放入您的 post 参数中,但我总是在 web 服务端防止这种情况发生,而不仅仅是客户端 POST 请求端。

您还会看到日期和时间戳会发生这种情况...当您尝试将它们设置为 '' 时,最终会像 0000-00-00 00:00:00 一样。

您可以在 Mysql 中打开严格模式,当您尝试将空字符串填充到数字字段或其他非字符字段中时会导致插入失败(但我强烈建议不要这样做)。

【讨论】:

  • 如果你问我,似乎仍然是一个低效的头痛,但我试试看
  • 我如何“在将参数添加到 $new_member_insert_data 数组之前检查参数是否为空”,如果一个或多个值为空,则添加存在但不会停止的值?
  • @user1861766 查看我的示例,如果没有为性别和家乡提供值,则不创建数组索引。
猜你喜欢
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 2013-05-31
相关资源
最近更新 更多