MySQL và PHP - chèn NULL thay vì chuỗi rỗng


85

Tôi có một câu lệnh MySQL chèn một số biến vào cơ sở dữ liệu. Gần đây tôi đã thêm 2 trường là tùy chọn ($ intLat, $ intLng). Ngay bây giờ, nếu những giá trị này không được nhập, tôi sẽ chuyển một chuỗi trống làm giá trị. Làm cách nào để chuyển một giá trị NULL rõ ràng cho MySQL (nếu trống)?

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

Câu trả lời:


141

Để chuyển một NULL cho MySQL, bạn chỉ cần thực hiện điều đó.

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

Vì vậy, trong mã của bạn, kiểm tra if $intLat, $intLngempty, nếu họ đang có, sử dụng NULLthay vì '$intLat'hay '$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
Điều này không thêm giá trị mysql NULL. Điều này đặt thuộc tính thành chuỗi "NULL" khác với giá trị NULL của mysql. Tôi chỉ nói rằng bạn đã viết hai điều khác nhau, đầu tiên là chính xác, thứ hai là không quá nhiều tôi nghĩ.
G4bri3l

22
@ G4bri3l: Trong $querychuỗi, $intLat$intLngkhông được trích dẫn. Vì vậy, khi các biến được nội suy, nó sẽ như vậy , NULL, NULL);.
Rocket Hazmat

2
Ồ, tôi hiểu rồi. Đẹp! Cảm ơn vì đã dành thời gian để chỉ ra cho tôi;)
G4bri3l

@ G4bri3l: Không có vấn đề gì. Tôi ở đây để trợ giúp :)
Rocket Hazmat

2
@alessadro: Câu hỏi này rất cũ. Nếu bạn đang nối các biến vào một truy vấn SQL như vậy, thì bạn đang làm sai! Vui lòng chuyển sang sử dụng các câu lệnh đã chuẩn bị sẵn trong PDO hoặc MySQLi.
Rocket Hazmat vào

17

Nếu bạn không chuyển các giá trị, bạn sẽ nhận được giá trị null cho các giá trị mặc định.

Nhưng bạn chỉ có thể chuyển từ NULL mà không cần dấu ngoặc kép.


8
Anh ta sẽ chỉ nhận được NULL cho mặc định, nếu bảng được thiết lập theo cách đó.
Rocket Hazmat

2
Đối với tôi đó là những gì "tùy chọn" có nghĩa là.
dkretz

17

Điều này phù hợp với tôi:

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

( ''trường id gia số đầu tiên )


1
NULLIF nhận 2 tham số NULLIF(expr1, expr2). Xem dev.mysql.com/doc/refman/5.7/en/…
Roy Hinkley

Tôi nghĩ rằng đây là tốt hơn bởi vì bạn có thể làm chỉ trong một dòng
hiddeneyes02

Đẹp và đơn giản!
Hayden Thring

Không đơn giản như vậy với các tuyên bố chuẩn bị sẵn.
MrrMan

13

Tất cả những gì bạn phải làm là: $variable =NULL;// và chuyển nó vào truy vấn chèn. Điều này sẽ lưu trữ giá trị dưới dạng NULL trong mysql db


Không cần dấu ngoặc kép xung quanh "NULL".
Louis

4

Thông thường, bạn thêm các giá trị thông thường vào mySQL, từ PHP như sau:

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
}

Khi giá trị của bạn trống / null ($ val1 == "" hoặc $ val1 == NULL) và bạn muốn NULL được thêm vào SQL chứ không phải 0 hoặc chuỗi trống, như sau:

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
}

Lưu ý rằng null phải được thêm vào là "NULL" chứ không phải là "" NULL ". Các giá trị không phải null phải được thêm dưới dạng "'". $ Val1. "'", V.v.

Hy vọng điều này sẽ hữu ích, tôi chỉ phải sử dụng điều này cho một số bộ ghi dữ liệu phần cứng, một số trong số chúng thu thập nhiệt độ và bức xạ, những người khác chỉ bức xạ. Đối với những người không có cảm biến nhiệt độ, tôi cần NULL chứ không phải 0, vì những lý do rõ ràng (0 cũng là giá trị nhiệt độ được chấp nhận).


Đối với các số nguyên được xác định theo cột, giải pháp khác hoạt động tốt, nhưng đối với các trường văn bản, tôi phải chia nhỏ truy vấn như trên thành một nối chuỗi, giống như radhoo đã làm ở trên. $ query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (". "NULL". ",". $ val2. ")";
Brian

2

truy vấn của bạn có thể diễn ra như sau:

$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 và $ intLng là những cái tùy chọn.
Rocket Hazmat

Điều này sẽ không hoạt động. Có khá nhiều điều sai với đoạn mã này (ngoài việc sử dụng các biến sai, như Rocket đã chỉ ra). Do tính ưu tiên của toán tử bậc ba, bạn sẽ cần dấu ngoặc đơn xung quanh biểu thức. Nhưng quan trọng là bạn vẫn đang xoay quanh giá trị cột trong dấu ngoặc kép, vì vậy bạn quay lại hình vuông, gán một chuỗi chứ không phải cơ sở dữ liệu NULL. Ngoài ra, bạn đang sử dụng NULLtừ khóa PHP (không được trích dẫn), từ khóa này đánh giá thành một chuỗi trống trong ngữ cảnh chuỗi, vì vậy, một lần nữa, bạn đang gán một chuỗi trống .
MrWhite

1

Kiểm tra các biến trước khi xây dựng truy vấn, nếu chúng trống, hãy đổi chúng thành chuỗi NULL


1

bạn có thể làm điều đó chẳng hạn với

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

1

Vì một số lý do, giải pháp của radhoo không phù hợp với tôi. Khi tôi sử dụng biểu thức sau:

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

'null' (có dấu ngoặc kép) đã được chèn thay vì null không có dấu ngoặc kép, làm cho nó trở thành một chuỗi thay vì một số nguyên. Vì vậy, cuối cùng tôi đã thử:

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

Khoảng trống dẫn đến giá trị trống chính xác (chưa được trích dẫn) được chèn vào truy vấn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.