2016-03-08 1 views
1

Je suis nouveau à CodeIgniter et PHP en général. J'ai fait une nouvelle table avec certaines colonnes non nulles. Les colonnes non nulles ont toutes des valeurs par défaut définies en fonction de leur type de données, donc VARCHAR a une chaîne vide, tandis que les types numériques ont 0 comme valeur par défaut.Erreur MySQL 1366 apparaît en laissant les colonnes non nulles avec des valeurs par défaut

Cependant, une fois que je remplir le formulaire (où je laisse volontairement les colonnes non nulles en blanc pour les tester), et appuyez sur le bouton d'envoi, il donne l'erreur suivante:

Error Number: 1366

Incorrect integer value: '' for column 'salary' at row 1

Il est insérait les guillemets doubles pour une chaîne vide lorsqu'elle trouve que l'utilisateur n'a saisi aucune valeur. J'ai vérifié vérifié le mode mysql et il a été passé en mode strict. Cependant, comme j'utilise un DB multitenant (Azure-clearDB), ils ne me permettent pas de super privilèges et je ne peux pas désactiver le mode strict (ou le ferais-je?)

Y at-il un moyen de désactiver ce mode, ou existe-t-il une autre solution de contournement? Je ne veux pas ajouter explicitement une clause SQL if-else pour chaque colonne, car cela serait codé en dur. S'il vous plaît aider Le code est ci-dessous:

CONTRÔLEUR:

$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'); 

Modèle:

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

MISE À JOUR: J'insérer des valeurs de colonnes multiples avec la même instruction d'insertion.

+0

afficher aussi le code. –

+0

Incluez votre code dans la question. Cela aide beaucoup avec le débogage. Je devine ici, mais il semble que vous preniez toutes les valeurs insérées dans le formulaire et l'injecter directement dans la base de données. C'est généralement une mauvaise pratique et vous voudriez désinfecter et valider l'entrée avant de la mettre dans la base de données. Sinon, cela laisse la place aux injections SQL et aux attaques. – khuderm

Répondre

0

Selon votre description, vous avez défini la colonne 'salary' comme une colonne entière, mais vous insérez '' comme chaîne vide.

Vous devez donc définir 0 au lieu de '' dans la colonne 'salaire'.

+0

J'ai fait cela dans la vue, en mettant la valeur attr à 0. Mais je ne suis pas sûr que ce soit une bonne pratique de codage (c'est-à-dire changer la vue). Je préfère que la valeur par défaut (0) soit insérée en cas de valeur manquante, car le mode strict ne peut pas être désactivé – omrakhur

+0

En réalité, les vues sont des instructions de requête sélectionnées, nous ne pouvons pas y insérer directement des données, mais des tables. Et selon votre mise à jour, si vous insérez juste le '$ additional_data' dans votre table, vous pouvez préconditionner le' salary', par ex. ''salary' => (isset ($ this-> input-> post ('salary')) && (int) $ this-> input-> post ('salary'))? (int) $ this-> input -> post ('salary'): 0' –

+0

Bon, ça a plus de sens! Merci! – omrakhur