Ian McCullough
Ian McCullough

Reputation: 1443

passing a null value to mysql database

A user fills out a form and if they choose to not fill out a field that is not required php does this:

      if($_SESSION['numofchildren']=="")
         $_SESSION['numofchildren']=null;

But when I use the session variable in a mysql query, the result is not null, but is 0. The column is a tinyint(4) that allows NULL.

Why am I getting a 0 instead of NULL?

Upvotes: 5

Views: 24508

Answers (8)

mamal
mamal

Reputation: 1976

if you want set NULL for any column in DATABASE at first You should check is_null for that column

secuond :if the variable you want Set to null code you must insert "null" in double quote then submit to database

If you set null to double quote("") nothing, nothing will be sent and the database will get an error for example :

function insert_to_db($var){
...
sql="INSERT INTO table VALUES($var)"
...
}

when you use in code with "" and without "" =>

function insert_to_db(null)// error : INSERT INTO table VALUES()
correct: 
function insert_to_db("null")//its ok

Upvotes: 1

Vlado
Vlado

Reputation: 3777

It's very confusing especially when values were posted from a web form. I do it like that:

We assume you need a database field named 'numofchildren' that will accept possible values: NULL, 0, 1, 2.., etc. up to 99 and default should be the SQL NULL value.

SQL field should be defined as:

.. `numofchildren` INT( 2 ) NULL DEFAULT NULL

When you insert your data for the NULL values you pass strings like 'NULL' and look for them when looping the incoming data. The other values you just cast to integers:

    foreach ($data as $v) {
$v['numofchildren'] = !isset($v['numofchildren']) || $v['numofchildren'] === 'NULL' ? '(NULL)' : (int) $v['numofchildren'];
                $q = "INSERT INTO tablename (numofchildren) VALUES ({$v['numofchildren']}) ";
    ...
            }

Note that {$v['numofchildren']} in SQL query is not surrounded with single quotes because you do not pass strings but integers (0,1,2..) or SQL NULL.

I believe it's clear and short and covers the issue.

Upvotes: 0

TMNuclear
TMNuclear

Reputation: 1175

For me it didn't work to put NULL var in database, I used var char(2).

So I just made 2 queries. This way it will work 100%. For your example it would be:

if($_SESSION['numofchildren']=="")
{
$updatequery="
            UPDATE table 
            SET table1='$value', table2='$value2', numofchilrdrentable=(NULL)
            ";
}
else
{
$updatequery="
            UPDATE table 
            SET table1='$value', table2='$value2', numofchilrdrentable='$_SESSION[numofchildren]'
            ";

}
$updatequeryresult=mysql_query($updatequery) or die("query fout " . mysql_error() );    

edit: var char -> var char(2)

Upvotes: 1

Sarmoc
Sarmoc

Reputation: 11

I had the same problem some minutes ago, but then I figured it out. In my case I was making the query with the NULL variables between quotes like these ", '. Let me explain myself... This is what you want to do:

INSERT INTO `tbl_name` (`col1`, `col2`) VALUES (NULL,"some_value");

So if you want to use a NULL variable it should be "NULL", like this:

$var1="NULL"; $var2="some_value";

Now, if you want to use $var2, you will type '$var2' in the query, but you shouldn't do the same for $var1:

INSERT INTO `tbl_name` (`col1`, `col2`) VALUES ($var1,'$var2');

If you put $var1 between quotes, you'll get a 0 instead NULL.

Upvotes: 1

Ian McCullough
Ian McCullough

Reputation: 1443

You all where probably right, but all I had to do is put quotes around the null.

  if($_SESSION['numofchildren']=="")
    $_SESSION['numofchildren']='NULL';

Upvotes: 1

Tyler Carter
Tyler Carter

Reputation: 61557

Probably because PHP doesn't convert 'null' into 'NULL'. You are probably just inserting an empty value.

INSERT INTO TABLE (`Field`) ('')

You probably have the default for the column set to '0', and that means that it will insert a 0 unless you specify a number or NULL

INSERT INTO TABLE ('Field') (NULL)

To fix this, check for Null Values before you do the query.

foreach($values as $key => $value)
{
     if($value == null)
     {
         $values[$key] = "NULL";
     }
}

I have a feeling that prepared statements will have the foresight to do this automagically. But, if you are doing inline statements, you need to add a few more things.

MySQL values must have quotes around them, but Nulls don't. Therefore, you are going to need to quote everything else using this

foreach($values as $key => $value)
{
     if($value == null)
     {
         $values[$key] = "NULL";
     }
     else
     {
         // Real Escape for Good Measure
         $values[$key] = "'" . mysql_real_escape_string($value) . "'";
     }
}

Then, when you create the statement, make sure to not put quotes around any values

$SQL = "INSERT INTO TABLE (Field) VALUES(".$values['field'].")";

turns into

$SQL = "INSERT INTO TABLE (Field) VALUES("Test Value")";

or

$SQL = "INSERT INTO TABLE (Field) VALUES(NULL)";

Upvotes: 10

karim79
karim79

Reputation: 342635

Have a look at the table definition for whichever table you're inserting into. The 'default' value for that field is probably set to zero.

The version of MySql you are using is quite important in determining precisely how MySql treats Data Type Default Values.

The above link says:

For numeric types, the default is 0, with the exception that for integer or floating-point types declared with the AUTO_INCREMENT attribute, the default is the next value in the sequence.

Upvotes: 4

Havenard
Havenard

Reputation: 27854

null parsed to string becomes 0. Try using is_null() to check that first and place NULL instead of 0 in the query.

Or, try using PDO and PDO::prepare for a perfect and hacker-safe query.

Upvotes: 0

Related Questions