MySQL ignoriert die Bedingung NOT NULL

8

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%     
Whakkee 23.03.2010, 21:20
quelle

3 Antworten

14

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.

  •   

Server-SQL-Modi

    
Marcus Adams 23.03.2010, 21:59
quelle
4

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.

    
Mark Byers 23.03.2010 21:25
quelle
1

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.

    
AJ. 23.03.2010 21:46
quelle

Tags und Links