我正在构建一个使用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;
}
}
答案 0 :(得分:2)
问题是你的post参数是为值传递一个空字符串''
(至少这是$ _POST数组将其看作的那个)。然后你尝试将它插入一个数字列,Mysql神奇地将它转换为0
- 即使你有另一个默认值设置。
您可以做的最好的事情是检查参数是否为空,然后将它们添加到$new_member_insert_data
数组中的任何数值(假设此数组用于构造insert语句)。下面是一个不设置具有空值的数组成员的明确示例:
//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中启用严格模式,当您尝试将空字符串填充到数字字段或其他非字符字段时会导致插入失败(我强烈建议不要这样做)。