Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/04/2011, 17h46   #1
Membre du Club
 
Avatar de Freedolphin
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 47
Points : 47
Par défaut Problème d'utilisation de $i

Bonjour à tous,

J'ai un code qui permet de faire une requête en fonction du nombre de mots présents dans une variable, séparés par des tirets.
J'isole donc d'abord chaque mot :
Code :
$mot=explode("-",$variable);
Puis je lance ma requête de cette façon :
Citation:
for ($i=0;$i<=1;$i++)
{
$sql=mysql_query("select colonne from table where colonne='$mot[$i]'");
}
Ça fonctionne très bien quand il y a 2 mots mais pas pour 1 seul : il affiche toujours 2 résultats.
Je patauge un peu avec $i, quelqu'un pourrait-il m'aiguiller ?
Merci d'avance.
__________________
Le mieux n'est pas forcément l'ennemi du bien.
Freedolphin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 17h52   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
utilise foreach pour parcourir ton tableau
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 18h09   #3
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Faits suivant le conseil de stealth35

Si tu devais utiliser "for" (mais encore une fois "foreach" est plus indiqué), tu pourrais faire quelque chose comme :

Code :
1
2
3
4
5
6
7
8
$mot = explode("-",$variable);
 
$nb_mots = count($mot);
 
for ($i=0; $i<$nb_mots; $i++)
{
echo $mot[$i].'<br />';
}
Remarque qu'avec cette méthode il n'est possible d'accéder aux éléments du tableaux qu'avec des indices numériques. Il faut par ailleurs que les indices soient parfaitement incrémentés et sans trou dans les index du tableau. Autant de contraintes et d'arguments qui font qu'il est bien plus simple et universel d'utiliser foreach.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 09h00   #4
Membre du Club
 
Avatar de Freedolphin
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 47
Points : 47
Merci à tous les deux.
Je vais essayer de réécrire mon code avec foreach.
Mais je retiens l'astuce de ABCIWEB, surtout que j'avais prévu le comptage du nombre de mots, du coup mettre $nb_mots dans le For est très malin.
Merci encore de votre aide !
__________________
Le mieux n'est pas forcément l'ennemi du bien.
Freedolphin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 09h02   #5
Membre Expert
 
Avatar de Bebel
 
Homme David B.
Développeur informatique
Inscription : avril 2003
Messages : 742
Détails du profil
Informations personnelles :
Nom : Homme David B.
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : avril 2003
Messages : 742
Points : 1 085
Points : 1 085
Pour le "for" ton erreur était sur la condition de fin, comme le montre le code de ABCIWEB

Mais il y a quand même des contres indications à l'utilisation d'un foreach.

Par exemple quand ton tableau contient des objets, niveau optimisation en mémoire ce n'est pas le top. ( mais on peut très bien passer par un array_keys + un foreach pour pallier ce problème )

Après l'avantage du for également c'est pouvoir jouer aussi sur les index.

Après un explode, il y a peu de chance d'avoir un problème sur les indices d'un tableau.
__________________
Tout énigme a une solution ! Tout est question de discipline !
Bebel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 09h49   #6
Membre du Club
 
Avatar de Freedolphin
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 47
Points : 47
Ça fonctionne en effet très bien avec Foreach, c'est plus simple, plus clair.
Le seul hic, c'est que je n'arrive pas à limiter les requêtes, je ne voulais que 3 requêtes, même si le tableau contient 5 mots-clés.
Savez-vous comment indiquer une limite ?

EDIT
J'ai trouvé la réponse à ma question en faisant :
Code :
1
2
3
4
5
6
$i = 0;
foreach ($tableau as $motcle)
{
if(++$i > 3) break;
**ma requete**
}
C'est assez propre ?
__________________
Le mieux n'est pas forcément l'ennemi du bien.
Freedolphin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h02   #7
Membre Expert
 
Avatar de Bebel
 
Homme David B.
Développeur informatique
Inscription : avril 2003
Messages : 742
Détails du profil
Informations personnelles :
Nom : Homme David B.
Âge : 29
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : avril 2003
Messages : 742
Points : 1 085
Points : 1 085
Dans ce cas la, le plus simple, à mon avis, est de passer par un for

Code :
1
2
3
4
5
6
7
8
9
 
$mot = explode("-",$variable);
 
$nb_mots = count($mot);
 
for ($i=0; $i<$nb_mots && $i < 3; $i++)
{
echo $mot[$i].'<br />';
}
Sinon avec un foreach, tu peux utiliser break pour provoquer la sortie du foreach.

A toi de voir.
__________________
Tout énigme a une solution ! Tout est question de discipline !
Bebel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 10h20   #8
Membre du Club
 
Avatar de Freedolphin
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 47
Points : 47
Merci Bebel, du coup je vais rester sur Foreach avec un break comme indiqué plus haut.
__________________
Le mieux n'est pas forcément l'ennemi du bien.
Freedolphin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 16h35   #9
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
Envoyé par Freedolphin Voir le message
J'ai trouvé la réponse à ma question en faisant :
Code :
1
2
3
4
5
6
$i = 0;
foreach ($tableau as $motcle)
{
if(++$i > 3) break;
**ma requete**
}
C'est assez propre ?
C'est une solution, mais si les index de ton tableau sont numériques et incrémentés proprement (sans trous) - ce qui sera le cas avec un explode - tu n'as pas besoin de $i : récupères simplement l'index dans le foreach :

Code :
1
2
3
4
5
foreach ($tableau as $key => $motcle)
{
if($key > 3) break;
**ma requete**
}
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 16h41   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
on peut toujours limiter le explode et supprimer la dernière entrée
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 17h03   #11
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Oui ou utiliser array_slice sur le explode ce qui donnerait un code plus générique

Code :
1
2
3
4
5
6
7
8
9
10
$mot = explode("-",$variable);
 
$select = 3;
 
$tab_mots = array_slice($mot,0,$select);
 
foreach ($tab_mots as $mot_cle)
{
**ma requete**
}
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/04/2011, 17h51   #12
Membre du Club
 
Avatar de Freedolphin
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 47
Points : 47
Merci à tous pour vos suggestions.
Ce forum est plus qu'une bouée de sauvetage, c'est un vrai rendez-vous de passionnés pour progresser.
__________________
Le mieux n'est pas forcément l'ennemi du bien.
Freedolphin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h46.


 
 
 
 
Partenaires

Hébergement Web