2018-04-27 - Bug avec l'ordre des paramètres de LOCATE

PHP 7.2, MySQL 5.7.21

LOCATE avec mysqlistmt::bind_param semble inversé les paramètres et a le même comportement que INSTR. Le problème se produit seulement avec deux paramètres. LOCATE('bar', 'foobar'), LOCATE(?, 'foobar') ou LOCATE('bar', ?) donne 4.

INSTR(?, ?) avec 'foobar', 'bar' donne le bon résultat.

$conn = new mysqli($dbHost, $dbUserName, $dbPassword, $dbDatabase);
$query = 'SELECT LOCATE(?, ?)';
$stmt = $conn->prepare($query);
$x1 = 'bar';
$x2 = 'foobar';
$stmt->bind_param('ss', $x1, $x2);
$stmt->execute();
$result = $stmt->get_result();
var_dump($result->fetch_array(MYSQLI_NUM));

Résultat: 0

$conn = new mysqli($dbHost, $dbUserName, $dbPassword, $dbDatabase);
$query = 'SELECT LOCATE(?, ?)';
$stmt = $conn->prepare($query);
$x1 = 'foobar';
$x2 = 'bar';
$stmt->bind_param('ss', $x1, $x2);
$stmt->execute();
$result = $stmt->get_result();
var_dump($result->fetch_array(MYSQLI_NUM));

Résultat: 4

$pdo->prepare('SELECT LOCATE(?, ?) as L');
$result->execute(['bar', 'foobar']);
var_dump($result->fetch(PDO::FETCH_ASSOC));

Résultat: 4

Détecté par un programmeur sur irc://irc.freenode.org/##php. Même erreur sur mon ordinateur.