MySQL NOT NULL kısıtlaması yok sayar

3 Cevap php

MySQL bazı sütunlarda NOT NULL kısıtlamaları ile bir tablo oluşturduk. Sonra PHP ben bir ekleme sorgusu ile veri eklemek için bir senaryo yazdı. Ben bu insert açıklamada NOT NULL sütunlardan birini atlarsanız MySQL bir hata mesajı beklediğiniz ve benim komut dosyası başarısız beklenebilir. Bunun yerine, MySQL NOT NULL alanlarında boş dizeler ekler. Diğer ihmal alanlardaki veriler ince olduğu, NULL. Birisi burada yanlış yaptığını bana söyleyebilir misiniz?

Bu tabloyu kullanıyorum:

CREATE TABLE IF NOT EXISTS tblCustomers (
  cust_id int(11) NOT NULL AUTO_INCREMENT,
  custname varchar(50) NOT NULL,
  company varchar(50),
  phone varchar(50),
  email varchar(50) NOT NULL,
  country varchar(50) NOT NULL,
  ...
  date_added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (cust_id)
) ;

Ve bu insert deyimi:

$sql = "INSERT INTO tblCustomers (custname,company) 
        VALUES ('".$customerName."','".$_POST["CustomerCompany"]."')";
$res = mysqli_query($mysqli, $sql);

Veya bağlama değişkenleri kullanarak:

$stmt = mysqli_prepare($mysqli, "INSERT INTO tblCustomers (custname,company, email, country) VALUES (?, ?, ?, ?)");

mysqli_stmt_bind_param($stmt, 'ssss', $customerName, $_POST["CustomerCompany"], $_POST["CustomerEmail"], $_POST["AddressCountry"]);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);

3 Cevap

Eğer açık varsayılan değerleri kullanarak değil emin değilseniz, o zaman sıkı kontrol modu:

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

MySQL Data Type Default Values

As of MySQL 5.0.2, if a column definition includes no explicit DEFAULT value, MySQL determines the default value as follows:

If the column can take NULL as a value, the column is defined with an explicit DEFAULT NULL clause. This is the same as before 5.0.2.

If the column cannot take NULL as the value, MySQL defines the column with no explicit DEFAULT clause. For data entry, if an INSERT or REPLACE statement includes no value for the column, or an UPDATE statement sets the column to NULL, MySQL handles the column according to the SQL mode in effect at the time:

  • If strict SQL mode is not enabled, MySQL sets the column to the implicit default value for the column data type.

  • If strict mode is enabled, an error occurs for transactional tables and the statement is rolled back. For nontransactional tables, an error occurs, but if this happens for the second or subsequent row of a multiple-row statement, the preceding rows will have been inserted.

Server SQL Modes

Ne yanlış yapıyorsun dizelerini kullanarak yerine bağlama parametreleri kullanarak sorgu inşa ediyor.

Kenara SQL injection güvenlik açığından, boş değerler veritabanı onları görür bile önce boş dizelere dönüştürülür ediliyor.

$x = null;
print_r("VALUES ('$x', 42)");

Çıkışlar:

VALUES ('', 42)

Diğer bir deyişle, boş bir dize, bir NULL eklemiş olursunuz. Eğer bunu yazmak için gerekli olurdu NULL eklemek için:

VALUES (NULL, 42)

Eğer bağlama parametreleri kullanırsanız, o zaman bu sorunu almazsınız ve bir bonus olarak sitenizin pek çok güvenlik delik olmaz. Sana this question cevabını okumak ve orada tavsiye izleyin öneririz. Bu acil sorunu çözmek hem de sitenizin güvenliğini artırmak gibi olacaktır.

Mark Byers katılıyorum - php istediğiniz davranış için yanlıştır.

Re: bağlanma parametreleri üzerindeki Mark'ın Yorumlarınız, kontrol PDO in PHP

Hala parametreleri kullanmak istemiyorsanız, size şunu deneyebilirsiniz:


if (isset($customerName) && $customerName != '')
{
  $c = '\'' . $customerName . '\'';
} else {
  $c = 'null';
}

if (isset($_POST['CustomerCompany']) && $_POST['CustomerCompany'] != '')
{
  $cc = '\'' . $_POST['CustomerCompany'] . '\'';
} else {
  $cc = 'null';
}

$sql = 'INSERT INTO tblCustomers (custname,company) 
        VALUES ('.$c.','.$cc.')';

Edit: sadece değerler ilk null / boş olmamasını sağlamak için PHP kodu kontrol düşündünüz mü? Eğer tamamen veritabanına gezi önlemek verebilir yolu (Yorumlarınız benim yorumuna dayanan)? Bir MySQL davranış cevap değil, gerçekten sorunu çözmek olabilir.