In a mysqli prepared statement, a NULL gets turned into '' (in the case of a string) or 0 (in the case of an integer). I would like to store it as a true NULL. Is there any way of doing this?
+2
A:
The comments to the PHP documentation on mysqli_stmt::bind_param
indicate that passing in NULL
was not easily possible.
Solutions offered in the comments do some pre-preparation work on the prepared statement, replacing the "?"
markers with "NULL"
for every param that has the PHP null
value. The modified query string is then used.
The following function is from user comment 80119:
function preparse_prepared($sQuery, &$saParams)
{
$nPos = 0;
$sRetval = $sQuery;
foreach ($saParams as $x_Key => $Param)
{
//if we find no more ?'s we're done then
if (($nPos = strpos($sQuery, '?', $nPos + 1)) === false)
{
break;
}
//this test must be done second, because we need to
//increment offsets of $nPos for each ?.
//we have no need to parse anything that isn't NULL.
if (!is_null($Param))
{
continue;
}
//null value, replace this ? with NULL.
$sRetval = substr_replace($sRetval, 'NULL', $nPos, 1);
//unset this element now
unset($saParams[$x_Key]);
}
return $sRetval;
}
(It's not really the coding style I would have done it in, but if it works...)
Tomalak
2008-12-16 16:12:44
FWIW, this breaks on "WHERE column_name != ?" because comparisons to NULL are always NULL. This also breaks on "WHERE question = 'et tu, brute?'"
Bill Karwin
2008-12-16 17:55:13