113

I have a MySQL statement that inserts some variables into the database. I recently added 2 fields which are optional ($intLat, $intLng). Right now, if these values are not entered I pass along an empty string as a value. How do I pass an explicit NULL value to MySQL (if empty)?

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  '$intLat', '$intLng')";
mysql_query($query);
1
  • $query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng) VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', NULLIF('$intLat',''), NULLIF('$intLng',''))"; Commented Sep 3, 2022 at 4:27

10 Answers 10

172

If your variable already contains null, prepared statements will do it for you without any extra code

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES (?,?,?,?,?,?)";
$data = [$notes, $id, $imageUploaded, $lat, $long, $intLat, $intLng];
$conn->prepare($query)->execute($data);

as simple as that.

Any variable that contains a PHP null will be written as MySQL null. Not to mention this query is safe from SQL injection.

If case you want to set a variable to null if it contains an empty string, here is how you can do it before running this query:

$intLat = ($intLat === '') ? null : $intLat;
Sign up to request clarification or add additional context in comments.

10 Comments

This doesn't add a mysql NULL value. This set the attribute to the string "NULL" which is different from the mysql NULL value. I'm just saying that you wrote two different things, first is correct the second not so much I think.
@G4bri3l: In the $query string, $intLat and $intLng are not quoted. So, when the variables are interpolated, it will be , NULL, NULL);.
Oh yeah I see that now. Nice! Thanks for taking the time to point it out to me ;)
@G4bri3l: No prob. I'm here to help :)
@alessadro: This question is very old. If you are concatenating variables into a SQL query like that, then you are doing it wrong! Please switch to using prepared statements in either PDO or MySQLi.
|
31

This works just fine for me:

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

(first '' increments id field)

4 Comments

NULLIF takes 2 parameters NULLIF(expr1, expr2) . See dev.mysql.com/doc/refman/5.7/en/…
I think this is better because you can do in just one line
Not so simple with prepared statements.
the only one valid answer for pdo, at least for me.
20

If you don't pass values, you'll get nulls for defaults.

But you can just pass the word NULL without quotes.

2 Comments

He'll only get NULL for default, if the table is set up that way.
To me that's what "optional" means.
13

All you have to do is: $variable =NULL; // and pass it in the insert query. This will store the value as NULL in mysql db

1 Comment

No need for quotes around the "NULL".
5

Normally, you add regular values to mySQL, from PHP like this:

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
}

When your values are empty/null ($val1=="" or $val1==NULL), and you want NULL to be added to SQL and not 0 or empty string, to the following:

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
}

Note that null must be added as "NULL" and not as "'NULL'" . The non-null values must be added as "'".$val1."'", etc.

Hope this helps, I just had to use this for some hardware data loggers, some of them collecting temperature and radiation, others only radiation. For those without the temperature sensor I needed NULL and not 0, for obvious reasons ( 0 is an accepted temperature value also).

1 Comment

For column defined integers, the other solution it works fine, but for text fields, I had to break up the query as above into a string concatenation, like radhoo did above. $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (". "NULL". ", ".$val2.")";
2

For some reason, radhoo's solution wouldn't work for me. When I used the following expression:

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

'null' (with quotes) was inserted instead of null without quotes, making it a string instead of an integer. So I finally tried:

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

The blank resulted in the correct null (unquoted) being inserted into the query.

Comments

2

your query can go as follows:

$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 Comments

$intLat, and $intLng are the optional ones.
This will not work. There are quite a few things wrong with this code snippet (apart from using the wrong variables, as Rocket pointed out). Because of the precedence of the ternary operator, you'll need parentheses around the expression. But crucially, you are still surrounding the column value in single quotes, so you are back to square one, assigning a string, not a database NULL. Also, you are using PHPs NULL (unquoted) keyword, which evaluates to an empty string in a string context, so again, you are assigning an empty string.
1

Check the variables before building the query, if they are empty, change them to the string NULL

Comments

1

you can do it for example with

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

Comments

1

2022 | PHP 7.3 | MySQL 5.7

Accepted answer by Rocket Hazmat gives me "NULL" as a string. So I change it to:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.