Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Boucles imbriquees... probleme

10 réponses
Avatar
JC
Bonjour,

j'ai un petit soucis avec deux boucles imbriquées...
Voici ce que j'essaye de faire en simplifiant :
j'ai une liste de mots dans $ref
Récuperer une liste de messages par la commande $req
Je fais une boucle avec toutes les valeurs de $ref et je regarde pour
chacune de ses valeurs si elle est contenue dans une des lignes des
messages :


$req = mysql_query ("select id,message from table where ...");
foreach ($ref as $search_ref)
{
while ($result = mysql_fetch_array($req)
{
$message = $result['message'];
if (ereg($search_ref,$message)) $liste.= $result['id'];
}
}


Bref, ça marche tres bien pour la premiere valeur de $ref, mais ensuite,
j'ai plus rien....
Il faudrait que je deplace la ligne :
$req = mysql_query.... à l'interieur de la boucle while, mais ca me
ferait autant d'acces à la base que de valeur qui sont contenues dans
$ref !!!

A quel endroit je me trompe ? Dois-je obligatoirement inclure la
requette dans la boucle et augmenter le nbr d'acces à la base par
conséquence ?

merci de vos réponses.

JC.

10 réponses

Avatar
Olivier Miakinen

[...]

$req = mysql_query ("select id,message from table where ...");
foreach ($ref as $search_ref)
{
while ($result = mysql_fetch_array($req)
{
$message = $result['message'];
if (ereg($search_ref,$message)) $liste.= $result['id'];
}
}


[...]
Il faudrait que je deplace la ligne :
$req = mysql_query.... à l'interieur de la boucle while, mais ca me
ferait autant d'acces à la base que de valeur qui sont contenues dans
$ref !!!


Et refaire autant d'appels à mysql_fetch_array que de valeurs dans
$search_ref, ça ne te gêne pas ?

Essaye donc d'intervertir les deux boucles, ça devrait fonctionner
mieux. Enfin... c'que j'en dis... je n'ai jamais fait de mysql...

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
JC
Et refaire autant d'appels à mysql_fetch_array que de valeurs dans
$search_ref, ça ne te gêne pas ?


Ben si justement ! D'ou l'origine de mon post ! si $ref comporte 200
valeurs, c'est 200 acces avec la seule solution qui fonctionne (que j'ai
trouvée)!

Essaye donc d'intervertir les deux boucles, ça devrait fonctionner
mieux.


C'est justement l'aide que je viens demander ici...
La solution qui consiste à ne faire qu'une seule requete ne fonctione
pas. Surement qqch de tout bete, mais ça fait 2 jours que je bloque dessus !

Enfin... c'que j'en dis... je n'ai jamais fait de mysql...


JC.

Avatar
Olivier Miakinen

Essaye donc d'intervertir les deux boucles, ça devrait fonctionner
mieux.


C'est justement l'aide que je viens demander ici...


Tu ne sembles pas avoir compris ma réponse.

Je te suggérais de remplacer :
--------------------------------------------------
foreach ($ref as $search_ref)
{
while ($result = mysql_fetch_array($req))
--------------------------------------------------

par :
--------------------------------------------------
while ($result = mysql_fetch_array($req))
{
foreach ($ref as $search_ref)
--------------------------------------------------

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)


Avatar
Bruno Desthuilliers
Bonjour,

j'ai un petit soucis avec deux boucles imbriquées...
(snip)


Je fais une boucle avec toutes les valeurs de $ref et je regarde pour
chacune de ses valeurs si elle est contenue dans une des lignes des
messages :

$req = mysql_query ("select id,message from table where ...");
foreach ($ref as $search_ref)
{
while ($result = mysql_fetch_array($req)
{
$message = $result['message'];
if (ereg($search_ref,$message)) $liste.= $result['id'];
}
}


Pour autant que je sache, MySQL a un support pour les expressions
rationnelles dans la clause where:
http://dev.mysql.com/doc/refman/4.1/en/regexp.html

Bref, avec un peu de chances, ça devrait pouvoir se faire en une seule
requête, et sans boucle...

Avatar
bruno at modulix
JC wrote:
(snip)
La solution qui consiste à ne faire qu'une seule requete ne fonctione
pas. Surement qqch de tout bete,


MySQL supporte les regexps dans les clauses where:
http://dev.mysql.com/doc/refman/4.1/en/regexp.html

Donc si tu a un array avec tes regexps, tu dois pouvoir avoir ce que tu
veux en une seule requête, et sans boucle...

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
JC
MySQL supporte les regexps dans les clauses where:
http://dev.mysql.com/doc/refman/4.1/en/regexp.html

Donc si tu a un array avec tes regexps, tu dois pouvoir avoir ce que tu
veux en une seule requête, et sans boucle...


Mlaheureusement, je ne pourrai pas avoir la resultat que j'espère...
J'ai donné un exemple plus concret en réponse d'Oliver.
Merci pour ta réponse.

JC.

Avatar
JC
Pour autant que je sache, MySQL a un support pour les expressions
rationnelles dans la clause where:
http://dev.mysql.com/doc/refman/4.1/en/regexp.html

Bref, avec un peu de chances, ça devrait pouvoir se faire en une seule
requête, et sans boucle...


Merci de ta réponse. J'ai regardé le lien que tu m'as donné, mais cela
ne peut pas me donner le résultat que je souhaite. Je suis obligé de
faire 2 boucles imbriquées.
J'ai donné un exemple qui resume bien mon probleme en réponse d'Oliver.
Merci par ailleurs de ta réponse.

JC.

Avatar
JC
Tu ne sembles pas avoir compris ma réponse.

Je te suggérais de remplacer :
--------------------------------------------------
foreach ($ref as $search_ref)
{
while ($result = mysql_fetch_array($req))
--------------------------------------------------

par :
--------------------------------------------------
while ($result = mysql_fetch_array($req))
{
foreach ($ref as $search_ref)
--------------------------------------------------


J'avais mal compris ta réponse effectivement, mais je n'aurai pas le
resultat que je cherche...
soit ma table comportant des noms, et une liste de numeros de réference
que la personne possède

bertran | 012,058,123,142,546,789
georges | 025,058,421,546,812
william | 030,123,789,854,888,963,987,999

Sur un formulaire, on me demande quels sont les personnes qui ont les
objets 005,058,142,789

Je souhaite indiquer pour chacun des ces objets quels sont les personnes
qui les possèdent.
La methode qui me paraissait le plus simple consiste à lire le contenu
de ma table une seule fois, puis dans une boucle je teste pour chaque
reference demandée qui possede cette reference.
Dans ce cas, la boucle ne marchera que pour la 1ere reference de ma
liste (soit 005). Si par contre je fais une requete dans chaque boucle
(soit 4 car il y a 4 references) cela fonctionne. Mais je ne pense pas
que faire autant d'acces à la base qu'il y a de references soit une
bonne idee.

JC.

Avatar
ftc
J'avais mal compris ta réponse effectivement, mais je n'aurai pas le
resultat que je cherche...
soit ma table comportant des noms, et une liste de numeros de réference
que la personne possède

bertran | 012,058,123,142,546,789
georges | 025,058,421,546,812
william | 030,123,789,854,888,963,987,999

Sur un formulaire, on me demande quels sont les personnes qui ont les
objets 005,058,142,789


En fait, ton problème se résoud en repensant ta base de données qui
n'est pas du tout normalisée.

Table 1 personne: id_personne, nom
Table 2 objet: id_objet, nom
Table 3 personne_objet: id_personne,id_objet

C'est une relation classique n->m

Avatar
JC
En fait, ton problème se résoud en repensant ta base de données qui
n'est pas du tout normalisée.

Table 1 personne: id_personne, nom
Table 2 objet: id_objet, nom
Table 3 personne_objet: id_personne,id_objet

C'est une relation classique n->m


Enorme merci pour cette réponse.
Je vais travailler sur ça...
Mon travail est donc au 2/3 déjà fait puisque j'ai une table avec tous
les membres, et une table avec la liste des diffèrentes réfèrences.
J'avais essayé de réduire la taille de ma table en n'eregistrant qu'une
seule ligne par utilisateur (qu'il ait une ou plusieurs réfèrences)
alors que la méthode que tu m'indiques créé autant de lignes que de
réfèrences possédées par l'utilisateur...
Actuellement, j'ai environ 600 utilisateurs avec une moyenne de 100
réfèrences... Ma table faisait donc 600 lignes... La nouvelle devrait
donc faire 600*100 soit 60.000 lignes... Ce n'est pas génant ? Ma plus
grosse table actuelle (membres) posséde 3.000 entrées et cela ne pose
aucun soucis, mais je n'ai aucune expérience sur une table à 60.000
entrées...

JC.