diff --git a/framework/yii/db/Command.php b/framework/yii/db/Command.php index d0f3877..bd18e1f 100644 --- a/framework/yii/db/Command.php +++ b/framework/yii/db/Command.php @@ -181,8 +181,9 @@ class Command extends \yii\base\Component { $this->prepare(); if ($dataType === null) { - $this->pdoStatement->bindParam($name, $value, $this->getPdoType($value)); - } elseif ($length === null) { + $dataType = $this->db->getSchema()->getPdoType($value); + } + if ($length === null) { $this->pdoStatement->bindParam($name, $value, $dataType); } elseif ($driverOptions === null) { $this->pdoStatement->bindParam($name, $value, $dataType, $length); @@ -208,10 +209,9 @@ class Command extends \yii\base\Component { $this->prepare(); if ($dataType === null) { - $this->pdoStatement->bindValue($name, $value, $this->getPdoType($value)); - } else { - $this->pdoStatement->bindValue($name, $value, $dataType); + $dataType = $this->db->getSchema()->getPdoType($value); } + $this->pdoStatement->bindValue($name, $value, $dataType); $this->_params[$name] = $value; return $this; } @@ -236,7 +236,7 @@ class Command extends \yii\base\Component $type = $value[1]; $value = $value[0]; } else { - $type = $this->getPdoType($value); + $type = $this->db->getSchema()->getPdoType($value); } $this->pdoStatement->bindValue($name, $value, $type); $this->_params[$name] = $value; @@ -246,25 +246,6 @@ class Command extends \yii\base\Component } /** - * Determines the PDO type for the given PHP data value. - * @param mixed $data the data whose PDO type is to be determined - * @return integer the PDO type - * @see http://www.php.net/manual/en/pdo.constants.php - */ - protected function getPdoType($data) - { - static $typeMap = array( // php type => PDO type - 'boolean' => \PDO::PARAM_BOOL, - 'integer' => \PDO::PARAM_INT, - 'string' => \PDO::PARAM_STR, - 'resource' => \PDO::PARAM_LOB, - 'NULL' => \PDO::PARAM_NULL, - ); - $type = gettype($data); - return isset($typeMap[$type]) ? $typeMap[$type] : \PDO::PARAM_STR; - } - - /** * Executes the SQL statement. * This method should only be used for executing non-query SQL statement, such as `INSERT`, `DELETE`, `UPDATE` SQLs. * No result set will be returned. diff --git a/framework/yii/db/Schema.php b/framework/yii/db/Schema.php index 1d86616..e32917f 100644 --- a/framework/yii/db/Schema.php +++ b/framework/yii/db/Schema.php @@ -187,6 +187,26 @@ abstract class Schema extends Object } /** + * Determines the PDO type for the given PHP data value. + * @param mixed $data the data whose PDO type is to be determined + * @return integer the PDO type + * @see http://www.php.net/manual/en/pdo.constants.php + */ + public function getPdoType($data) + { + static $typeMap = array( + // php type => PDO type + 'boolean' => \PDO::PARAM_BOOL, + 'integer' => \PDO::PARAM_INT, + 'string' => \PDO::PARAM_STR, + 'resource' => \PDO::PARAM_LOB, + 'NULL' => \PDO::PARAM_NULL, + ); + $type = gettype($data); + return isset($typeMap[$type]) ? $typeMap[$type] : \PDO::PARAM_STR; + } + + /** * Refreshes the schema. * This method cleans up all cached table schemas so that they can be re-created later * to reflect the database schema change. diff --git a/tests/unit/framework/db/CommandTest.php b/tests/unit/framework/db/CommandTest.php index d9eb0e7..7b16c76 100644 --- a/tests/unit/framework/db/CommandTest.php +++ b/tests/unit/framework/db/CommandTest.php @@ -219,29 +219,6 @@ class CommandTest extends DatabaseTestCase $this->assertTrue(is_array($result) && isset($result[0])); } - // getPDOType is currently private -// public function testGetPDOType() -// { -// $values = array( -// array(null, \PDO::PARAM_NULL), -// array('', \PDO::PARAM_STR), -// array('hello', \PDO::PARAM_STR), -// array(0, \PDO::PARAM_INT), -// array(1, \PDO::PARAM_INT), -// array(1337, \PDO::PARAM_INT), -// array(true, \PDO::PARAM_BOOL), -// array(false, \PDO::PARAM_BOOL), -// array($fp=fopen(__FILE__, 'rb'), \PDO::PARAM_LOB), -// ); -// -// $command = $this->getConnection()->createCommand(); -// -// foreach($values as $value) { -// $this->assertEquals($value[1], $command->getPdoType($value[0])); -// } -// fclose($fp); -// } - public function testInsert() { } diff --git a/tests/unit/framework/db/SchemaTest.php b/tests/unit/framework/db/SchemaTest.php index 2a3015d..d3cb2fd 100644 --- a/tests/unit/framework/db/SchemaTest.php +++ b/tests/unit/framework/db/SchemaTest.php @@ -67,4 +67,27 @@ class SchemaTest extends DatabaseTestCase $this->assertEquals('order_id', $table->foreignKeys[0]['order_id']); $this->assertEquals('item_id', $table->foreignKeys[0]['item_id']); } + + public function testGetPDOType() + { + $values = array( + array(null, \PDO::PARAM_NULL), + array('', \PDO::PARAM_STR), + array('hello', \PDO::PARAM_STR), + array(0, \PDO::PARAM_INT), + array(1, \PDO::PARAM_INT), + array(1337, \PDO::PARAM_INT), + array(true, \PDO::PARAM_BOOL), + array(false, \PDO::PARAM_BOOL), + array($fp=fopen(__FILE__, 'rb'), \PDO::PARAM_LOB), + ); + + /** @var Schema $schema */ + $schema = $this->getConnection()->schema; + + foreach($values as $value) { + $this->assertEquals($value[1], $schema->getPdoType($value[0])); + } + fclose($fp); + } }