MySQL และ PHP - ใส่ NULL แทนที่จะเป็นสตริงว่าง


88

ฉันมีคำสั่ง MySQL ที่แทรกตัวแปรบางตัวลงในฐานข้อมูล ฉันเพิ่งเพิ่ม 2 ช่องซึ่งเป็นทางเลือก ($ intLat, $ intLng) ตอนนี้หากไม่ได้ป้อนค่าเหล่านี้ฉันจะส่งผ่านสตริงว่างเป็นค่า ฉันจะส่งค่า NULL อย่างชัดเจนไปยัง MySQL ได้อย่างไร (ถ้าว่างเปล่า)

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

คำตอบ:


143

ในการส่ง NULL ไปยัง MySQL คุณต้องทำเช่นนั้น

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

ดังนั้นในรหัสของคุณตรวจสอบif $intLat, $intLngเป็นemptyถ้าพวกเขาจะใช้NULLแทนหรือ'$intLat''$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
สิ่งนี้ไม่ได้เพิ่มค่า mysql NULL สิ่งนี้ตั้งค่าแอตทริบิวต์เป็นสตริง "NULL" ซึ่งแตกต่างจากค่า mysql NULL ฉันแค่บอกว่าคุณเขียนสองสิ่งที่แตกต่างกันอย่างแรกถูกต้องอย่างที่สองไม่มากอย่างที่ฉันคิด
G4bri3l

23
@ G4bri3l: อยู่ใน$queryสตริง$intLatและ$intLngจะไม่ถูกยกมา , NULL, NULL);ดังนั้นเมื่อตัวแปรที่มีการสอดแทรกก็จะเป็น
Rocket Hazmat

2
ใช่ฉันเห็นแล้วตอนนี้ ดี! ขอบคุณที่สละเวลาชี้ให้ฉันเห็น;)
G4bri3l

@ G4bri3l: ไม่มีปัญหา ฉันมาช่วย :)
Rocket Hazmat

3
@alessadro: คำถามนี้เก่ามาก หากคุณกำลังเชื่อมโยงตัวแปรเข้ากับแบบสอบถาม SQL เช่นนั้นแสดงว่าคุณทำผิด! โปรดเปลี่ยนไปใช้คำสั่งที่เตรียมไว้ใน PDO หรือ MySQLi
Rocket Hazmat

17

หากคุณไม่ส่งผ่านค่าคุณจะได้รับค่าว่างเป็นค่าเริ่มต้น

แต่คุณสามารถส่งผ่านคำว่า NULL โดยไม่มีเครื่องหมายอัญประกาศ


8
เขาจะได้รับค่า NULL เป็นค่าเริ่มต้นเท่านั้นถ้าตารางถูกตั้งค่าด้วยวิธีนั้น
Rocket Hazmat

2
สำหรับฉันนั่นคือสิ่งที่ "ไม่บังคับ" หมายถึง
dkretz

17

สิ่งนี้ใช้ได้ดีสำหรับฉัน:

INSERT INTO table VALUES ('', NULLIF('$date',''))

( ''ช่องรหัสเพิ่มครั้งแรก)


1
NULLIF ใช้เวลา 2 NULLIF(expr1, expr2)พารามิเตอร์ ดูdev.mysql.com/doc/refman/5.7/en/…
Roy Hinkley

ฉันคิดว่าสิ่งนี้ดีกว่าเพราะคุณทำได้ในบรรทัดเดียว
hiddeneyes02

ดีและเรียบง่าย!
Hayden Thring

ไม่ง่ายนักด้วยงบที่เตรียมไว้
MrrMan

13

สิ่งที่คุณต้องทำคือ: $variable =NULL;// และส่งผ่านในแบบสอบถามแทรก สิ่งนี้จะเก็บค่าเป็น NULL ใน mysql db


ไม่จำเป็นต้องมีเครื่องหมายคำพูดรอบ "NULL"
Louis

4

โดยปกติคุณจะเพิ่มค่าปกติให้กับ mySQL จาก PHP ดังนี้:

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
}

เมื่อค่าของคุณว่างเปล่า / null ($ val1 == "" หรือ $ val1 == NULL) และคุณต้องการให้ NULL ถูกเพิ่มลงใน SQL ไม่ใช่ 0 หรือสตริงว่างให้เป็นดังต่อไปนี้:

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 เป็น "NULL" และไม่ใช่ "" NULL " ต้องเพิ่มค่าที่ไม่ใช่ค่าว่างเป็น "'". $ val1. "'" เป็นต้น

หวังว่านี่จะช่วยได้ฉันต้องใช้สิ่งนี้สำหรับตัวบันทึกข้อมูลฮาร์ดแวร์บางตัวบางตัวเก็บอุณหภูมิและรังสีส่วนรังสีอื่น ๆ เท่านั้น สำหรับผู้ที่ไม่มีเซ็นเซอร์อุณหภูมิฉันต้องการค่า NULL และไม่ใช่ 0 ด้วยเหตุผลที่ชัดเจน (0 เป็นค่าอุณหภูมิที่ยอมรับได้เช่นกัน)


สำหรับจำนวนเต็มที่กำหนดคอลัมน์วิธีแก้ปัญหาอื่น ๆ ก็ใช้ได้ดี แต่สำหรับช่องข้อความฉันต้องแยกการสืบค้นดังกล่าวข้างต้นเป็นการต่อสายอักขระเหมือนที่ radhoo ทำข้างต้น $ query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (". "NULL". ",". $ val2. ")";
Brian

2

คำถามของคุณสามารถไปได้ดังนี้:

$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 และ $ intLng เป็นตัวเลือก
Rocket Hazmat

สิ่งนี้จะไม่ทำงาน มีบางสิ่งผิดปกติกับข้อมูลโค้ดนี้ (นอกเหนือจากการใช้ตัวแปรที่ไม่ถูกต้องตามที่ Rocket ชี้ให้เห็น) เนื่องจากความสำคัญของตัวดำเนินการ ternary คุณจะต้องมีวงเล็บรอบนิพจน์ NULLแต่ยิ่งคุณจะยังคงรอบค่าของคอลัมน์ในเครื่องหมายคำพูดเดียวดังนั้นคุณจะกลับไปที่ตารางหนึ่งกำหนดสตริงไม่ฐานข้อมูล นอกจากนี้คุณกำลังใช้ PHPs NULL(unquoted) คำหลักซึ่งประเมินเป็นสตริงว่างในบริบทสตริงอีกครั้งคุณจะได้การกำหนดสตริงที่ว่างเปล่า
MrWhite



1

ด้วยเหตุผลบางประการวิธีแก้ปัญหาของ radhoo ไม่ได้ผลสำหรับฉัน เมื่อฉันใช้นิพจน์ต่อไปนี้:

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

'null' (พร้อมเครื่องหมายคำพูด) ถูกแทรกแทน null โดยไม่มีเครื่องหมายคำพูดทำให้เป็นสตริงแทนที่จะเป็นจำนวนเต็ม ในที่สุดฉันก็ลอง:

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

ช่องว่างส่งผลให้มีการแทรกค่าว่างที่ถูกต้อง (ไม่ใส่เครื่องหมายคำพูด) ลงในแบบสอบถาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.