|
| 1 | +--TEST-- |
| 2 | +GH-13384 Fixed GH-13167 Fixed the behavior when an inappropriate value was passed to `bindValue` and `bindParam`. |
| 3 | +--EXTENSIONS-- |
| 4 | +pdo_mysql |
| 5 | +--SKIPIF-- |
| 6 | +<?php |
| 7 | +require_once __DIR__ . '/inc/mysql_pdo_test.inc'; |
| 8 | +MySQLPDOTest::skip(); |
| 9 | +?> |
| 10 | +--FILE-- |
| 11 | +<?php |
| 12 | +require_once __DIR__ . '/inc/mysql_pdo_test.inc'; |
| 13 | +$db = MySQLPDOTest::factory(); |
| 14 | +$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
| 15 | +$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); |
| 16 | + |
| 17 | +$stringableObject = new class () implements Stringable { |
| 18 | + public function __toString(): string |
| 19 | + { |
| 20 | + return '555'; |
| 21 | + } |
| 22 | +}; |
| 23 | + |
| 24 | +echo "Stringable object, value set after bindParam:\n"; |
| 25 | +try { |
| 26 | + $stmt = $db->prepare('SELECT ?'); |
| 27 | + $param = 'foo'; |
| 28 | + $stmt->bindParam(1, $param, PDO::PARAM_STR); |
| 29 | + $param = $stringableObject; |
| 30 | + $stmt->execute(); |
| 31 | + var_dump(is_object($param), $param === $stringableObject); |
| 32 | + echo "\n"; |
| 33 | +} catch (Throwable $e) { |
| 34 | + echo $e->getMessage()."\n\n"; |
| 35 | +} |
| 36 | + |
| 37 | +echo "Stringable object, bindValue:\n"; |
| 38 | +$stmt = $db->prepare('SELECT (?)'); |
| 39 | +$stmt->bindValue(1, $stringableObject, PDO::PARAM_INT); |
| 40 | +$stmt->execute(); |
| 41 | +var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); |
| 42 | +echo "\n"; |
| 43 | + |
| 44 | +echo "Normal object, bindValue:\n"; |
| 45 | +try { |
| 46 | + $stmt = $db->prepare('SELECT (?)'); |
| 47 | + $stmt->bindValue(1, new stdClass(), PDO::PARAM_INT); |
| 48 | + $stmt->execute(); |
| 49 | +} catch (Throwable $e) { |
| 50 | + echo $e->getMessage()."\n\n"; |
| 51 | +} |
| 52 | + |
| 53 | +echo "Array, bindParam:\n"; |
| 54 | +try { |
| 55 | + $stmt = $db->prepare('SELECT (?)'); |
| 56 | + $param = ['aaa']; |
| 57 | + $stmt->bindParam(1, $param, PDO::PARAM_INT); |
| 58 | + $stmt->execute(); |
| 59 | +} catch (Throwable $e) { |
| 60 | + echo $e->getMessage(); |
| 61 | +} |
| 62 | +?> |
| 63 | +--EXPECT-- |
| 64 | +Stringable object, value set after bindParam: |
| 65 | +bool(true) |
| 66 | +bool(true) |
| 67 | + |
| 68 | +Stringable object, bindValue: |
| 69 | +array(1) { |
| 70 | + [0]=> |
| 71 | + array(1) { |
| 72 | + ["?"]=> |
| 73 | + string(3) "555" |
| 74 | + } |
| 75 | +} |
| 76 | + |
| 77 | +Normal object, bindValue: |
| 78 | +SQLSTATE[HY105]: Invalid parameter type: Expected a scalar value or null |
| 79 | + |
| 80 | +Array, bindParam: |
| 81 | +SQLSTATE[HY105]: Invalid parameter type: Expected a scalar value or null |
0 commit comments