Outils pour utilisateurs

Outils du site


basededonnees:general

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

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 ?]
Ligne 92: Ligne 92:
  
 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).
Ligne 103: Ligne 118:
 $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 ((: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).
 +
basededonnees/general.1451916812.txt.gz · Dernière modification: 04/01/2016 15:13 de julp