]> granicus.if.org Git - php/commitdiff
Fixed bug #41698 (float parameters truncated to integer in prepared
authorIlia Alshanetsky <iliaa@php.net>
Tue, 26 Jun 2007 01:24:10 +0000 (01:24 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Tue, 26 Jun 2007 01:24:10 +0000 (01:24 +0000)
statements).

NEWS
ext/pdo/pdo_stmt.c
ext/pdo_mysql/tests/bug_41698.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index a8496037aea0002f924924c20e80e46365fb94be..499a01e493e362ff42717d2e2d29612452d1cf75 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -45,6 +45,8 @@ PHP                                                                        NEWS
 - Fixed bug #41717 (imagepolygon does not respect thickness). (Pierre)
 - Fixed bug #41711 (NULL temporary lobs not supported in OCI8). 
   (Chris Jones, Tony)
+- Fixed bug #41698 (float parameters truncated to integer in prepared 
+  statements). (Ilia)
 - Fixed bug #41686 (Omitting length param in array_slice not possible).
   (Ilia)
 - Fixed bug #41685 (array_push() fails to warn when next index is already
index 90f3b023b3aa0bbd1d39fc13f78178104da13b60..87b972449ca623ce6c96ac68884b352ca8caa179 100755 (executable)
@@ -280,7 +280,13 @@ static int really_register_bound_param(struct pdo_bound_param_data *param, pdo_s
        }
 
        if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
-               convert_to_string(param->parameter);
+               if (Z_TYPE_P(param->parameter) == IS_DOUBLE) {
+                       char *p;
+                       int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter));
+                       ZVAL_STRINGL(param->parameter, p, len, 0);
+               } else {
+                       convert_to_string(param->parameter);
+               }
        } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
                convert_to_long(param->parameter);
        } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) {
diff --git a/ext/pdo_mysql/tests/bug_41698.phpt b/ext/pdo_mysql/tests/bug_41698.phpt
new file mode 100644 (file)
index 0000000..b2dee60
--- /dev/null
@@ -0,0 +1,37 @@
+--TEST--
+PDO MySQL Bug #41698 (float parameters truncated to integer in prepared statements)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded');
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
+
+setlocale(LC_ALL, "de","de_DE","de_DE.ISO8859-1","de_DE.ISO_8859-1","de_DE.UTF-8");
+
+$db->exec('CREATE TABLE test(floatval DECIMAL(8,6))');
+$db->exec('INSERT INTO test VALUES(2.34)');
+$value=4.56;
+$stmt = $db->prepare('INSERT INTO test VALUES(?)');
+$stmt->execute(array($value));
+var_dump($db->query('SELECT * from test')->fetchAll(PDO::FETCH_ASSOC));
+?>
+--EXPECT--
+array(2) {
+  [0]=>
+  array(1) {
+    ["floatval"]=>
+    string(8) "2.340000"
+  }
+  [1]=>
+  array(1) {
+    ["floatval"]=>
+    string(8) "4.560000"
+  }
+}
\ No newline at end of file