Page 1 sur 2

Plusieurs valeurs pour une requête !

Posté : 01 mars 2006, 12:49
par Megadeth
Bonjour,

Voici mon p'tit souci qui va être de la routine pour certain(e)

Soit une page avec un formulaire construit via une requête toute bête.
Les enregistrements se présentent en ligne avec des cases à cocher dont l'id correspond à leur clef primaire en base.
Je peux valider 1,2 ou 3 choix.
Les valeurs sont postées vers une autre page...
J'arrive à récupérer ces valeurs mais je voudrais savoir comment construire ma requête avec un foreach ?

Par avance merci

Mega

Posté : 01 mars 2006, 12:59
par heddicmi
En parcourant le foreach, tu vas donc pouvoir trouver les id que tu as coché.

Or, tu dois savoir qu'une requête s'organise avec SELECT ... FROM ... WHERE ... AND/OR ... AND/OR ... etc...

Donc :
Tu commences à écrire dans une variable le début de ta requête jusqu'au WHERE (inclu)...
Puis tu commences ta boucles. A chaque passage, tu vas concaténer un élément de la clause where à ta requête ($req.="truc=$id ";)... Ne pas oublier aussi de concaténer le and et ou le or suivant ce que tu recherhes... De plus, il faut faire attention à ce qu'il n'y en est pas un en trop...

Posté : 01 mars 2006, 13:07
par Hermès
Il me semble que pour des cases à cocher, les valeurs par défaut sont "On" et "Off" selon si elle est cochée ou non et non pas 0 et 1, true et false, etc.

Au fait, ta requête doit faire quoi ? récupérer des données ? les insérer ? les mettre à jour ?

Posté : 01 mars 2006, 13:18
par Ryle
La valeur par défaut d'une case lorsqu'elle est cochée est bien "on". Lorsqu'elle ne l'est pas, elle n'est pas envoyée (isSet ou $nomDeLaCase retourneront faux).

Si l'attribut value="" est renseigné, c'est cette valeur qui est renvoyée lorsque la case est cochée.

Posté : 01 mars 2006, 13:41
par Megadeth
Je vois un peu mieux le truc mais je sèche encore... :cry:

J'ai fait :

foreach($_POST['idpost'] as $idpost){
$q="SELECT * FROM fac WHERE id_fac='$idpost' AND id_abo='".$_SESSION['num']."' order by dat_fac";
}
echo $q;

l'écho me renvoit :
SELECT * FROM fac WHERE id_fac='1' AND id_abo='6403' order by dat_fac

alors que j'ai sélectionné 2 cases à cocher

J'attends tes/vos commentaires ;)

Posté : 01 mars 2006, 13:44
par Hermès
Tu peux nous faire un
echo "<PRE>";
print_r($_POST);
echo "</PRE>";
avant ta requête, et nous poster ce que ça affiche ?

Posté : 01 mars 2006, 13:44
par Megadeth
Le script complet doit générer un fichier PDF construit en fonction des choix de l'internaute. J'utilise la classe FPDF pour se faire.
J'arrive à gérer le tout en général et faire un PDF relatif à un choix mais pas plusieurs :roll:

Posté : 01 mars 2006, 13:47
par Megadeth
Pratique cette manip', ca me renvoie avec 2 choix sélectionnés...

Array
(
[idpost] => Array
(
[0] => 1
[1] => 10
)

[Valider] => Valider
)

Ca correspond bien aux id dans ma base...

Posté : 01 mars 2006, 13:55
par Hermès
C'est normal, à chaque étape de ton foreach tu réécris la requete depuis le début :
$q = "SELECT * FROM fac WHERE id_abo='".$_SESSION['num']."'";
foreach($_POST['idpost'] as $i => $idpost){
  $q .= " AND id_fac".$i."='".$idpost."'";
}
$q .= " order by dat_fac";
echo $q; 
Normalement ça va te donner une requete de la forme :
SELECT * FROM fac WHERE id_abo='???' AND id_fac1='???' AND id_fac2='???' order by dat_fac

Cependant je sais pas si en base tes id_fac s'appelles "id_fac1", "id_fac2", "id_fac3", etc...

Posté : 01 mars 2006, 16:00
par Megadeth
Hé bien non, mon champ de la table factures s'appelle id_fac ni plus ni moins. C'est comme ci vous aviez à dispo vos relevés bancaires en ligne sur toute l'année passée et que vous vouliez créer un PDF reprennant les infos de mars, avril et septembre 2005 par exemple. Vous me suivez ?

Quand ma requête concerne toute l'année 2005, j'ai pas de soucis mais c'est de reprendre uniquement ce qu'à cocher l'internaute qui me pose problème...

C'est plus clair ?

Mega
:wink:

Posté : 01 mars 2006, 16:04
par Hermès
donc ta requête doit avoir quelle allure ?
id_fac='???' OR id_fac='???' OR id_fac='???' (etc) ?

Posté : 01 mars 2006, 18:18
par Megadeth
Merci à tous,

Je veux juste que ma requête fonctionne, peu importe son allure.
Voici ce que j'arrive à obtenir de mieux :

SELECT * FROM fac WHERE id_abo='4368' OR id_fac0='1' OR id_fac1='10' AND life_fac='1' order by dat_fac

On est proche de la soluce mais ca ne me renvoie rien car les champs id_fac0, id_fac1... n'existe pas en base erf.

Mega :?

Posté : 02 mars 2006, 10:36
par Hermès
On va y arriver...
$q = "SELECT * FROM fac WHERE id_abo='".$_SESSION['num']."'";
$premier = 1;
foreach($_POST['idpost'] as $i => $idpost){
  if ($premier == 1) {
    $q .= " AND (";
    $premier = 0;
  } else {
    $q .= " OR";
  }
  $q .= " id_fac='".$idpost."'";
}
if ($premier == 0)
  $q .= ")";
$q .= " order by dat_fac";
echo $q;

Posté : 03 mars 2006, 10:09
par Megadeth
Bonjour Hermès et surtout MERCIIIIIIIIIIiiiiiiiiiiiiiiiiiii ;)

J'avais trouvé un truc pas très académique il faut dire LOL, qui marchait, mais je préfère de loin la "propreté" de ton code.

Par contre, juste une dernière p'tite question avant de fermer ce topic. Quelle est l'utilité des parenthèses dans la ligne ci-dessous ? J'ai essayé sans, ca marche. Sont-ils indispensables. Je te rassure, je les ai gardé mais c'était juste de savoir le pourquoi du comment :)

Ligne ci-dessous :roll:
...id_abo='6432' AND ( id_fac='1' OR id_fac='10') order...

Encore merci

Megadeth

Posté : 03 mars 2006, 10:42
par Hermès
C'est juste pour ne pas avoir de problèmes de priorité entre le AND et le OR.

Lorsque j'écris
"A AND B OR C", est-ce qu'il va faire "A AND (B OR C)" ou bien "(A AND B) OR C" ? Sans parenthèses, le AND est effectué en premier mais vu qu'on a vite fait de se tromper, je préfère regrouper avec des parenthèses pour éviter les accidents.

Dans ton cas, il faut des parenthèses, sinon il va faire
(id_abo=??? AND id_fac=???) OR id_fac=??? OR id_fac=??? OR ...
Ce qui n'est, il me semble, pas l'objectif voulu. Donc ça va marcher oui, mais ça risque de te donner des résultats que tu ne souhaites pas.