Requete SQL avec array [Résolu]

Messages postés
321
Date d'inscription
samedi 12 février 2005
Dernière intervention
21 février 2013
- - Dernière réponse : cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
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
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
Messages postés
202
Date d'inscription
jeudi 24 juin 2004
Dernière intervention
22 janvier 2009
3
Merci
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...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de cs_AshenShugar
Messages postés
321
Date d'inscription
samedi 12 février 2005
Dernière intervention
21 février 2013
0
Merci
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
Commenter la réponse de cs_joebuz
Messages postés
2368
Date d'inscription
mercredi 13 octobre 2004
Dernière intervention
18 avril 2015
0
Merci
SELECT * FROM table WHERE page='index' OR page='forum' OR ...

etc...
Commenter la réponse de FhX
Messages postés
10918
Date d'inscription
lundi 24 février 2003
Dernière intervention
2 mars 2010
0
Merci
Hello,

SELECT pas_etoile_mais_le_nom_des_champs_voulus FROM table WHERE page IN ('index', 'forum', ...)
Commenter la réponse de malalam
Messages postés
321
Date d'inscription
samedi 12 février 2005
Dernière intervention
21 février 2013
0
Merci
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
Commenter la réponse de cs_joebuz
Messages postés
132
Date d'inscription
mardi 21 juin 2005
Dernière intervention
18 juin 2009
0
Merci
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.
Commenter la réponse de stiml
Messages postés
202
Date d'inscription
jeudi 24 juin 2004
Dernière intervention
22 janvier 2009
0
Merci
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...
Commenter la réponse de cs_AshenShugar
Messages postés
321
Date d'inscription
samedi 12 février 2005
Dernière intervention
21 février 2013
0
Merci
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
Commenter la réponse de cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Dernière intervention
21 février 2013
0
Merci
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
Commenter la réponse de cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Dernière intervention
21 février 2013
0
Merci
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
Commenter la réponse de cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Dernière intervention
21 février 2013
0
Merci
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
Commenter la réponse de cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Dernière intervention
21 février 2013
0
Merci
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
Commenter la réponse de cs_joebuz
Messages postés
321
Date d'inscription
samedi 12 février 2005
Dernière intervention
21 février 2013
0
Merci
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
Commenter la réponse de cs_joebuz
Messages postés
202
Date d'inscription
jeudi 24 juin 2004
Dernière intervention
22 janvier 2009
0
Merci
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...
Commenter la réponse de cs_AshenShugar
Messages postés
321
Date d'inscription
samedi 12 février 2005
Dernière intervention
21 février 2013
0
Merci
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
Commenter la réponse de cs_joebuz

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.