PDO execute not correctly binding booleans
Personne n'a encore pris cette issue.
- Langage dominant
- C
- Étoiles
- 40.4k
- Forks
- 8.2k
- Merge moyen
- 2 j 13 h
- PR mergées (30 j)
- 96
Description
Description
The following code:
<?php
$db = new PDO(...);
$sql = <<<SQL
CREATE TABLE test (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`birthday` DATE NOT NULL,
`name` VARCHAR(40) NOT NULL,
`salary` INT NOT NULL,
`boss` BIT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SQL;
$query = $db->prepare($sql);
$query->execute();
$sql = <<<SQL
INSERT INTO test
(birthday, name, salary, boss)
VALUES (:birthday, :name, :salary, :boss)
SQL;
$query = $db->prepare($sql);
$staff = [
[
'birthday' => (new DateTime('1995-05-01'))->format('Y-m-d'),
'name' => 'Sharon',
'salary' => '200',
'boss' => TRUE,
],
];
foreach ($staff as $member) {
/* works
$query->bindValue('birthday', $member['birthday'], PDO::PARAM_STR);
$query->bindValue('name', $member['name'], PDO::PARAM_STR);
$query->bindValue('salary', $member['salary'], PDO::PARAM_INT);
$query->bindValue('boss', $member['boss'], PDO::PARAM_BOOL);
$query->execute();
*/
// does not work
$query->execute($member);
}
Resulted in this output:
SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'boss' at row 1
But I expected execute() not to throw an error.
I clearly see the problem in the source as the parameter is always set to be a string on line 424:
Can't the execute() code be improved to check for the param type like it is done in bindValue()?
PHP Version
8.2.0 RC3
Operating System
Alpine Linux
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Reproduisez l’exemple PDO avec la version de PHP signalée, puis lisez ext/pdo/pdo_stmt.c autour des lignes 411-425 et comparez-le avec bindValue() autour des lignes 1465-1475. Confirmez comment execute() gère les valeurs booléennes et ajoutez une couverture de régression montrant le comportement attendu de la liaison BIT.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- c, php
- Domaine
- databases
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 35/100