Ich habe eine Tabelle mit NOT NULL
constraints für einige Spalten in MySQL erstellt. Dann habe ich in PHP ein Skript geschrieben, um Daten mit einer Einfüge-Abfrage einzufügen. Wenn ich eine der Spalten NOT NULL
in dieser Einfügeanweisung weglasse, würde ich eine Fehlermeldung von MySQL erwarten, und ich würde erwarten, dass mein Skript fehlschlägt. Stattdessen fügt MySQL leere Zeichenfolgen in die Felder NOT NULL
ein. In anderen weggelassenen Feldern sind die Daten NULL, was in Ordnung ist. Könnte mir jemand sagen, was ich hier falsch gemacht habe?
Ich benutze diese Tabelle:
%Vor%Und diese Insert-Anweisung:
%Vor%Oder Bindevariablen verwenden:
%Vor%Wenn Sie sicher sind, dass Sie keine expliziten Standardwerte verwenden, überprüfen Sie Ihren strikten Modus:
%Vor%Standardwerte für den MySQL-Datentyp
Ab MySQL 5.0.2, wenn eine Spalte Definition enthält keine explizite DEFAULT-Wert, bestimmt MySQL den Standardwert wie folgt:
Wenn die Spalte NULL als a annehmen kann Wert, die Spalte ist mit einem definiert explizite DEFAULT NULL-Klausel. Das ist das Gleiche wie vor 5.0.2.
Wenn die Spalte nicht NULL annehmen kann Wert, definiert MySQL die Spalte mit keine explizite DEFAULT-Klausel Für Daten Eintrag, wenn ein INSERT oder REPLACE Anweisung enthält keinen Wert für die Spalte oder eine UPDATE-Anweisung setzt die Spalte auf NULL, MySQL behandelt die Spalte nach dem SQL-Modus in Wirkung zu der Zeit:
Wenn der strikte SQL-Modus nicht aktiviert ist, setzt MySQL die Spalte auf impliziter Standardwert für die Spalte Datentyp.
Wenn der strikte Modus aktiviert ist, tritt bei Transaktionstabellen ein Fehler auf und die Anweisung wird zurückgesetzt. Zum Nicht transaktionale Tabellen, ein Fehler tritt auf, aber wenn dies für die zweite oder folgende Reihe von a mehrzeilige Aussage, das Vorhergehende Zeilen wurden eingefügt.
Was Sie falsch machen, ist das Erstellen Ihrer Abfrage mithilfe von Zeichenfolgen anstelle von Bindungsparametern.
Abgesehen von der SQL-Injection-Schwachstelle werden die Nullwerte in leere Strings konvertiert, noch bevor die Datenbank sie sieht.
%Vor%Ausgaben:
%Vor%Mit anderen Worten, Sie fügen eine leere Zeichenfolge ein, keine NULL. Um einen NULL einzufügen, hätten Sie folgendes schreiben müssen:
%Vor%Wenn Sie Bindeparameter verwenden, erhalten Sie dieses Problem nicht und als Bonus wird Ihre Site nicht so viele Sicherheitslücken haben. Ich schlage vor, Sie lesen die Antwort zu diese Frage und folgen der Rat dort. Dies wird Ihr unmittelbares Problem lösen und die Sicherheit Ihrer Website verbessern.
Ich stimme Mark Byers zu - Ihr PHP ist falsch für das Verhalten, das Sie wollen.
Re: Marks Kommentar zu den Bindungsparametern finden Sie PDO in PHP
Wenn Sie immer noch keine Parameter verwenden möchten, können Sie Folgendes versuchen:
%Vor%Bearbeiten: Haben Sie darüber nachgedacht, Ihren PHP-Code einfach einzuchecken, um sicherzustellen, dass die Werte nicht leer sind? Auf diese Weise könntest du den Trip zur Datenbank komplett vermeiden (basierend auf meiner Interpretation deines Kommentars)? Nicht wirklich eine Antwort auf das MySQL-Verhalten, aber könnte Ihr Problem aussortieren.
Tags und Links php mysql constraints