2009-03-09 4 views
1

Diese Abfrage andernfalls hält mitMySQL Abfrage schlägt fehl auf Integrität Einschränkungsverletzung

Integrität Einschränkungsverletzung: 1048 Spalte 'login_name' kann nicht null sein

Mein Insert-Anweisung ist ...

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

Meine Datenbankklasse kann at another question gefunden werden. Die print_r() sagt mir, dass das Array definitiv einen Wert hat.

Kann es etwas mit mir zu tun haben mit dem Wort "Passwort", die auch eine MySQL-Funktion ist?

Unterstützt PDO vorbereitete Anweisungen mit INSERT auf die gleiche Weise wie mit SELECT?

Muss ich die Werte angeben, Beispiel ': login_name'?

+0

Sind Sie sicher $ LoginName ist nicht null? haben Sie versucht, in die Wrapper-Klasse DB zu debuggen? (obwohl es in Ordnung scheint) –

+0

Ja, ich habe alle Bindungen Daten echo'd und es kommt richtig raus. – alex

+0

Es gibt keine Bindung in der Abfrage –

Antwort

1

PDO::query unterstützt keine vorbereitete Anweisungssyntax, oder? Geben Sie PDO::prepare und PDOStatement::execute lesen. Sie wollen wahrscheinlich so etwas wie:

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

Sie auch $stmt->bindValue() statt den Aufbau einer Reihe von Bindungen aufrufen können. Ich denke, dass das explizite Binden jedes Wertes ein wenig schöner ist, da man die Typen genau dort verifizieren kann.

EDIT: Entschuldigung jcinacio, ich habe nicht gesehen, dass Ihr Kommentar fast identisch war, nachdem ich gepostet habe.

+0

Ich denke, ich bin besser dran, mein Singleton-Muster zu verlassen, wie ich mehr Abstraktionen auf PDO setze (was ich denke, abstrahiert MySQL spezifische Befehle). Danke für deine Antwort. – alex