Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
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 16/11/2010, 21h32   #1
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 186
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 186
Points : 32
Points : 32
Par défaut Optimisation du code PHP vs SQL

Bonjour à tous.

En ce moment j'utilise 3 tables dans ma BD ("auteur","livre","auteur_livre");

Dans une page qui permet de mettre à jour un auteur, je dois afficher tous les livres qui existent dans ma BD (j'en ai 460). Sur cette page je dois afficher un flag ou un message qui informe l'utilisateur des livres déjà associés à l'auteur. Je procède donc comme suit:

code:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* charger seulement les id des livres associés à l'auteur qu'on veux mettre à jour*/  
 
$auteurs_livres=loadTable("auteur_livres")->auteur;
 
$stockage_id=array();
 
 
// parourir la table;
foreach($auteurs_livres as $auteur_livre)
{
  //stoker les livres_id qui se trouvent dans "auteur_livres" et qui sont associès à l'auteur;
  $stockage_id[]=$auteur_livre["livre_id"];
}
 
// charger la table "livre"
 
$livres=loadTable("livre");
 
// verifier si les livres de l'auteur existent dans la table livre_auteur
 
foreach ($livres as $key=>$livre)
    {
        if(in_array($livre["id"],$stockage_id))
       {
          echo "le livre ".$livre["id"] est déjà associé
       }
 
       else {
          echo "le livre ".$livre["id"] n'est pas encore associé
 
      }
 
   }
Mais ce code prends beaucoup de temps pour être traité (entre 5 à 7 sec), donc je veux savoir si il y a un moyen pour mieux optimiser mon code. Si je n'avais pas de message à afficher, il suffit simplement de faire un INNER JOIN et le temps de réponse est plus rapide (moins de 1 sec), mais c'est lors de la vérification que ca prends beaucoup de temps car à chaque ligne trouvé dans le table livre je dois vérfier si elle se trouve dans la table "livre_auteur" et afficher le message adéquat

Merci
persia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 23h01   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 814
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 814
Points : 3 436
Points : 3 436
Pas compris ta problématique.
Donne un exemple de données en entrée et de ce que tu veux en faire.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 23h35   #3
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 186
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 186
Points : 32
Points : 32
Citation:
Envoyé par Séb. Voir le message
Pas compris ta problématique.
Je veux savoir si il y a un moyen pour mieux optimiser mon code, car ca prends entre 5 a 7 sec pour que la page s'affiche et je ne trouve pas ca normal.

Citation:
Envoyé par Séb. Voir le message
Donne un exemple de données en entrée et de ce que tu veux en faire.
Table auteur_livre contenant 600 entrées.

Code :
1
2
3
4
5
6
auteur_id     livre_id
1                   2
2                   1                   
2                   450
4                   5
...

Table livre contenant 450 entrées

Code :
1
2
3
4
5
6
7
id     nom
1      php      
2      java                            
3      asp            
4      html         
...     .....
450   css
L'auteur dont je veux afficher l'information à l'id 2, et dans la table auteur_livre il a deux livre (1,450), donc "php" et "css"

Ce que je veux afficher à l'écran:

Utilisateur avec id 2:
Code :
1
2
3
4
5
6
7
8
 
livre            livre associée   
 
php             oui
java            non       
asp             non
html            non
css             oui

Avec le code que j'ai posté ca marche, mais ca prendre beaucoup de temps.

J'espère que j'étais plus clair cette fois-ci

Merci
persia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2010, 23h42   #4
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 814
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 814
Points : 3 436
Points : 3 436
Mais pourquoi faire cela avec PHP et pas SQL ?
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2010, 16h32   #5
Membre chevronné
 
Inscription : juillet 2003
Messages : 625
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 625
Points : 600
Points : 600
Bonjour,

une requête du style :

Code :
1
2
3
4
5
6
7
8
9
10
SELECT l.idlivre, 
       l.nomlivre, 
       ( CASE 
           WHEN auteur_livre IS NULL THEN 'non' 
           ELSE 'oui' 
         END ) AS acelivre 
FROM   livre AS l 
       LEFT JOIN auteur_livre AS a 
         ON a.idlivre = l.idlivre 
            AND a.idauteur = 2
__________________
Le savoir est utile que s'il est partagé par tous.
/(bb|[^b]{2})/
!sleep() ? array((string))
syl2095 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 16h12   #6
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 186
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 186
Points : 32
Points : 32
Citation:
Envoyé par Séb. Voir le message
Mais pourquoi faire cela avec PHP et pas SQL ?

Et comment pense-tu faire ca avec juste du sql ? à ma connaissance sql ne permet pas d'inclure du code html dans les requêtes.
persia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 16h14   #7
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 186
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 186
Points : 32
Points : 32
Citation:
Envoyé par syl2095 Voir le message
Bonjour,

une requête du style :

Code :
1
2
3
4
5
6
7
8
9
10
SELECT l.idlivre, 
       l.nomlivre, 
       ( CASE 
           WHEN auteur_livre IS NULL THEN 'non' 
           ELSE 'oui' 
         END ) AS acelivre 
FROM   livre AS l 
       LEFT JOIN auteur_livre AS a 
         ON a.idlivre = l.idlivre 
            AND a.idauteur = 2
Mais Comment je pourrais passer le text "non" ou "oui" à mon code html ? car je dois donner un style aux 2 messages. Si c'est "oui" on l'affiche en vert, si c'est "non" on l'affiche en rouge. Tu peux regarder mon premier post, tu va comprendre ce que je veux faire

Merci
persia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 17h51   #8
Membre chevronné
 
Inscription : juillet 2003
Messages : 625
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 625
Points : 600
Points : 600
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$query = "SELECT l.idlivre, 
       l.nomlivre, 
       ( CASE 
           WHEN auteur_livre IS NULL THEN 'non' 
           ELSE 'oui' 
         END ) AS acelivre 
FROM   livre AS l 
       LEFT JOIN auteur_livre AS a 
         ON a.idlivre = l.idlivre 
            AND a.idauteur = 2";
 
$sql = mysql_query($query);
 
if ( mysql_num_rows($sql) > 0 ) {
 
while ($res = mysql_fetch_array($query)){
 
if ( $res['acelivre'] == 'oui' ) echo '<span style="color:green;">Oui</span>';
if ( $res['acelivre'] == 'non' ) echo '<span style="color:red;">Non</span>';
 
}
 
}
avec ce code normalement, tu devrais pouvoir afficher oui ou non à la couleur que tu veux
__________________
Le savoir est utile que s'il est partagé par tous.
/(bb|[^b]{2})/
!sleep() ? array((string))
syl2095 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 18h22   #9
Modérateur
 
Inscription : septembre 2010
Messages : 6 967
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 6 967
Points : 8 271
Points : 8 271
par contre le CASE on peu faire un IF a la place

Code :
IF(auteur_livre IS NULL, 'non', 'oui') AS acelivre
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 19h36   #10
Membre chevronné
 
Inscription : juillet 2003
Messages : 625
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 625
Points : 600
Points : 600
ouais c'est vrai les deux sont faisables
__________________
Le savoir est utile que s'il est partagé par tous.
/(bb|[^b]{2})/
!sleep() ? array((string))
syl2095 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2010, 20h10   #11
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 186
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 186
Points : 32
Points : 32
Citation:
Envoyé par syl2095 Voir le message
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$query = "SELECT l.idlivre, 
       l.nomlivre, 
       ( CASE 
           WHEN auteur_livre IS NULL THEN 'non' 
           ELSE 'oui' 
         END ) AS acelivre 
FROM   livre AS l 
       LEFT JOIN auteur_livre AS a 
         ON a.idlivre = l.idlivre 
            AND a.idauteur = 2";
 
$sql = mysql_query($query);
 
if ( mysql_num_rows($sql) > 0 ) {
 
while ($res = mysql_fetch_array($query)){
 
if ( $res['acelivre'] == 'oui' ) echo '<span style="color:green;">Oui</span>';
if ( $res['acelivre'] == 'non' ) echo '<span style="color:red;">Non</span>';
 
}
 
}
avec ce code normalement, tu devrais pouvoir afficher oui ou non à la couleur que tu veux
Merci bien, c'est exactement ce que je cherchais, car je ne savais pas qu'on pouvait inclure des IF ou des CASE dans une requête sql
persia est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h57.


 
 
 
 
Partenaires

Hébergement Web