$stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id = :id' ); $stmt->bindValue( ':id', $folder_id, PDO::PARAM_INT ); I have the code above. If a folder has a parent_folder_id then it means it is inside another folder. If this column is NULL then it means that it is a root folder.From my understanding if $folder_id is NULL then it will treat it as 0 (so I get no results with the code as it is because the value in that column is NULL and not 0). If I change the third argument to PDO::PARAM_NULL I still get no results. I believe this is because it evaluates the query as "WHERE parent_folder_id = NULL" which doesn't equal the same as "WHERE parent_folder_id is NULL".Is there a way to have PDO treat this correctly or should I create my SQL statement with an inline if to change the "=" with "is" and swap the bindValue third parameter with the correct one?
3 Réponses :
Peut-être cela? non testé si p> edit: p> Plus quelque chose comme ceci: p> <?php
if (is_null($folder_id)) {
$stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id IS NULL' );
} else {
$stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id = :id' );
$stmt->bindParam( ':id', $folder_id, PDO::PARAM_INT );
}
Cela ne résout pas le problème que je n'ai aucun résultat car si c'est null, je devrais plutôt changer la façon dont je prépare ma requête SQL. Je sais comment je le ferais si c'était le cas (avec une inline-si) mais j'ai le sentiment que PDO est probablement assez intelligent de changer cela pour moi et je ne sais tout simplement pas comment.
Ne faites pas confiance à PDO Trop: Le maintien principal est parti il y a environ 2 ans, et le projet a tout qualifié depuis.
Si vous utilisez MySQL, vous pouvez utiliser le non standard null -Safe opérateur égal code>
, qui peut comparer des valeurs null ou non nulle.
$stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id <=> :id' ); $stmt->bindValue( ':id', $folder_id, PDO::PARAM_INT );
Merci! Cela a fait l'affaire et vous m'avez appris quelque chose aussi, je n'avais jamais utilisé <=> avant (Yikes, un peu à la fête, hein?). Ça va me sauver beaucoup de maux de tête dans le futur, c'est sûr :)
Vous pouvez utiliser null-coffre égal opérateur , Si vous ne modifiez jamais dans une autre base de données et que vous devez mettre à jour la requête, certains d'entre eux ont un <=> code>. Votre requête doit être
Sélectionner une pièce d'identité, Nom à partir de dossiers où parent_folder_id <=>: ID code> p>
non distinct de code> qui fait à peu près la même chose. P>
Désolé, je n'ai pas vu la réponse de Bill quand je l'ai posté
Merci, était la bonne réponse, mais vous étiez trop lent (de quelques secondes hehehe)! ;)