Bug #38386 [Com]: PDO fails to pass Boolean paramatersl

From: Date: Tue, 15 Dec 2015 18:55:57 +0000
Subject: Bug #38386 [Com]: PDO fails to pass Boolean paramatersl
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-197911@lists.php.net to get a copy of this message
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


Thread (5 messages)

« previous php.bugs (#197911) next »