MySQL ve PHP - boş dizge yerine NULL ekleyin


88

Veritabanına bazı değişkenler ekleyen bir MySQL deyimim var. Yakın zamanda isteğe bağlı olan 2 alan ekledim ($ intLat, $ intLng). Şu anda, bu değerler girilmezse, değer olarak boş bir dizge iletiyorum. MySQL'e (boşsa) açık bir NULL değerini nasıl iletirim?

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  '$intLat', '$intLng')";
mysql_query($query);

Yanıtlar:


143

MySQL'e bir NULL geçirmek için, bunu yaparsınız.

INSERT INTO table (field,field2) VALUES (NULL,3)

Yani, kodunuzda, kontrol if $intLat, $intLngvardır emptyeğer olurlarsa, kullanma, NULLyerine '$intLat'ya '$intLng'.

$intLat = !empty($intLat) ? "'$intLat'" : "NULL";
$intLng = !empty($intLng) ? "'$intLng'" : "NULL";

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  $intLat, $intLng)";

9
Bu bir mysql NULL değeri eklemez. Bu, özniteliği mysql NULL değerinden farklı olan "NULL" dizesine ayarlar. Sadece iki farklı şey yazdığını söylüyorum, birincisi doğru, ikincisi pek sanmıyorum.
G4bri3l

23
G4bri3l @: In $querydize, $intLatve $intLngalıntı değildir. Dolayısıyla, değişkenler enterpole edildiğinde, bu olacaktır , NULL, NULL);.
Rocket Hazmat

2
Oh evet şimdi anlıyorum. Güzel! Bana
anlatmak

@ G4bri3l: Sorun yok. Yardım etmek için buradayım :)
Rocket Hazmat

3
@alessadro: Bu soru çok eski. Değişkenleri böyle bir SQL sorgusuna birleştiriyorsanız, yanlış yapıyorsunuz demektir! Lütfen PDO veya MySQLi'de hazırlanmış ifadeleri kullanmaya geçin.
Rocket Hazmat

17

Değerleri iletmezseniz, varsayılanlar için boş değerler alırsınız.

Ancak NULL kelimesini tırnak işaretleri olmadan da geçebilirsiniz.


8
Tablo bu şekilde ayarlanmışsa, yalnızca varsayılan olarak NULL alır.
Rocket Hazmat

2
Bana göre "isteğe bağlı" budur.
dkretz


13

Tek yapmanız gereken: $variable =NULL;// ve bunu ekleme sorgusunda iletmektir. Bu, değeri mysql db'de NULL olarak saklayacaktır.


"NULL" ile ilgili alıntılara gerek yok.
Louis

4

Normalde mySQL'e PHP'den şu şekilde normal değerler eklersiniz:

function addValues($val1, $val2) {
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES ('$val1', '$val2')";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB
}

Değerleriniz boş / null ($ val1 == "" veya $ val1 == NULL) olduğunda ve NULL'un aşağıdakilere 0 veya boş dize değil de SQL'e eklenmesini istiyorsanız:

function addValues($val1, $val2) {
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
        (($val1=='')?"NULL":("'".$val1."'")) . ", ".
        (($val2=='')?"NULL":("'".$val2."'")) . 
        ")";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB
}

Null değerinin "NULL" olarak değil "NULL" olarak eklenmesi gerektiğini unutmayın. Boş olmayan değerler "" ". $ Değer1." '"Vb. Olarak eklenmelidir.

Umarım bu yardımcı olur, bunu bazı donanım veri kaydedicileri için kullanmak zorunda kaldım, bazıları sıcaklık ve radyasyon toplarken, diğerleri sadece radyasyon. Sıcaklık sensörü olmayanlar için, açık nedenlerden dolayı 0'a değil, NULL'a ihtiyacım vardı (0 da kabul edilen bir sıcaklık değeridir).


Sütun tanımlı tamsayılar için, diğer çözüm iyi çalışıyor, ancak metin alanları için yukarıdaki gibi sorguyu, radhoo'nun yukarıda yaptığı gibi bir dize birleştirmeye bölmem gerekiyordu. $ sorgu = "INSERT INTO uradmonitor (db_value1, db_value2) DEĞERLER (". "NULL". ",". $ değer2. ")";
Brian

2

sorgunuz aşağıdaki gibi gidebilir:

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
      VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$lng', '" . ($lat == '')?NULL:$lat . "', '" . ($long == '')?NULL:$long . "')";
mysql_query($query);

2
$ intLat ve $ intLng isteğe bağlı olanlardır.
Rocket Hazmat

Bu işe yaramayacak. Bu kod parçacığında pek çok yanlış şey var (Rocket'ın işaret ettiği gibi yanlış değişkenleri kullanmak dışında). Üçlü operatörün önceliği nedeniyle, ifadenin etrafında parantezlere ihtiyacınız olacaktır. Ama en önemlisi, sütun değerini hala tek tırnak içinde çevreliyorsunuz, bu nedenle birinci kareye geri döndünüz, bir dize atadınız, bir veritabanı değil NULL. Ayrıca, NULLbir dizge bağlamında boş bir dizge olarak değerlendirilen PHPs (tırnaksız) anahtar sözcüğünü kullanıyorsunuz , dolayısıyla yine boş bir dizge atıyorsunuz .
MrWhite

1

Sorguyu oluşturmadan önce değişkenleri kontrol edin, eğer boşlarsa, onları NULL dizesine değiştirin.


1

örneğin bunu yapabilirsin

UPDATE `table` SET `date`='', `newdate`=NULL WHERE id='$id'

1

Bazı nedenlerden dolayı, radhoo'nun çözümü benim için işe yaramaz. Aşağıdaki ifadeyi kullandığımda:

$query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
    (($val1=='')?"NULL":("'".$val1."'")) . ", ".
    (($val2=='')?"NULL":("'".$val2."'")) . 
    ")";

'null' (tırnak işaretli) tırnaksız null yerine eklendi, bu da onu bir tamsayı yerine bir dizge haline getirdi. Sonunda denedim:

$query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
    (($val1=='')? :("'".$val1."'")) . ", ".
    (($val2=='')? :("'".$val2."'")) . 
    ")";

Boş, sorguya doğru boş (tırnaksız) eklenmesiyle sonuçlandı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.