Edit report at https://bugs.php.net/bug.php?id=60695&edit=1

 ID:                 60695
 User updated by:    nbari at dalmp dot com
 Reported by:        nbari at dalmp dot com
 Summary:            bind_param  'd' appends a 0
 Status:             Open
 Type:               Bug
 Package:            MySQLi related
 Operating System:   FreeBSD
 PHP Version:        5.3.8
 Block user comment: N
 Private report:     N

 New Comment:

The type of column 'name' is text()

After inserting the data, I query via mysql console directly on a terminal and 
notice the 0, so i can confirm it is not an issue with a software displaying or 
formatting numbers with 2 decimal places. 

I made the same test using 'i' (for integer) and instead of 99.3 the stored 
value 
was just 99 (no 0 appended), when using 's' is is working but I start noticing 
this strange behaivor when the search string was an double.

my search query/code is like this: 

$sql = 'select id from test where name=?';

$param = $_POST['name'];
if (is_numeric($param)) {
   $param = !strcmp(intval($param), $param) ? (int)$param : 
(!strcmp(floatval($param), $param) ? (float)$param : $param);
 }
 $type = is_int($param) ? 'i' : (is_float($param) ? 'd' : (is_string($param) ? 
's' : 'b'));

$stmt->bind_param($type,$param);
$stmt->execute();
$stmt->close();


Initially I though that the 'sanitation' made was affecting the results  but 
later manually I specified the types and notice that only with doubles 'd' this 
was happening.


Previous Comments:
------------------------------------------------------------------------
[2012-01-10 05:44:34] anon at anon dot anon

What is the type of the column 'name'?

If it's a string, then bind it as 's' instead of 'd'. If it's a double, there's 
no problem; it's the same number and the internal bits of a double do not have 
a way to represent "93.3" and "93.30" differently -- the bits are identical, so 
the issue is the program or code you're using for *displaying* the number is 
formatting it with 2 decimal places on purpose.

------------------------------------------------------------------------
[2012-01-10 02:51:01] nbari at dalmp dot com

Description:
------------
---
>From manual page: http://www.php.net/mysqli-stmt.bind-param#refsect1-mysqli-
stmt.bind-param-parameters
---

When inserting a 'double' using prepared statements

 d corresponding variable has type double


if the number is on the format n.y  example:1.3, or 99.3, an '0' is appended to 
the number, storing something like 1.30, or 99.30 instead of just 1.3 or 99.3




Test script:
---------------
$mysqli = new mysqli('localhost','dalmp','test','test');

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$name = 99.3;

if ($stmt = $mysqli->prepare('INSERT INTO test set name=?')) {
        
        $stmt->bind_param('d',$name);
        $stmt->execute();
        $stmt->close();
}

$mysqli->close();

#this will store 99.30 instead of just 99.3

Expected result:
----------------
do not alter/append the input with a 0 when selecting 'd' as the bind_parameter 





------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=60695&edit=1

Reply via email to