php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #38386 PDO fails to pass Boolean paramatersl
Submitted: 2006-08-08 20:10 UTC Modified: 2006-08-17 01:00 UTC
Votes:12
Avg. Score:4.2 ± 0.7
Reproduced:11 of 11 (100.0%)
Same Version:1 (9.1%)
Same OS:4 (36.4%)
From: bryan at bdrew dot co dot uk Assigned:
Status: No Feedback Package: PDO related
PHP Version: 5.1.4 OS: Linux (Fedora5)
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2006-08-08 20:10 UTC] 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.

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-08-08 21:05 UTC] 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-09 09:17 UTC] 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-09 13:41 UTC] 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-17 01:00 UTC] 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".
 [2015-12-15 18:55 UTC] cruxic at gmail dot com
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");
?>
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Mar 19 06:01:30 2024 UTC