Optimiser while php

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


sff
WRInaute impliqué
WRInaute impliqué
 
Messages: 281
Inscription: Mer Fév 02, 2005 23:04

Optimiser while php

Message le Sam Nov 08, 2008 13:18

Bonjour,

J'aimerais savoir si c'est possible d'avoir la requête qui récupère le champ charname en fonction de l'id, en dehors du while.

Merci


Code: Tout sélectionner
$boxquery = doquery("SELECT id FROM {{table}} WHERE for1='$userrow[id]' ORDER BY date DESC LIMIT $limit_start, $pagination", "profile_box");

       
        while ($boxrow = mysql_fetch_assoc($boxquery)) {



                $fromquery = doquery("SELECT charname FROM {{table}} WHERE id='$boxrow[id]' LIMIT 1", "users");

                $fromrow = mysql_fetch_assoc($fromquery);



                echo $fromrow['charname'];

        }
Dernière édition par sff le Sam Nov 08, 2008 13:51, édité 1 fois.

Robinson
WRInaute accro
WRInaute accro
 
Messages: 1855
Inscription: Mar Oct 25, 2005 23:10

Message le Sam Nov 08, 2008 13:22

En déclarant une variable avant le while et en lui attribuant la valeur...


sff
WRInaute impliqué
WRInaute impliqué
 
Messages: 281
Inscription: Mer Fév 02, 2005 23:04

suite

Message le Sam Nov 08, 2008 13:24

Tu peux me montrer un exemple, je comprends pas trop ce que tu veux dire

Je peux mettre une variable avant le while, mais de quelle valeur tu parle?

Robinson
WRInaute accro
WRInaute accro
 
Messages: 1855
Inscription: Mar Oct 25, 2005 23:10

Message le Sam Nov 08, 2008 13:35

Code: Tout sélectionner
$tavariable = "";

while(...){
............
$tavariable = $fromrow['charname'];
}


sff
WRInaute impliqué
WRInaute impliqué
 
Messages: 281
Inscription: Mer Fév 02, 2005 23:04

suite

Message le Sam Nov 08, 2008 13:39

Je comprends pas trop ce que tu veux dire. Peut être tu as pas compris ce que je voulais faire.

En fait je voudrais exécuter cette requête en dehors du while :

$fromquery = doquery("SELECT charname FROM {{table}} WHERE id='$boxrow[from1]' LIMIT 1", "users");

$fromrow = mysql_fetch_assoc($fromquery);

tonguide
WRInaute accro
WRInaute accro
 
Messages: 1242
Inscription: Ven Nov 28, 2003 18:55

Message le Sam Nov 08, 2008 13:50

Je ne comprends pas trop d'où vient "$boxrow[from1]"

Sinon, je dirai qu'une jointure serait la meilleur solution.

SELECT colonne
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
WHERE t1.id = X

Mais sans la structure etc ... difficile d'en dire plus.


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 5069
Inscription: Mer Nov 23, 2005 10:38

Message le Sam Nov 08, 2008 13:50

La question qui me turlupine est : est ce que dans les deux requêtes tu effectues tes requêtes sur la même table ?

Si c'est le cas la réponse de Robinson est la bonne.

Sinon tu peux effectuer ta jointure directement dans la première requête (via un LEFT JOIN ou un INNER JOIN suivant les cas).

Après il serait intéressant de savoir si pour un enregistrement dans la première table tu peux en avoir plusieurs dans la seconde (ou pas).

tonguide
WRInaute accro
WRInaute accro
 
Messages: 1242
Inscription: Ven Nov 28, 2003 18:55

Message le Sam Nov 08, 2008 13:53

UsagiYojimbo a écrit:La question qui me turlupine est : est ce que dans les deux requêtes tu effectues tes requêtes sur la même table ?


$fromquery = doquery("SELECT charname FROM {{table}} WHERE id='$boxrow[id]' LIMIT 1", "users");

le "users" à la fin, je crois que c'est le nom de la table. Et donc les requetes ne sont pas sur la mm table.


sff
WRInaute impliqué
WRInaute impliqué
 
Messages: 281
Inscription: Mer Fév 02, 2005 23:04

suite

Message le Sam Nov 08, 2008 13:53

Tonguide, exact j'ai fais une erreur, c'est pas $boxrow[from1], mais $boxrow[id].


LiFi
WRInaute passionné
WRInaute passionné
 
Messages: 609
Inscription: Lun Juil 14, 2008 2:24

Message le Sam Nov 08, 2008 13:54

Tu devrais plutot alors construire un chaine de caracteres dans ton while afin de mettre tous les $boxrow[from1] comme ca:

$machaine .= "$boxrow[from1],";

apres une fois sorti du while tu vires le dernier caractere de la chaine puisque ce sera une virgule en trop et tu fais une seule requete avec id IN (8,3,7,1,9,5...) au lieu de ton id= :

$fromquery = doquery("SELECT charname FROM {{table}} WHERE id IN ($machaine)", "users");

et apres tu te fais un autre while pour afficher tous les resultats.

tu vois?

while () {
creer une chaine d'ids
}
faire une seule requete avec tous les ids
while () {
ecrire les données a lecran
}

bon apres c'est sur ca doit etre possible d'ecrire tout ca en une seule requete, moi je te donne simplement la logique pour ne pas faire 36000 requetes dans un while.


sff
WRInaute impliqué
WRInaute impliqué
 
Messages: 281
Inscription: Mer Fév 02, 2005 23:04

suite

Message le Sam Nov 08, 2008 13:59

Non UsagiYojimbo, il s'agit de 2 table différentes.

En fait c'est une messagerie.

La table profile_box contient les messages (ID est celui qui à envoyé le message)

La table users contient le pseudo de tous les utilisateur du site.

Donc dans le while on affiche le pseudo de celui qui à envoyé le message.

tonguide
WRInaute accro
WRInaute accro
 
Messages: 1242
Inscription: Ven Nov 28, 2003 18:55

Message le Sam Nov 08, 2008 13:59

SELECT p_b.id, u.charname
FROM profile_box p_b
LEFT JOIN users u ON u.id = p_b.id
WHERE p_b.for1='$userrow[id]'
GROUP BY u.id
ORDER BY p_b.date DESC LIMIT $limit_start, $pagination

tu fais ça comme requete (GROUP BY u.id < utile uniquement si il est possible qu'il y ai plusieurs résultats dans "users")

et donc tu auras $boxrow['charname'] directement.

Bon courage ;)


sff
WRInaute impliqué
WRInaute impliqué
 
Messages: 281
Inscription: Mer Fév 02, 2005 23:04

suite

Message le Sam Nov 08, 2008 14:03

Ok je test


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités