Php 将默认值保留为空的非空列时出现MySQL错误1366

Php 将默认值保留为空的非空列时出现MySQL错误1366,php,codeigniter,azure,mysql-5.5,cleardb,Php,Codeigniter,Azure,Mysql 5.5,Cleardb,我对CodeIgniter和PHP一般都是新手。我创建了一个包含某些非空列的新表。非null列都有根据其数据类型设置的默认值,因此VARCHAR有一个空字符串,而数值类型的默认值为0 但是,一旦我填写表单(我故意将非空列留空以测试它们),并点击submit按钮,就会出现以下错误: 错误号码:1366 第1行“薪资”列的整数值不正确:“” 当它发现用户没有输入任何值时,它会为空字符串插入双引号。我检查了mysql模式,并将其转换为严格模式。然而,由于我使用的是多租户数据库(Azure clearD

我对CodeIgniter和PHP一般都是新手。我创建了一个包含某些非空列的新表。非null列都有根据其数据类型设置的默认值,因此VARCHAR有一个空字符串,而数值类型的默认值为0

但是,一旦我填写表单(我故意将非空列留空以测试它们),并点击submit按钮,就会出现以下错误:

错误号码:1366

第1行“薪资”列的整数值不正确:“”

当它发现用户没有输入任何值时,它会为空字符串插入双引号。我检查了mysql模式,并将其转换为严格模式。然而,由于我使用的是多租户数据库(Azure clearDB),他们不允许我拥有超级特权,我无法关闭严格模式(或者我可以吗?)

是否有办法关闭此模式,或者是否有其他解决方法?我不想为每一列显式添加SQLIF else子句,因为这将是硬编码的。请帮忙 代码如下:

控制器:

$additional_data = array(
                'first_name'    => $this->input->post('first_name'),
                'last_name'     => $this->input->post('last_name'),
                'phone'         => $this->input->post('phone'),
                'salary'        => $this->input->post('salary'));

if ($this->form_validation->run() == true && $this->ion_auth->register($username, $password, $email, $additional_data))
        {
        $identity = $this->ion_auth->where('email', strtolower($this->input->post('email')))->users()->row();
        $forgotten = $this->ion_auth->forgotten_password($identity->{$this->config->item('identity', 'ion_auth')});
        $this->session->set_flashdata('message', $this->ion_auth->messages());
        redirect('auth/success', 'refresh');
型号:

    //filter out any data passed that doesnt have a matching column in the users table
    //and merge the set user data and the additional data
    $user_data = array_merge($this->_filter_data($this->tables['users'], $additional_data), $data);

    $this->trigger_events('extra_set');

    $this->db->insert($this->tables['users'], $user_data);

    $id = $this->db->insert_id();

    //add in groups array if it doesn't exits and stop adding into default group if default group ids are set
    if( isset($default_group->id) && empty($groups) )
    {
        $groups[] = $default_group->id;
    }

    if (!empty($groups))
    {
        //add to groups
        foreach ($groups as $group)
        {
            $this->add_to_group($group, $id);
        }
    }

    $this->trigger_events('post_register');

    return (isset($id)) ? $id : FALSE;

更新:我正在使用相同的insert语句插入多个列值。

根据您的描述,您已将列“salary”设置为整数列,但将
'
插入为空字符串


因此,您需要在“salary”列中设置
0
而不是
'

根据您的描述,您已将“salary”列设置为整数列,但将
'
插入为空字符串


因此,您需要在“薪资”列中设置
0
,而不是
'

一定要在问题中包含您的代码。它对调试有很大帮助。我在这里猜测,但听起来像是将插入表单的任何值直接注入DB。这通常是一种不好的做法,在将输入放入数据库之前,需要对其进行清理和验证。否则,它会给SQL注入和攻击留下空间。一定要在问题中包含您的代码。它对调试有很大帮助。我在这里猜测,但听起来像是将插入表单的任何值直接注入DB。这通常是一种不好的做法,在将输入放入数据库之前,需要对其进行清理和验证。否则,它会为SQL注入和攻击留下空间。但我不确定这是否是良好的编码实践(即更改视图)。我希望在缺少值的情况下插入默认值(即0),因为严格模式无法关闭。实际上,视图是select查询语句,我们不能直接向其中插入数据,而是表。根据您的更新,如果您只需将
$additional\u data
插入表中,您就可以对
薪资设置前提条件,例如
'salary'=>(isset($this->input->post('salary')&&(int)$this->input->post('salary')?(int)$this->input->post('salary'):0
好的,这更有意义!谢谢我在视图中通过将值attr设置为0实现了这一点。但我不确定这是否是良好的编码实践(即更改视图)。我希望在缺少值的情况下插入默认值(即0),因为严格模式无法关闭。实际上,视图是select查询语句,我们不能直接向其中插入数据,而是表。根据您的更新,如果您只需将
$additional\u data
插入表中,您就可以对
薪资设置前提条件,例如
'salary'=>(isset($this->input->post('salary')&&(int)$this->input->post('salary')?(int)$this->input->post('salary'):0
好的,这更有意义!谢谢