Doc #78945 [Opn->Dup]: Different behavior PARAM_INT on string in 7.0 and 7.2

From: Date: Sat, 14 Dec 2019 18:22:06 +0000
Subject: Doc #78945 [Opn->Dup]: Different behavior PARAM_INT on string in 7.0 and 7.2
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-17126@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=78945&edit=1

 ID:                 78945
 Updated by:         cmb@php.net
 Reported by:        shol_ at hotmail dot com
 Summary:            Different behavior PARAM_INT on string in 7.0 and
                     7.2
-Status:             Open
+Status:             Duplicate
 Type:               Documentation Problem
 Package:            PDO MySQL
 Operating System:   CentOS
 PHP Version:        7.2.25 + 7.3
-Assigned To:        
+Assigned To:        cmb
 Block user comment: N
 Private report:     N

 New Comment:

This is a duplicate of bug #77954.


Previous Comments:
------------------------------------------------------------------------
[2019-12-14 15:29:51] shol_ at hotmail dot com

@drtechno 
It's not about fetching the results, it's all about the bindParam() on a string variable.
In the example code, I get only one result back.
In PHP v7.2 and v7.3 I get all results from the table back.
To get the same result from the select statement, I have to bind the param with PDO::PARAM_STR. The
code for fetching the results doesn't change.

------------------------------------------------------------------------
[2019-12-14 12:08:11] drtechno at mail dot com

I think the code is working correctly there.
fetchAll(PDO::FETCH_ASSOC)

would return the associated object array inside a fetchAll array.

I'm thinking you are trying to use it like mysqli's fetch_assoc, which you would use
PDO's fetchObject() like so:

$select='SELECT col1,col,col3 FROM table';
$query = $pdo->query($select);
$items = $query ->fetchObject();
Print_r($items);

------------------------------------------------------------------------
[2019-12-11 14:04:04] shol_ at hotmail dot com

Description:
------------
The main 'problem' I have is undocument change of behavior in pdo's bindParam() when
binding a string as integer.
In php 7.0 I think it's silently binded as string because the queries return the expected
result. In 7.2.25 and 7.3 (I didn't test 7.1) no warnings or exceptions are raised, but all
rows are returned.

I want this change of behavior be documented (please correct me if I'm wrong, I can't find
it here as bug or in the upgrade/release notes).
And a nice to have would be a warning in the logfiles.

Test script:
---------------
$driver_options = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8 COLLATE
UTF8_unicode_ci', PDO::MYSQL_ATTR_LOCAL_INFILE => 1);
	$oDb = new LoggedPDO('mysqli:host=localhost;dbname=DATABASENAME', 'USERNAME',
'PASSWORD',$driver_options);
$oDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$oDb->exec('
	CREATE TABLE test_parambinding (
	  id int(10) NOT NULL,
	  name varchar(10) NOT NULL
	) ENGINE=InnoDB DEFAULT CHARSET=latin1;

	INSERT INTO test_parambinding (id, name) VALUES
	(1, "one"),
	(2, "two");

	ALTER TABLE test_parambinding
	  ADD PRIMARY KEY (id);

	ALTER TABLE test_parambinding
	  MODIFY id int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
	COMMIT;
');
	
$oStmt = $oDb->prepare('SELECT * FROM test_parambinding WHERE name
= :name');
	$name = 'one';
	
echo 'Bind string $name as PDO::PARAM_INT';
echo PHP_EOL;
$oStmt->bindParam(':name', $name, PDO::PARAM_INT);
$oStmt->execute();
$aResults = $oStmt->fetchAll(PDO::FETCH_ASSOC);
var_dump($aResults);

Expected result:
----------------
Not really 'expecting' this, but this is how it worked in php <= 7.0.
The query fetches one (the expected) row:
array(1) {
  [0]=>
  array(2) {
    ["id"]=>
    string(1) "1"
    ["name"]=>
    string(3) "one"
  }
}

Maybe it would be best if PDO generates a warning or throws an exception (string bound as integer?).

Actual result:
--------------
PHP 7.2 and 7.3 fetches all rows (in this example case, both rows).



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



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


Thread (4 messages)

« previous php.doc.bugs (#17126) next »