IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Optimisation du code PHP vs SQL


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Pas compris ta problématique.
    Donne un exemple de données en entrée et de ce que tu veux en faire.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Mais pourquoi faire cela avec PHP et pas SQL ?

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Points : 673
    Points
    673
    Par défaut
    Bonjour,

    une requête du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    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.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par syl2095 Voir le message
    Bonjour,

    une requête du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Points : 673
    Points
    673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    par contre le CASE on peu faire un IF a la place

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF(auteur_livre IS NULL, 'non', 'oui') AS acelivre

  10. #10
    Membre éclairé
    Inscrit en
    Juillet 2003
    Messages
    625
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 625
    Points : 673
    Points
    673
    Par défaut
    ouais c'est vrai les deux sont faisables

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2006
    Messages : 192
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par syl2095 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. [MySQL] Sécurité et publication du code PHP et SQL sur le forum
    Par redoran dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 25/11/2012, 21h26
  2. Optimisation de code php
    Par Oprichnik dans le forum Humour Informatique
    Réponses: 2
    Dernier message: 16/04/2011, 20h53
  3. Optimisation de code PHP
    Par MeHo_ dans le forum Langage
    Réponses: 9
    Dernier message: 29/04/2009, 11h21
  4. Question optimisation de code PHP/HTML
    Par heavenvibes dans le forum Langage
    Réponses: 7
    Dernier message: 14/08/2008, 11h57
  5. Optimisation du code des ordres SQL
    Par Titouf dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/08/2005, 22h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo