2009-03-09 9 views
1

Cette requête échoue après avecrequête MySQL échoue sur la violation de contrainte d'intégrité

Intégrité violation de contrainte: 1048 Colonne 'nom_login' ne peut pas être nulle

Ma déclaration d'insertion est ...

$insertUserQuery = 'INSERT INTO `users` (
        `login_name`, 
        `password`, 
        `first_name`, 
        `last_name`, 
        `company_name`, 
        `company_address`, 
        `country`, 
        `email`, 
        `phone_number`, 
        `agency_type`, 
        `sold_before`, 
        `authorised`, 
        `current_module` 
        ) 
        VALUES (
        :login_name, :login_password, :first_name, :last_name, :company_name, :company_address, :country, :email, :phone_number, :agency_type, :sold_before, 0, 0);'; 

    $bindings = array(':login_name'  => $loginName, 
         ':login_password' => sha1($password . Config::PASSWORD_SALT), 
         ':first_name'  => $firstName, 
         ':last_name'  => $lastName, 
         ':company_name' => $companyName, 
         ':company_address' => $companyAddress, 
         ':country'   => $country, 
         ':email'   => $emailAddress, 
         ':phone_number'  => $phone, 
         ':agency_type'  => null, 
         ':sold_before' => null 
        ); 

print_r($bindings);     

    Db::query($insertUserQuery, $bindings); 

Ma classe de base de données peut être trouvée at another question. Le print_r() me dit que le tableau a définitivement une valeur.

Est-ce que cela peut avoir quelque chose à voir avec moi en utilisant le mot 'mot de passe' qui est aussi une fonction MySQL?

Est-ce que PDO prend en charge les instructions préparées avec INSERT de la même manière qu'avec SELECT?

Dois-je citer les valeurs, exemple ': login_name'?

+0

êtes-vous sûr que $ loginName n'est pas nul? avez-vous essayé le débogage dans la classe wrapper DB? (bien que cela semble correct) –

+0

Oui, j'ai renvoyé toutes les données de liaison et il sort correctement. – alex

+0

Il n'y a pas de liaison dans la requête –

Répondre

1

PDO::query ne prend pas en charge la syntaxe d'instruction préparée le fait-il? Donner PDO::prepare et PDOStatement::execute une lecture. Vous voulez sans doute quelque chose comme:

$insertUserQuery = 'INSERT INTO `users` (`login_name`, ...) ' . 
    'VALUES (:login_name, ...);'; 
$bindings = array(':login_name' => $loginName, ...); 
$stmt = Db::prepare($insertUserQuery); 
$stmt->execute($bindings); 

Vous pouvez également appeler $stmt->bindValue() au lieu de construire un ensemble de fixations. Je pense que lier explicitement chaque valeur est un peu plus agréable puisque vous pouvez vérifier les types là.

EDIT: désolé jcinacio, je n'ai pas vu que votre commentaire était presque identique jusqu'à ce que j'ai posté.

+0

Je pense que je ferais mieux de me débarrasser de mon motif singleton, car je mets plus d'abstractions sur PDO (ce qui, je suppose, résout les commandes spécifiques de MySQL). Merci pour votre réponse. – alex