Les deux révisions précédentes
Révision précédente
Prochaine révision
|
Révision précédente
|
basededonnees:general [04/01/2016 15:13] julp [Peut-on rendre une partie d'une requête conditionnelle ?] |
basededonnees:general [04/01/2016 15:16] (Version actuelle) julp [Peut-on rendre une partie d'une requête conditionnelle ?] |
| |
Comment rendre, à présent, b (le paramètre) facultatif ? On va admettre que B (la colonne) ne peut être NULL, ce qui nous permet d'utiliser cette valeur particulière quand nous voudrons ignorer ce "paramètre" (avec PDO, penser à un bindValue/bindParam avec PDO::PARAM_NULL en 3e argument ou simplement assigner NULL en valeur du paramètre avec execute). La requête devient dès lors : ''%%WHERE A = :a AND ((:b IS NULL) OR (B = :b))%%'' et le tour est joué. | Comment rendre, à présent, b (le paramètre) facultatif ? On va admettre que B (la colonne) ne peut être NULL, ce qui nous permet d'utiliser cette valeur particulière quand nous voudrons ignorer ce "paramètre" (avec PDO, penser à un bindValue/bindParam avec PDO::PARAM_NULL en 3e argument ou simplement assigner NULL en valeur du paramètre avec execute). La requête devient dès lors : ''%%WHERE A = :a AND ((:b IS NULL) OR (B = :b))%%'' et le tour est joué. |
| |
| <code php> |
| $bdd = new PDO(/* ... */); |
| $stmt = $bdd->prepare('SELECT * FROM table WHERE A = :a AND ((:b IS NULL) OR (B = :b))'); |
| $stmt->bindValue('a', 3, PDO::PARAM_INT); |
| if (!empty($_POST['query'])) { |
| $stmt->bindValue('b', $_POST['query'], PDO::PARAM_STR); |
| } else { |
| $stmt->bindValue('b', NULL, PDO::PARAM_NULL); |
| } |
| $stmt->execute(); |
| foreach ($stmt as $row) { |
| // afficher $row |
| } |
| </code> |
| |
Notez que je n'ai pas testé cette "technique" sur chaque SGBD mais étant donné qu'ils cherchent tous à être le plus efficace possible, les opérateurs logiques ET/OU sont, selon toute vraisemblance, dits court-circuit partout (au sens où OU n'évalue pas son second opérande si le premier est vrai et, idem pour ET, quand le premier est faux). | Notez que je n'ai pas testé cette "technique" sur chaque SGBD mais étant donné qu'ils cherchent tous à être le plus efficace possible, les opérateurs logiques ET/OU sont, selon toute vraisemblance, dits court-circuit partout (au sens où OU n'évalue pas son second opérande si le premier est vrai et, idem pour ET, quand le premier est faux). |
$binds['b1'] = $binds['b2'] = NULL; | $binds['b1'] = $binds['b2'] = NULL; |
$bdd = new PDO(/* ... */); | $bdd = new PDO(/* ... */); |
$stmt = $bdd->prepare('SELECT * FROM table WHERE A = :a AND ((:b IS NULL) OR (B = :b))'); | $stmt = $bdd->prepare('SELECT * FROM table WHERE A = :a AND ((:b1 IS NULL) OR (B = :b2))'); |
if (!empty($_POST['query'])) { | if (!empty($_POST['query'])) { |
$binds['b1'] = $binds['b2'] | $binds['b1'] = $binds['b2'] = $_POST['query']; |
} | } |
$stmt->execute($binds); | $stmt->execute($binds); |
foreach ($stmt as $row) { | foreach ($stmt as $row) { |
| // afficher $row |
| } |
</code> | </code> |
| |
| Bien qu'illustré par l'intermédiaire de PDO, le principe reste valable avec toute autre API (mysqli, sqlite3, etc). |
| |