Bug #80604 [Opn->Ver]: Changed behaviour of mysqli_stmt::bind_result in PHP-7.4

From: Date: Thu, 07 Jan 2021 14:06:57 +0000
Subject: Bug #80604 [Opn->Ver]: Changed behaviour of mysqli_stmt::bind_result in PHP-7.4
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-231429@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=80604&edit=1

 ID:                 80604
 Updated by:         cmb@php.net
 Reported by:        devel at mindscan dot de
 Summary:            Changed behaviour of mysqli_stmt::bind_result in
                     PHP-7.4
-Status:             Open
+Status:             Verified
 Type:               Bug
 Package:            MySQLi related
 Operating System:   Linux
 PHP Version:        7.4.13
 Block user comment: N
 Private report:     N

 New Comment:

Apparently, this regression has been introduced with the support
for typed properties[1].

[1] <https://github.com/php/php-src/commit/e219ec144ef6682b71e135fd18654ee1bb4676b4>


Previous Comments:
------------------------------------------------------------------------
[2021-01-07 09:03:43] devel at mindscan dot de

Description:
------------
I recently updated from PHP-7.3 to PHP-7.4 and noticed a behaviour, that I was not expecting. The
following database and script are a minimal example to demonstrate my problem:

```
CREATE TABLE user (
  idUser int(11) NOT NULL AUTO_INCREMENT,
  name varchar(64) NOT NULL,
  PRIMARY KEY (idUser)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

INSERT INTO user VALUES
(1,'Alice'),(2,'Eve'),(3,'Bob'),(4,'Rick');

CREATE TABLE user_data (
  idUserData int(11) NOT NULL AUTO_INCREMENT,
  idUser int(11) NOT NULL,
  data text NOT NULL,
  PRIMARY KEY (idUserData),
  KEY idUser (idUser)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

INSERT INTO user_data VALUES (1,1,'likes to read'),(2,3,'plays in a
band');
```

```
<?php
$mysqli = new mysqli (HOST, USER, PASSWORD, DATABASE);

$stmt = $mysqli->prepare('SELECT idUser, name FROM user');
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($idUser, $name);

$stmt2 = $mysqli->prepare('SELECT data FROM user_data WHERE idUser = ?');
while ($stmt->fetch())
{
    $stmt2->bind_param('i', $idUser);
    $stmt2->execute();
    $stmt2->store_result();
    $stmt2->bind_result($data);
    $stmt2->fetch();

    print $name . ' => ' . $data . '<br>';
}
?>
```

PHP-7.3 gives me the following output (that I am expecting):
```
Alice =>  likes to read
Eve =>
Bob =>  plays in a band
Rick =>
```

With PHP-7.4 I get this output:
```
Alice =>  likes to read
Eve =>  likes to read
Bob =>  plays in a band
Rick =>  plays in a band
```

The bind_result() or fetch() in the while loop do not clear $data on an empty sql result set. It
still contains the old value from the previous iteration. In PHP-7.3 and lesser versions, the var
was cleared.

Kind regards
David



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



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


Thread (5 messages)

« previous php.bugs (#231429) next »