Emilie
Emilie

Reputation: 668

MySql and PDO: How to send a null param with bindParam()

The value of the param $isConfirmed can be null, 0 or 1. When I try to send "null", PDO is returning me an Exception. How can I resolve that problem ?

$dbHandler = $dbConnection->prepare("INSERT INTO `Group` (visitId, guideId, groupSize, isConfirmed) VALUES (:visitId, :guideId, :groupSize, :isConfirmed)");
        for($i = 0; $i < count($groupId); $i++) { 
                $dbHandler->bindParam(":visitId", $visitId, PDO::PARAM_INT); 
                $dbHandler->bindParam(":guideId", $guideId, PDO::PARAM_INT); 
                $dbHandler->bindParam(":groupSize", $groupSize, PDO::PARAM_INT); 
                $dbHandler->bindParam(":isConfirmed", $isConfirmed, PDO::PARAM_INT); 
                $dbHandler->execute(); 
        }

Upvotes: 1

Views: 5552

Answers (2)

Your Common Sense
Your Common Sense

Reputation: 157889

Update
Well, I was a fool, with all my patronizing.

There actually no need for messing with param type. PDO automatically binds NULL, if value is NULL:

$sql = "CREATE TEMPORARY TABLE `nulltest` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NULL DEFAULT '',
  PRIMARY KEY (`id`)
)";

$pdo->exec($sql);

$stm = $pdo->prepare("INSERT INTO nulltest SET name = ?");
foreach (array("foo", null) as $val)
{
    $stm->execute([$val]);
}
$stm->bindParam(1, $val, PDO::PARAM_STR);
$stm->execute();

$stm->bindValue(1, NULL, PDO::PARAM_INT);
$stm->execute();

$sql = "SELECT count(*) FROM nulltest WHERE name IS NULL";
$num = $pdo->query($sql)->fetchColumn();
var_dump($num); // outputs 3

So, the proper code would be

$sql = "INSERT INTO `Group` (visitId, guideId, groupSize, isConfirmed) 
        VALUES (:visitId, :guideId, :groupSize, :isConfirmed)";
$stm = $dbConnection->prepare($sql);
$stm->bindParam(":visitId",     $visitId,     PDO::PARAM_INT); 
$stm->bindParam(":guideId",     $guideId,     PDO::PARAM_INT); 
$stm->bindParam(":groupSize",   $groupSize,   PDO::PARAM_INT); 
$stm->bindParam(":isConfirmed", $isConfirmed, PDO::PARAM_INT); 

foreach($groupId as $void)
{ 
    $stm->execute(); 
}

nulls will be written all right.

Upvotes: 2

Subin
Subin

Reputation: 3563

Change :

$dbHandler->bindParam(":isConfirmed", $isConfirmed, PDO::PARAM_INT); 

to :

if(is_null($isConfirmed) || !is_int($isConfirmed)){
 $v=null;
 $dbHandler->bindParam(":isConfirmed", $v, PDO::PARAM_NULL);
}else{
 $dbHandler->bindParam(":isConfirmed", $isConfirmed, PDO::PARAM_INT);
}

Upvotes: 1

Related Questions