|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-06-29 18:02 UTC] an0nym at narod dot ru
Description: ------------ PDOStatement::getColumnMeta() doesn't return native_type for BIT, TINYINT and YEAR type columns (these should be 'BIT', 'TINY' and 'YEAR' respectively). This bug was partly discussed within bug #46533, but that bug is generally about another thing. Reproduce code: --------------- $DB=new PDO('mysql:host=localhost;dbname=test','anyone','anyone'); $DB->exec('CREATE TABLE `test`( `bit` bit(1) ,`tinyint` tinyint ,`year` year)'); $DB->exec('INSERT INTO `test` VALUES(1,1,2000)'); $statement=$DB->query('SELECT `bit`,`tinyint`,`year` FROM `test`'); $bit=$statement->getColumnMeta(0); $tinyint=$statement->getColumnMeta(1); $year=$statement->getColumnMeta(2); var_dump(isset($bit['native_type']),isset($tinyint['native_type']),isset($year['native_type'])); Expected result: ---------------- bool(true) bool(true) bool(true) Actual result: -------------- bool(false) bool(false) bool(false) Patchesfix-bug-48724.patch (last revision 2012-04-13 12:06 UTC by tony2001@php.net)Pull Requests
Pull requests:
HistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Oct 22 16:00:01 2025 UTC |
libmysql and mysqlnd behave the same way. If this is decided to be considered as a bug it is not a mysqlnd bug. ------------ libmysql ----------------------- nixnutz@ulflinux:~/src/login/php5> sapi/cli/php -i | grep -C5 pdo_mysql PDO PDO support => enabled PDO drivers => mysql, sqlite, sqlite2 pdo_mysql PDO Driver for MySQL => enabled Client API version => 5.1.35 pdo_sqlite nixnutz@ulflinux:~/src/login/php5> sapi/cli/php -i | grep configure Configure Command => './configure' '--with-pdo-mysql=/usr/local/mysql/bin/mysql_config' nixnutz@ulflinux:~/src/login/php5> sapi/cli/php pdo.php int(0) int(0) object(PDOStatement)#2 (1) { ["queryString"]=> string(36) "SELECT cbit,ctinyint,cyear FROM test" } array(6) { ["flags"]=> array(0) { } ["table"]=> string(4) "test" ["name"]=> string(5) "cyear" ["len"]=> int(4) ["precision"]=> int(0) ["pdo_type"]=> int(2) } bool(false) bool(false) bool(false) array(1) { [0]=> array(2) { ["VERSION()"]=> string(6) "5.1.35" [0]=> string(6) "5.1.35" } } ------ mysqlnd -------------------- nixnutz@ulflinux:~/src/login/php5> sapi/cli/php -i | grep configure Configure Command => './configure' '--with-pdo-mysql=mysqlnd' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--enable-debug' nixnutz@ulflinux:~/src/login/php5> sapi/cli/php -i | grep -C5 pdo_mysql PDO PDO support => enabled PDO drivers => mysql, sqlite, sqlite2 pdo_mysql PDO Driver for MySQL => enabled Client API version => mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $ Persistent cache => enabled put_hits => 0 -- size => 2000 free_items => 2000 references => 2 Directive => Local Value => Master Value pdo_mysql.cache_size => 2000 => 2000 pdo_mysql.debug => no value => no value pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock pdo_sqlite PDO Driver for SQLite 3.x => enabled SQLite Library => 3.6.16 nixnutz@ulflinux:~/src/login/php5> sapi/cli/php pdo.php int(0) int(0) object(PDOStatement)#2 (1) { ["queryString"]=> string(36) "SELECT cbit,ctinyint,cyear FROM test" } array(6) { ["pdo_type"]=> int(2) ["flags"]=> array(0) { } ["table"]=> string(4) "test" ["name"]=> string(5) "cyear" ["len"]=> int(4) ["precision"]=> int(0) } bool(false) bool(false) bool(false) array(1) { [0]=> array(2) { ["VERSION()"]=> string(6) "5.1.35" [0]=> string(6) "5.1.35" } }Tell me then, why MySQLi is OK with all the types while PDO is not? Nevertheless, it is not just OK, but it is EQUAL in behaviour for all the types except TINYINT, BIT and YEAR. Don't tell me, please, MySQLi type and PDO native type refer to different things. I'm almost sure they don't. At least they shouldn't. <?php $PDO=new PDO('mysql:host=localhost;dbname=test','anyone','anyone'); $PDO->exec("CREATE TABLE `test`( `tinyint` TINYINT NOT NULL ,`smallint` SMALLINT NOT NULL ,`mediumint` MEDIUMINT NOT NULL ,`int` INT NOT NULL ,`bigint` BIGINT NOT NULL ,`decimal` DECIMAL NOT NULL ,`float` FLOAT NOT NULL ,`double` DOUBLE NOT NULL ,`bit` BIT(1) NOT NULL ,`date` DATE NOT NULL ,`datetime` DATETIME NOT NULL ,`timestamp` TIMESTAMP NOT NULL ,`time` TIME NOT NULL ,`year` YEAR NOT NULL ,`char` CHAR(1) NOT NULL ,`varchar` VARCHAR(1) NOT NULL ,`tinytext` TINYTEXT NOT NULL ,`text` TEXT NOT NULL ,`mediumtext` MEDIUMTEXT NOT NULL ,`longtext` LONGTEXT NOT NULL ,`binary` BINARY(1) NOT NULL ,`varbinary` VARBINARY(1) NOT NULL ,`tinyblob` TINYBLOB NOT NULL ,`mediumblob` MEDIUMBLOB NOT NULL ,`blob` BLOB NOT NULL ,`longblob` LONGBLOB NOT NULL ,`enum` ENUM('') NOT NULL ,`set` SET('') NOT NULL)"); $PDO->exec('INSERT INTO `test`(`tinyint`) VALUES(0)'); $PDO_statement=$PDO->query('SELECT * FROM `test`'); $PDO_fields=array(); for($i=0,$n=$PDO_statement->columnCount();$i<$n;++$i){ $PDO_fields[]=$PDO_statement->getColumnMeta($i); } $MySQLi=new mysqli('localhost','anyone','anyone','test'); $MySQLi_result=$MySQLi->query('SELECT * FROM `test`'); $MySQLi_fields=$MySQLi_result->fetch_fields(); $bug_fields=array(); for($i=0,$n=count($PDO_fields);$i<$n;++$i){ if(!isset($PDO_fields[$i]['native_type']) or constant('MYSQLI_TYPE_'.$PDO_fields[$i]['native_type'])!=$MySQLi_field s[$i]->type){ $bug_fields[]=$PDO_fields[$i]['name']; } } var_dump($bug_fields); $PDO->exec('DROP TABLE `test`'); ?>