Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

A null expression parameter raises TypeError when prepared and renders '' in getSqlString()

Ouverte Adaptée aux débutants
#207 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
82/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
php, sql
Domaine
database

Piste de recherche

Commencez dans src/Sql/AbstractSql.php à processExpressionParameterName() (vers la ligne 285) et aux points d'appel autour des lignes 234-242. Élargissez le type du paramètre pour accepter null et renvoyez le littéral SQL NULL au lieu de lever une exception ou de mettre entre guillemets. Mettez à jour l'attente dans PredicateTest, puis exécutez la suite de tests pour vérifier que les modes prepared et getSqlString() rendent NULL correctement.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

bug
Package Version

0.6.x-dev @ e022af5c

Php Version

8.3, 8.4, 8.5

Database Engine

Any

Basic Information

AbstractSql::processExpression() renders a Sql\Argument\Value in one of two ways (AbstractSql.php#L234-L242):

  • With a parameter container, it calls processExpressionParameterName(), whose $value is int|float|string|bool (AbstractSql.php#L285). Value::getValue() can return null, which raises a TypeError.
  • Without one, it calls quoteValue((string) $argument->getValue()), which turns null into a quoted empty string.

So a = ? with null either fails to prepare or renders a = '', a different query. This affects every predicate holding a null Value, including expression(), equalTo() and the other comparison methods.

Column values already render null as SQL NULL: resolveColumnValue() returns 'NULL' for a null column, so Insert and Update produce VALUES (:id, NULL) in prepared mode too.

The '' expectation in PredicateTest dates from laminas-db (1c5ad3a3, 2022), which recorded what quoting null produced at the time. That test never reaches its assertion on 0.6.x: its helper expects Sql92 to refuse the quote and throw.

Steps to Reproduce
  1. (new Select('t'))->where(new Predicate\Expression('COALESCE(?, 7) = 7', [null])), prepared and executed on SQLite.
  2. The same predicate rendered with getSqlString() on any driver platform.
Expected Behavior

NULL, i.e. COALESCE(NULL, 7), in both modes, consistent with resolveColumnValue().

Inlining NULL changes the SQL text depending on whether a value is null. The alternative is to bind null as a parameter, which keeps one statement shape for statement caching (see #112). That means widening processExpressionParameterName() to accept null, which breaks subclasses that override it with the current signature. No driver package overrides it.

Actual behavior?

Prepared:

TypeError: PhpDb\Sql\AbstractSql::processExpressionParameterName(): Argument #1 ($value) must be of type string|int|float|bool, null given

getSqlString():

SELECT "t".* FROM "t" WHERE COALESCE('', 7) = 7
Langage dominant
PHP
Étoiles
18
Forks
8
Merge moyen
6 j 11 h
PR mergées (30 j)
14

Préparer son environnement

  • Fournit un Dockerfile ou un fichier Docker Compose
  • Aucun modèle de pull request
  • Aucun guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de php-db/phpdb

Toutes les issues de php-db/phpdb

Issues similaires

Plus d'issues PHP

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.