Requete SQL avec array

Résolu
cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
21 février 2013
- 8 mars 2006 à 00:08
cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
21 février 2013
- 12 mars 2006 à 02:03
Bonjour a tous,

Voila j'ai plusieurs requete SQL a suivre qui sont identiques a part la valeur du champ qui changent, je me demandais s'il n'etais pas possible de les regrouper en une seule avec un array ?

exemple :
$sql1 = mysql_query("SELECT * FROM table WHERE page='index'");
$sql2 = mysql_query("SELECT * FROM table WHERE page='forum'");
$sql3 = mysql_query("SELECT * FROM table WHERE page='photos'");
$sql4 = mysql_query("SELECT * FROM table WHERE page='contact'");
$sql5 = mysql_query("SELECT * FROM table WHERE page='membres'");

remplacer par : (si possible)

$champ = array(index,forum,photos,contact,membres);
$sql = mysql_query("SELECT * FROM table WHERE page='$champs'");

j'ai essayé mais ca ne fonctionne pas puisque la valeur de $champ est array !


joebuz

15 réponses

cs_AshenShugar
Messages postés
202
Date d'inscription
jeudi 24 juin 2004
Statut
Membre
Dernière intervention
22 janvier 2009
1
10 mars 2006 à 07:26
mdr, autant pour moi. Ce n'est pas explode mais implode
qui faut utiliser. De plus, si tu es sûr que les valeurs de ton tableau
et que le champs de ta table soit un entier, tu peux te passer des
quotes.



Ca doit donner tu truc comme ca :



$champ = array(01,02,03,04,05,06,07,08,09,10,11,12);



$sql1 =
mysql_query("SELECT mois,nb FROM stats WHERE mois IN (" . implode(",", $champ) . ") AND annee='2006' ") or die ('ERREUR SQL !
'.$sql1. mysql_error());



while($data = mysql_fetch_array($sql1)){

$mois = $data['mois'];

$nb = $data['nb'];



echo "mois ".$mois." : ".$nb." visites
";

}


Ce coup-ci, ça doit marcher !


Le hardware, c'est sur quoi l'on tape lorsque le software merde...
3
cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
21 février 2013

8 mars 2006 à 00:15
j'ai oublié : sachant qu'apres ma requete j'utilise un while car il ya plusieurs lignes differentes a chaque requete et que je veux toute les utiliser.

je m'explique c'est pour des stats, j'ai ma table STATS composée comme ceci :

num page nb jour mois annee

ou nb est le nombre de fois ou la page a été visitée pour jour mois annee

et je souhaite affichée le nb par page et jour par jour ou mois par mois

exemple :
Lundi
index 5 visites
contact 3 visites

Mardi
index 2 visites
contact 10 visites
...


joebuz
0
FhX
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
8 mars 2006 à 00:17
SELECT * FROM table WHERE page='index' OR page='forum' OR ...

etc...
0
malalam
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
8 mars 2006 à 08:00
Hello,

SELECT pas_etoile_mais_le_nom_des_champs_voulus FROM table WHERE page IN ('index', 'forum', ...)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
21 février 2013

8 mars 2006 à 10:24
et si la valeur du IN est variable ?

et je ne peux pas mettre le nom des champs car celui ci aussi est variable soit je cherche 'jour, nb' soit 'mois,nb' soit 'annee,nb'

je peux pas mettre SELECT $unit,nb FROM où $unit serait egal à jour ou mois ou annee

Pour ce que je veux faire je pense que c'est un peu plus compliqué que ça.

en fait dans mon admin je peux choisir d'afficher les stats pour la semine, le mois, l'annee ou pour une periode

pour afficher le total par page pour la periode choisie ya pas de probleme je fais comme ça :

$sql = mysql_query("SELECT page,nb FROM stats WHERE jour<='$jourfin' AND jour>='$jourdebut' AND mois<='$moisfin' AND mois>='$moisdebut' AND annee<='$anneefin' AND annee>='$anneedebut'") or die ('EREEUR SQL ! '.$sql. mysql_error());
while($data = mysql_fetch_array($sql)){
$page = $data['page'];
$nb = $data['nb'];
$okpage = 0;
$sql2 = mysql_query("SELECT * FROM statgenpage WHERE page='$page'");
if($data2 = mysql_fetch_array($sql2)){
$okpage=1;
}

if($okpage == 0){
$sql3 = mysql_query("INSERT INTO statgenpage VALUES('','$page','$nb')");
}
else{
$sql3 = mysql_query("UPDATE statgenpage SET nb=nb+'$nb' WHERE page='$page'");
}
}
echo "\";
$sql2 = mysql_query(\"SELECT page,nb FROM statgenpage ORDER BY num\");
while($data2 = mysql_fetch_array($sql2)){
$page = $data2['page'];
$nb = $data2['nb'];
echo \"----
".$page." :, ".$nb." visites, \";
}
echo "
";
$sql3 = mysql_query("DELETE FROM statgenpage");

Mais si je veux pour la periode choisie afficher le meme resultat jour par jour ou mois par mois ou anne par annee (pas avoir le total comme au-dessus)

il faut que je fasse la meme chose mais par exemple pour un affichage mois par mois :

pour janvier
$sql = mysql_query("SELECT page,nb FROM stats WHERE jour<='$jourfin' AND jour>='$jourdebut' AND mois=01 AND annee<='$anneefin' AND annee>='$anneedebut'") or die ('EREEUR SQL ! '.$sql. mysql_error());

pour fevrier
$sql = mysql_query("SELECT page,nb FROM stats WHERE jour<='$jourfin' AND jour>='$jourdebut' AND mois=02 AND annee<='$anneefin' AND annee>='$anneedebut'") or die ('EREEUR SQL ! '.$sql. mysql_error());

pour mars
$sql = mysql_query("SELECT page,nb FROM stats WHERE jour<='$jourfin' AND jour>='$jourdebut' AND mois=03 AND annee<='$anneefin' AND annee>='$anneedebut'") or die ('EREEUR SQL ! '.$sql. mysql_error());

...

j'ai pas envie de faire 12 requete pour un affichage mois par mois et 31 pour un affichage jour par jour !!!

je voudrais faire qu'une seule requete generale !

joebuz
0
stiml
Messages postés
132
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
18 juin 2009

9 mars 2006 à 10:51
salut,
Voici le code que tu a donné :

exemple :
$sql1 = mysql_query("SELECT * FROM table WHERE page='index'");
$sql2 = mysql_query("SELECT * FROM table WHERE page='forum'");
$sql3 = mysql_query("SELECT * FROM table WHERE page='photos'");
$sql4 = mysql_query("SELECT * FROM table WHERE page='contact'");
$sql5 = mysql_query("SELECT * FROM table WHERE page='membres'");

remplacer par : (si possible)

$champ = array(index,forum,photos,contact,membres);
$sql = mysql_query("SELECT * FROM table WHERE page='$champs'");

je pense qu'il faut que tu mette une boucle exemple :

$champ = array(index,forum,photos,contact,membres);
for ($i=1;$i=count($champ);$i++)
{
$sql = mysql_query("SELECT * FROM table WHERE page='$champs'");
}


--------------------
StimL.
0
cs_AshenShugar
Messages postés
202
Date d'inscription
jeudi 24 juin 2004
Statut
Membre
Dernière intervention
22 janvier 2009
1
9 mars 2006 à 14:03
Il y a plus simple encore :

$champ = array(index,forum,photos,contact,membres);
$sql1 = mysql_query("SELECT * FROM table WHERE page IN ('" . explode("','", $champ) . "')");

Ainsi, pas besoin de boucle.

Le hardware, c'est sur quoi l'on tape lorsque le software merde...
0
cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
21 février 2013

9 mars 2006 à 23:27
non ca ne fonctionne pas.

537795 stiml --> la boucle for ne fonctionne pas, c'a prend beaucoup trop de temps

j'ai essayé tout simplement
$champ = array(index,forum,photos,contact,membres);
for ($i= 1;$i=count($champ);$i++)
{
echo "champ : ".$champ."
";
}

et cela m'affiche champ : array sur une centaine de ligne ( a peu pres j'ai pas compté !)

AshenShugar --> ca ne fonctionne pas j'ai rien qui s'affiche ni d'erreur sql ni de resultats voici le script :
$champ = array(01,02,03,04,05,06,07,08,09,10,11,12);

$sql1 = mysql_query("SELECT mois,nb FROM stats WHERE mois IN ('" . explode("','", $champ) . "') AND annee='2006' ") or die ('ERREUR SQL ! '.$sql1. mysql_error());

while($data = mysql_fetch_array($sql1)){
$mois = $data['mois'];
$nb = $data['nb'];

echo "mois ".$mois." : ".$nb." visites
";
}


joebuz
0
cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
21 février 2013

9 mars 2006 à 23:30
j'ai oublie

297927 AshenShugar --> ca ne peux pas fonctionner car la valeur de $champ dans IN est array, j'ai fait un essai comme ça :

$champ = array(01,02,03,04,05,06,07,08,09,10,11,12);
$moissearch = "('" . explode("','", $champ) . "')";
echo $moissearch."
";

et ca m'affiche ('array')

joebuz
0
cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
21 février 2013

11 mars 2006 à 16:27
ca fonctionne impec !!

j'ai juste un petit probleme que je n'arrive pas résoudre :

j'ai fait
$champ_mois = array(01,02,03,04,05,06,07,08,09,10,11,12);
$sql2 = mysql_query("SELECT jour,mois,nb FROM stats WHERE mois IN (" . implode(",", $champ_mois) . ") AND annee='2006' ") or die ('ERREUR SQL ! '.$sql1. mysql_error());


while($data = mysql_fetch_array($sql2)){
$mois = $data['mois'];
$nb = $data['nb'];
$jour = $data['jour'];


echo "jour : ".$jour." mois ".$mois." : ".$nb." visites
";
}

ca m'affiche tout les resultats de l'anne 2006 avec les jours et les mois sans probleme
(je pourrais m'en servir pour un affichage mois par mois en enlevant les jours qui me seront inutiles, ici c'etait juste pour verif)

et j'ai fait la meme chose pour un affichage jour par jour pour le mois de fevrier:
$champ_jour = array(01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31);


echo " Mars
";
$sql1 = mysql_query("SELECT jour,nb FROM stats WHERE jour IN (" . implode(",", $champ_jour) . ") AND mois='02' AND annee='2006' ") or die ('ERREUR SQL ! '.$sql1. mysql_error());


while($data = mysql_fetch_array($sql1)){
$jour = $data['jour'];
$nb = $data['nb'];

echo "jour ".$jour." : ".$nb." visites
";
}

ca fonctionne sauf pour les jours 08 et 09 qui ne sont pas affichés !!
et mon probleme est là.
Je ne comprends pas que lorsque je cherche par mois ca m'affiche bien les jours 08 et 09 de chaque mois, mais quand je cherche par jour ces deux jours là ne sont pas affichés, je ne comprends pas !!

mais bon pour l'instant l'affichage mois par mois fonctionne c'est deja ça, pour l'affichage jour par jour au pire je rajouterais deux requetes pour ces jours la (c'est toujours mieux que 31 !!)

Merci a tous !


joebuz
0
cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
21 février 2013

11 mars 2006 à 17:11
encore une question j'ai remplacé la requete comme ça :

$champ_jour = array(01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31);
$jour_req = implode(",", $champ_jour);
$sql1 = mysql_query("SELECT jour,nb FROM stats WHERE jour IN (" . $jour_req. ") AND mois='$moisfin' AND annee='$anneefin' ") or die ('ERREUR SQL ! '.$sql1. mysql_error());

comme j'utilise la meme requete pour un affichage jour par jour pour la semaine et pour le mois

je definie le jour de debut ($jourdebut) et le jour de fin ($jourfin) pour la recherche

$jourfin est egale a date("d");
et $jourdebut est egale à 01 si c'est pour le mois et à $jourfin - 6 si c'est pour la semaine

donc pour la semaine j'aurais souhaite mettre la requete entre un if de ce style :

if(($jour_req >= $jourdebut)&&($jour_req <= $jourfin)){
requete
}

mais le pb c'est qu'ici $jour_req est egale à :

01,02,03,04,...

donc les >= et <= sont inutiles

est-ce qu'il est possible de choisir sur toute la chaine de characteres sont que l'on veut pour par exemple un affichage entre le 05 et le 11 n'avoir que :

$jour_req = 05,06,07,..,10,11;


joebuz
0
cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
21 février 2013

11 mars 2006 à 17:16
tiens je crois savoir pourquoi j'ai pas les jours 08 et 09 voici

$champ_jour = array(01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31);
$jour_req = implode(",", $champ_jour);

echo $jour_req affiche :

1,2,3,4,5,6,7,0,0,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31

il manque le 8 et le 9 !!
et le 0 avant 1,2,3,4,5,6,7

joebuz
0
cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
21 février 2013

11 mars 2006 à 17:39
bon et bien j'ai resolu le probleme du 08 et 09 au lieu j'ai changé mes dates

avant :
$jour = date("d");
$mois = date("m");

maintenant :
$jour = date("j");
$mois = date("n");

ça permet d'enlever les zero

et j'ai modifié mes champs

$champs = array(1,2,3,4,5,6,7,8,9,10,11,...);


joebuz
0
cs_AshenShugar
Messages postés
202
Date d'inscription
jeudi 24 juin 2004
Statut
Membre
Dernière intervention
22 janvier 2009
1
11 mars 2006 à 22:07
Alors là, je ne comprends pas ... :(( Qu'il retire les 0 devant 1, 2,
3, etc... c'est normal, il les interprète comme des entiers, mais
pourquoi il garde les 0 pour le 8 et 9 ... C'est un mystère pour moi !

Mais dans ce cas, pourquoi ça ne te le fait pas pour les mois ?!?!

Le hardware, c'est sur quoi l'on tape lorsque le software merde...
0
cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
21 février 2013

12 mars 2006 à 02:03
pour le mois ca ne me le fais pas car les jours sont pris dans la table donc ca les affiche bien et pour les mois comme j'ai pas encore aout et septembre d'enregistré ca ne me le fais pas sinon je pense que ce serait le meme probleme


joebuz
0