23

I am unable to set a nullable field with a default value of null to null using mysql pdo. I can do it using straight sql.

I have tried: (mostly from this question How do I insert NULL values using PDO?)

  1. Null Int

    bindValue(':param', null, PDO::PARAM_INT); 
  2. Null Null

    bindValue(':param', null, PDO::PARAM_NULL); 
  3. 'Null', Int

    bindValue(':param', 'NULL', PDO::PARAM_INT); 
  4. 'Null', Null

    bindValue(':param', 'NULL', PDO::PARAM_NULL); 
  5. Null

    bindValue(':param', null); 
  6. 'Null'

    bindValue(':param', 'NULL'); 
  7. and the bindParam counterparts of 5 and 6 with a variable that held the value of the binding.

Everything from PDO results in the value being set to 0.

PHP Version: PHP 5.3.2-1ubuntu4.10

MYSQL SERVER VERSION: 5.1.63-0ubuntu0.10.04.1

EDIT Screenshot of column info

Picture

12
  • what is the column type? is that nullable? Commented Jul 27, 2012 at 17:35
  • 2
    @DanielA.White he just said he can do it via straight sql so yes it is nullable. Commented Jul 27, 2012 at 17:35
  • can you show us the rest of your code rather than just your bindValue statements? I suspect if you have tried all these options and it isn't a problem with your actual database then it must be a problem with the rest of your code. Commented Jul 27, 2012 at 17:36
  • @Daniel A. White, I've included a screenshot showing the column is nullable plus as Jon Taylor said, I can do this with straight sql. Commented Jul 27, 2012 at 17:40
  • @JonTaylor The code that builds the query is half a page long and I am NDA'd from sharing it. I can confirm with no doubts that my value binding call is definitely getting called and is not getting overwritten later on. Commented Jul 27, 2012 at 17:41

3 Answers 3

18

NULL values do not require any special treatment. Simply bind your value the usual way

<?php $pdo = new PDO("mysql:host=localhost;dbname=test", "root", "pass"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $pdo->prepare("INSERT INTO `null_test` (`can_be_null`) VALUES (:null)"); $stmt->bindValue(":null", null, PDO::PARAM_STR); $stmt->execute(); 

PDO will detect a null value and send it to database instead of string.

In case of WHERE clause, where your value could be either null or not null, use Mysql's spaceship operator:

$stmt = $sql->prepare("SELECT * FROM table WHERE col <=> :var"); $stmt->bindParam(":var", $nullOrNot); $statement->execute(); 
Sign up to request clarification or add additional context in comments.

2 Comments

This... $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); this little guy right here was the trick. @Truth, Thanks! Great Catch!
Cannot pass parameter 2 by reference
2

I will strong recommend to first assign all parameters to variables and then pass those variables to the bindParam() method.

You can assign by passing NULL to those variables and it will work fine.

$myVar = NULL; $conn->bindParam(':param1' , $myVar , PDO::PARAM_STR); 

Comments

0

If you want to save an empty string as null, you can use a function like this:

function setnull($item){ if ($item === ""){ return NULL; }else{ return $item; } } 

Then you can proceed with insert the usual way.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.