pdo: cannot send NULL values thru bound parameters.

php.internals

Thies C . Arntzen

21 years ago
as we convert "incoming" zvals to strings in pdo_stmt.c "no matter what"... $stmt = $this->prepareStatement('insert into bla (name) values (:name)'); $name = NULL; var_dump($name); // $name is NULL $stmt->bindParam(':name', $name); var_dump($name); // $name is an empty string am i overlooking something obvious? attached patch "fixes" it for me (NULL is a valid "value" for a string)... re, tc Index: pdo_stmt.c =================================================================== RCS file: /repository/php-src/ext/pdo/pdo_stmt.c,v retrieving revision 1.94 diff -u -w -r1.94 pdo_stmt.c --- pdo_stmt.c 21 Mar 2005 00:29:06 -0000 1.94 +++ pdo_stmt.c 24 Mar 2005 11:13:31 -0000 @@ -253,7 +253,7 @@ } } - if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0) { + if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) { convert_to_string(param->parameter); }

Jared Williams

21 years ago
> $stmt = $this->prepareStatement('insert into bla (name) > values (:name)'); $name = NULL; var_dump($name); // $name is > NULL $stmt->bindParam(':name', $name); var_dump($name); // > $name is an empty string > > am i overlooking something obvious?
$stmt->bindParam(':name', $name, PDO_PARAM_NULL); Or $stmt->bindParam(':name', $name, is_null($name) ? PDO_PARAM_NULL : PDO_PARAM_STR); Is what I've been using, and works. http://pecl.php.net/bugs/bug.php?id=3391 was the original bug report I opened, that's since been fixed. Jared

Thies C . Arntzen

21 years ago
Am 24.03.2005 um 12:32 schrieb Jared Williams:
> >> $stmt = $this->prepareStatement('insert into bla (name) >> values (:name)'); $name = NULL; var_dump($name); // $name is >> NULL $stmt->bindParam(':name', $name); var_dump($name); // >> $name is an empty string >> >> am i overlooking something obvious? > > $stmt->bindParam(':name', $name, PDO_PARAM_NULL); > > Or > > $stmt->bindParam(':name', $name, is_null($name) ? PDO_PARAM_NULL : > PDO_PARAM_STR); > > Is what I've been using, and works. > http://pecl.php.net/bugs/bug.php?id=3391 was the original bug report I > opened, that's since been > fixed. > > Jared > >
i really think that is wrong: (a) NULL is a valid value for a string. (b) bindParam should not change the type of a passed in php-variable. my patch actually only "solves" (a) -- we should also fix (b). to do this we need to: - leave the php-var (zval) untouched in bindParam (except for bumping the refcount) - when we "need" the string value (during execute) we need to seperate and convert so that the original zval keeps its type. re, thies

Marcus Boerger

21 years ago
Hello Thies, may i kindly ask you to provide a test case as a .inc file in pdo/tests. I'll then look into the details? Thursday, March 24, 2005, 12:19:02 PM, you wrote:
> as we convert "incoming" zvals to strings in pdo_stmt.c "no matter what"...
> $stmt = $this->prepareStatement('insert into bla (name) values (:name)'); > $name = NULL; > var_dump($name); // $name is NULL > $stmt->bindParam(':name', $name); > var_dump($name); // $name is an empty string
> am i overlooking something obvious?
> attached patch "fixes" it for me (NULL is a valid "value" for a string)...
> re, tc
> Index: pdo_stmt.c > =================================================================== > RCS file: /repository/php-src/ext/pdo/pdo_stmt.c,v > retrieving revision 1.94 > diff -u -w -r1.94 pdo_stmt.c > --- pdo_stmt.c 21 Mar 2005 00:29:06 -0000 1.94 > +++ pdo_stmt.c 24 Mar 2005 11:13:31 -0000 > @@ -253,7 +253,7 @@ > } > }
> - if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && > param->max_value_len <= 0) { > + if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && > param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) { > convert_to_string(param->parameter); > }
-- Best regards, Marcus mailto:mail@marcus-boerger.de

Thies C . Arntzen

21 years ago
Am 24.03.2005 um 12:28 schrieb Marcus Boerger:
> Hello Thies, > > may i kindly ask you to provide a test case as a .inc file in > pdo/tests. > I'll then look into the details? >
re, thies

Marcus Boerger

21 years ago
Hello Thies, thanks & committed marcus Thursday, March 24, 2005, 12:42:42 PM, you wrote:

Dan Scott

21 years ago
I have updated the PDOStatement::bindParam() documentation to include an explicit example of how to pass a NULL value. Thanks for the suggestion and question! Dan On Thu, 24 Mar 2005 13:33:13 +0100, Marcus Boerger <mail@marcus-boerger.de> wrote: