Edit report at https://bugs.php.net/bug.php?id=38386&edit=1
ID: 38386
Comment by: cruxic at gmail dot com
Reported by: bryan at bdrew dot co dot uk
Summary: PDO fails to pass Boolean paramatersl
Status: No Feedback
Type: Bug
Package: PDO related
Operating System: Linux (Fedora5)
PHP Version: 5.1.4
Block user comment: N
Private report: N
New Comment:
This bug still exists in PHP 7.0 with MySQL. It really ought to be fixed. For me it only bites
when PDO::ATTR_EMULATE_PREPARES is false. Here's a complete test case:
<?php
$db = new PDO( "mysql:host=localhost;dbname=DBNAME", "DBUSER",
"DBPASS",
array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false) );
$db->exec( "DROP TABLE IF EXISTS TestPDO;" );
$db->exec( "CREATE TABLE TestPDO (ColT BOOLEAN, ColF BOOLEAN) ENGINE = InnoDB" );
$stmt = $db->prepare( "INSERT INTO TestPDO (ColT, ColF) VALUES (:ColT, :ColF)" );
$stmt->bindValue( ":ColT", TRUE, PDO::PARAM_BOOL );
$stmt->bindValue( ":ColF", FALSE, PDO::PARAM_BOOL );
if (!$stmt->execute())
echo("Bug! Execute returned false! errorCode() was: " . $stmt->errorCode() .
"\n");
$rowCount = $db->query("SELECT COUNT(*) FROM TestPDO")->fetch(PDO::FETCH_NUM)[0];
echo("rowCount $rowCount (expected 1)\n");
?>
Previous Comments:
------------------------------------------------------------------------
[2006-08-17 01:00:01] php-bugs at lists dot php dot net
No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".
------------------------------------------------------------------------
[2006-08-09 13:41:00] iliaa@php.net
Please try using this CVS snapshot:
http://snaps.php.net/php5.2-latest.tar.gz
For Windows:
http://snaps.php.net/win32/php5.2-win32-latest.zip
I've tried this on latest CVS and MySQL 5.0.22 and it works
exactly as intended. Boolean of 1/0 (true/false) are being
inserted.
------------------------------------------------------------------------
[2006-08-09 09:17:06] bryan at bdrew dot co dot uk
Follows is example code highlighting the bug.
Code requires MySQl database 'TestDb' created, together with a user 'tester' and
password 'password' with create and insert rights to the database.
Expected result is a table TestDb.TestTbl with the following contents:
True
False
False
True
Actual result is a table TestDb.TestTbl with the following contents:
False
True
<?php
$dbh = new PDO( 'mysql:host=localhost; dbname=TestDb', 'tester',
'password');
// Create table
$query = 'create table TestDb.TestTbl (MyBoolean boolean)';
$createStatement = $dbh->prepare( $query);
$createStatement->execute();
// Attempt to insert boolean records into table - this does not work
$query = 'insert into TestDb.TestTbl set MyBoolean=?';
$statement = $dbh->prepare( $query);
$statement->bindValue( 1, true, PDO::PARAM_BOOL);
$statement->execute();
$statement->bindValue( 1, false, PDO::PARAM_BOOL);
$statement->execute();
// However by replacing booleans with integers does work
$statement->bindValue( 1, 0, PDO::PARAM_BOOL);
$statement->execute();
$statement->bindValue( 1, 1, PDO::PARAM_BOOL);
$statement->execute();
?>
------------------------------------------------------------------------
[2006-08-08 21:05:01] tony2001@php.net
Thank you for this bug report. To properly diagnose the problem, we
need a short but complete example script to be able to reproduce
this bug ourselves.
A proper reproducing script starts with <?php and ends with ?>,
is max. 10-20 lines long and does not require any external
resources such as databases, etc. If the script requires a
database to demonstrate the issue, please make sure it creates
all necessary tables, stored procedures etc.
Please avoid embedding huge scripts into the report.
------------------------------------------------------------------------
[2006-08-08 20:10:40] bryan at bdrew dot co dot uk
Description:
------------
Using PDO to write boolean variables to a database table via bindValue() does not work.
The attached code fails to insert either of the two rows.
No errors are generated, the code just doesn't work. Its as if NULL is being passed through to
the query.
Substituting the booleans values for the integers 1 and 0 does work.
Database MySQL 5.1 using the InnoDB engine.
Reproduce code:
---------------
$query = 'insert into TestDb set MyBoolean=?';
$statement = $DbConnection->prepare( $query);
$statement->bindValue( 1, true, PDO::PARAM_BOOL);
$statement->execute();
$statement->bindValue( 1, false, PDO::PARAM_BOOL);
$statement->execute();
Expected result:
----------------
Two rows added to the table TestDb.
Row 1 with MyBoolean set to TRUE
Row 2 with MyBoolean set to FALSE
Actual result:
--------------
Nothing is inserted into the database and no errors are reported.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=38386&edit=1