La bonne façon d'insérer un NULL dans une base de données avec CodeIgniter

J'ai ExtJS post data d'un combofield à CodeIgniter. CodeIgniter lit les données postées et exécute db->insert pour mettre à jour la base de données mssql.

le problème est que si l'utilisateur ne choisit pas une sélection du combobox qu'il envoie à CodeIgniter comme rien, Codeignighter lit alors ce morceau de données postées comme une chaîne vide et tente d'écrire cela au champ int dans la base de données provoquant une erreur.

je crois que j'ai besoin de CodeIgniter pour traiter la chaîne comme Nul s'il est vide et un nombre s'il est tel. J'ai essayé d'utiliser le jonglage de type php (int) pour le convertir mais il fait un 0. C'est une valeur non valide parce qu'elle ne correspond à aucune sélection dans mon champ one à de nombreux champs int dans ma base de données.

y a-t-il un moyen de faire en sorte que CodeIgniter traite les chaînes vides comme nulles au lieu des chaînes vides?

[EDITED TO ADD CODE]

{
//ExtJS combo object
xtype: 'combo',
id: 'Referrer',
store: new Ext.data.Store({
    proxy: new Ext.data.HttpProxy({
        url: '/referrals/index.php/referrers/read',
        method: 'POST'
    }),
    reader: new Ext.data.JsonReader({
        root: 'results',
        fields: [
            {name: 'ID'},
            {name: 'Referrer'}
        ]
    })
}),
displayField: 'Referrer',
valueField: 'ID',
value: 1,
typeAhead: true,
hiddenName: 'Referrers_ID',
mode: 'remote',
triggerAction: 'all',
fieldLabel: 'Referrer',
selectOnFocus: true,
anchor: '100%'
}

//CI CODE TO GRAB FROM POST INTO AN ARRAY THEN OUT TO THE DB
public function create(){
    $data = array(  
        'FirstName' => $this->input->post('FirstName', false),
        'LastName' => $this->input->post('LastName', false),
        'DOB' => $this->input->post('DOB', false),
        'Email' => $this->input->post('Email', false),
        'Phone' => $this->input->post('Phone', false),
        'StudentNo' => $this->input->post('StudentNo', false),
        'Sex' => $this->input->post('Sex', false),
        'Advisors_ID' => $this->input->post('Advisors_ID', false),
        'DateSeen' => $this->input->post('DateSeen', false),
        'Classifications_ID' => join(",", $this->input->post('Classifications_ID', false)),
        'Referrers_ID' => $this->input->post('Referrers_ID', false),
        'Referrals' => $this->input->post('Referrals', false),
        'ReferralNotes' => $this->input->post('ReferralNotes', false),
        'Registration1' => $this->input->post('Registration1', false),
        'Registration2' => $this->input->post('Registration2', false),
        'Notes' => $this->input->post('Notes', false)
    );

    $this->db->insert('Clients', $data);
    $insert_id = $this->db->insert_id();
}
10
demandé sur Chris 2011-03-17 20:53:50

3 réponses

en supposant que votre variable s'appelle $myvar et en supposant que vous avez fait toutes les erreurs de vérification, de validation et de moulage avant cela.

$myvar  = empty($myvar) ? NULL : $myvar;

ceci donnera les données correctes à codeignitor.

10
répondu JohnP 2011-03-17 18:02:57

Il y a deux façons de résoudre le problème susmentionné.

tout d'abord, vous pouvez simplement changer le champ de la base de données (en supposant que vous utilisez MySQL) de "NOT NULL" à "NULL" de sorte que les chaînes vides sont automatiquement converties en un NULL par MySQL et ne nécessiteraient aucune modification de votre code.

Deuxièmement, vous pouvez lancer une requête pour dire à CodeIgniter d'annuler la chaîne en tant que telle

$r = ($this->input->post('r') != FALSE) ? $this->input->post('r') : NULL;

si vous avez besoin de la fonction' null ' plus souvent, envisagez de créer une bibliothèque ou helper dans CodeIgniter avec le code ci-dessus sous la forme d'une fonction.

2
répondu Bilawal Hameed 2011-03-17 18:06:12

cela a fonctionné pour moi:) j'ai assigné des doubles guillemets simples à chaque fois que la valeur d'entrée est nulle ou vide

for($x = 0 ; $x < $count ; $x++) {
    foreach(array_keys($_POST) as $col) {
        $data[$this->col_prefix.$col] = empty($_POST[$col][$x]) ? "''" :  $_POST[$col][$x];
    }
    if($this->transaction_detail_model->add_transaction_detail($data)) {
        $flash_data = array('status' => 1, 'message'=> 'Transaction successful saved!');
    }   
}
0
répondu Enriqho Juan 2016-05-23 07:56:05