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
A voir également:

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 Membre 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
Rejoignez-nous