PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 13-01-2010 11:50:39

Cyrilpop
Membre
Inscription : 11-01-2010
Messages : 20

Tableau complexe avec interrogation de base de données

Salut a tous,



j'ai un petit soucis avec mon code. J'essaie d'afficher sur plusieurs colonne (une colonne par date) l'historique de l'état de serveurs. L'affichage marche à peut prêt sauf que si au cours de la semaine le nombre de serveurs change, le tableau ne sera plus exact car il y aura un décalage entre le nom du serveur et son état.

En effet jour j le tableau devrait ressembler à ca


Serveur        etat_j1

serveur1         ok
serveur3         ko
serveur4         ko


au jour j+1 on ajoute le serveur2 et on obtient

Serveur         etat_j1       etat_j2
serveur1         ok               ok
serveur2         ko               ok
serveur3         ko               ko
serveur4                           ok





On constate que l'on perd l'information du serveur4 et que tout est décalé au niveau des lignes donc qu'aucune information n'est correcte...


Avez-vous une idée ?


[code php]
<div align="left">
<?php

function week2date ($numSemaine, $annee) {
    //-- les paramètres ------------
    $timeStampPremierJanvier = strtotime($annee . '-01-01');
    $jourPremierJanvier = date('w', $timeStampPremierJanvier);

    //-- recherche du N° de semaine du 1er janvier -------------------
    $numSemainePremierJanvier = date('W', $timeStampPremierJanvier);

    //-- nombre à ajouter en fonction du numéro précédent ------------
    $decallage = ($numSemainePremierJanvier == 1) ? $numSemaine - 1 : $numSemaine;
    //-- timestamp du jour dans la semaine recherchée ----------------
    $timeStampDate = strtotime('+' . $decallage . ' weeks', $timeStampPremierJanvier);
    //-- recherche du lundi de la semaine en fonction de la ligne précédente ---------
    $jourDebutSemaine = ($jourPremierJanvier == 1) ? date('d-m-Y', $timeStampDate) : date('Y-m-d', strtotime('last monday', $timeStampDate));
   
    return $jourDebutSemaine;
}
function affiche_journee ($date_journee) //Fonction permetant d'afficher l'état du serveur à la date $date_journee
{
    $rouge = "#FF0000";
    $vert = "#66FF00";
    $date = date("'Y-m-d'");
    $m=date('m');
    $d=date('d');
    $Y=date('Y');
    $date_requete = mktime(0, 0, 0, $m, $d, $Y);

    if ( isset($_GET['ORDER']) )
    {
        $ORDER = $_GET['ORDER'];
    }
    else
    {
        $ORDER = "ID_ETAT";
    }

    if ( isset($_GET['ORDRE']) )
    {
        $ORDRE = "DESC";
    }
    else
    {
        $ORDRE = "ASC";
    }

    $db = mysql_connect('', '', '');
    mysql_select_db('windows',$db);

    $sql_etat = "SELECT NOM_SERVEUR, DATE_ETAT, JOURNAL, SERVICES FROM serveurs , etat_serveur
        WHERE ETAT_SERVEUR.ID_SERVEUR = SERVEURS.ID_SERVEUR
        AND ETAT_SERVEUR.DATE_ETAT = $date_journee" //>= $date_requete_lundi
        ." ORDER BY $ORDER $ORDRE ;";

    $sql_date = "SELECT DATE_ETAT FROM etat_serveur
        WHERE UNIX_TIMESTAMP(DATE_ETAT) = $date_requete" //BETWEEN $date_requete_lundi AND $date_requete_vendredi
        ." GROUP BY DATE_ETAT;";


    $req_etat = mysql_query($sql_etat) or die('Erreur SQL !'.$sql_etat.''.mysql_error());
   
                            while ( $data = mysql_fetch_array( $req_etat ) )
                        {
                            $journal = $data['JOURNAL'];
                            $service = $data['SERVICES'];
                            if ( $journal == "ok" )
                            {
                                $bgcolor="$vert";
                                $print="ok";
                            }
                            else
                            {
                                $bgcolor="$rouge";
                                $print="ko";
                            } ?>
                            <tr>
                                <td  align="center" width="20%" bgcolor="<?php echo $bgcolor; ?>">
                                    <a href="#" title="<?php echo $journal; ?>" style="text-decoration:none; link color=black"><?php echo $print; ?></a>
                                </td>
                                <?php
                                if ( $service == "ok" )
                                {
                                    $bgcolor="$vert";
                                    $print="ok";
                                }
                                else
                                {
                                    $bgcolor="$rouge";
                                    $print="ko";
                                } ?>
                                <td  align="center" width="20%" bgcolor="<?php echo $bgcolor; ?>">
                                    <a href="#" title="<?php echo $service; ?>" style="text-decoration:none; link color=black"><?php echo $print; ?></a>
                                </td>
                            </tr>
                        <?php
                        }
   
   
}
function affiche_serveurs () //fonction permettant d'afficher la liste des serveurs
{
    if ( isset($_GET['ORDER']) )
    {
        $ORDER = $_GET['ORDER'];
    }
    else
    {
        $ORDER = "ID_ETAT";
    }

    if ( isset($_GET['ORDRE']) )
    {
        $ORDRE = "DESC";
    }
    else
    {
        $ORDRE = "ASC";
    }

    $db = mysql_connect('localhost', 'root', '');
    mysql_select_db('windows',$db);
    $sql_serveurs = "SELECT NOM_SERVEUR FROM serveurs , etat_serveur
        WHERE ETAT_SERVEUR.ID_SERVEUR = SERVEURS.ID_SERVEUR
        GROUP BY NOM_SERVEUR
        ORDER BY $ORDER $ORDRE ;";
    $req_serveurs = mysql_query($sql_serveurs) or die('Erreur SQL !'.$sql_etat.''.mysql_error());
    $i=0;
    while ( $data = mysql_fetch_array( $req_serveurs ) )
    {
        $serveur = $data['NOM_SERVEUR'];
        if ($i%2 != 0)
        {
            $bgcolor="#123abcd";
        }
            else
        {
            $bgcolor="#823abcd";
        }
        ?>
        <tr bgcolor="<?php echo $bgcolor; ?>">
        <td  align="center">
        <?php echo "$serveur"; ?>
        </td>
        </tr><?php
        $i++;
    }
}


if ( !isset($_GET['date_requete_lundi'] ))
{
    $date_lundi = week2date(date('W'),date('Y'));
    $tab = explode("-",$date_lundi);
    $annee = $tab[0];
    $mois = $tab[1];
    $jour = $tab[2];
    $date_requete_lundi = mktime(0, 0, 0, $mois, $jour, $annee);
}
?>
    <table border="1">
        <tr>
            <td>
                <table border="1" width="80"> <!-- Tableau qui contient le nom de tous les serveurs !-->
                    <tr>
                        <td>
                            .
                        </td>
                    </tr>
                    <tr>
                        <td>
                            Serveurs
                        </td>
                    </tr>
                    <?php affiche_serveurs(); ?>
                </table>
            </td>
            <td valign="top"><?php
            for ( $i = 0; $i < 5; $i++ )
            { ?>
            <td valign="top">
                <table border="1" valign="top"> <!-- Tableau qui contient les infos pour chaque journee !-->
                <tr>
                    <td colspan="2">
                        <?php echo 'toto' ?> <!--affiche_date($date_journee); ?> !-->
                    </td>
                </tr>
                <tr>
                    <td>
                        Services
                    </td>
                    <td>
                        Journal
                    </td>
                </tr>
                <?php
                //Partie qui permet de calculer la date du lendemain (du lundi au vendredi de la semaine choisie)
                $date_journee = mktime(0,0,0,substr($date_lundi,5,2),substr($date_lundi,8,2)+$i,substr($date_lundi,0,4));
                $date_requete_journee = $date_journee;
                $date_journee = date("Y-m-d",$date_journee);
                $date_journee = "'$date_journee'"; ?>
                <?php affiche_journee($date_journee); ?>
                </table>               
            </td><?php
            }
            ?>
               
            </td>

        </tr>
    </table>
                       
        <?php
mysql_close();
?>
</div>
[/code]


D'avance merci de votre aide smile

Dernière modification par Cyrilpop (13-01-2010 12:07:20)

Hors ligne

#2 13-01-2010 17:25:57

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Tableau complexe avec interrogation de base de données

Au lieu d'afficher sans vérifier la variable, testes le nom du serveur. smile

Hors ligne

#3 14-01-2010 16:03:09

Cyrilpop
Membre
Inscription : 11-01-2010
Messages : 20

Re : Tableau complexe avec interrogation de base de données

Je m'en suis finalement sorti en faisant du ligne à ligne... Mais le nombre de requête n'est pas terrible, une requête par table ce n'est pas génial... Voici le code
[code php]
<div align="left">
<?php
//Définition des variables utilisées dans la page

//La variable ORDER correspond au champs utilisé par le tri des requètes
if ( isset($_GET['ORDER']) )
{
    $ORDER = $_GET['ORDER'];
}
else
{
    $ORDER = "ID_ETAT";
}

//La variable ORDRE correspond à l'ordre de tri : ASC ou DESC
if ( isset($_GET['ORDRE']) )
{
    $ORDRE = "DESC";
}
else
{
    $ORDRE = "ASC";
}

//La variable date_lundi permet de savoir quelle est la date du lundi de la semaine en cours
if ( !isset($_GET['date_requete_lundi'] ))
{
    $date_lundi = week2date(date('W'),date('Y'));
    $tab = explode("-",$date_lundi);
    $annee = $tab[0];
    $mois = $tab[1];
    $jour = $tab[2];
    $date_requete_lundi = mktime(0, 0, 0, $mois, $jour, $annee);
}

    $db = mysql_connect('', '', '');
    mysql_select_db('',$db);

//$req_serveurs = mysql_query($sql_serveurs) or die('Erreur SQL !'.$sql_serveurs.''.mysql_error());

function affiche_date($date_journee)
{
    //Requète qui récupère la date des différents etats des serveurs
    $sql_date = "SELECT DATE_ETAT FROM etat_serveur
    WHERE UNIX_TIMESTAMP(DATE_ETAT) = $date_journee" //BETWEEN $date_requete_lundi AND $date_requete_vendredi
    ." GROUP BY DATE_ETAT;";
    ?>
    <td colspan="2" align="center"><?php
        $req_date = mysql_query($sql_date) or die('Erreur SQL !'.$sql_date.''.mysql_error());
        while ( $data = mysql_fetch_array( $req_date ) )
        {
            echo $data['DATE_ETAT'];
        }?>
    </td>
    <?php
}
function affiche_titre($date_journee)
{
    //Requète qui récupère la date des différents etats des serveurs
    $sql_date = "SELECT DATE_ETAT FROM etat_serveur
    WHERE UNIX_TIMESTAMP(DATE_ETAT) = $date_journee" //BETWEEN $date_requete_lundi AND $date_requete_vendredi
    ." GROUP BY DATE_ETAT;";
   
    $req_date = mysql_query($sql_date) or die('Erreur SQL !'.$sql_date.''.mysql_error());
    while ( $data = mysql_fetch_array( $req_date ) )
    { ?>
        <td align="center">
            Service
        </td>
        <td align="center">
            Journal
        </td><?php
    }
}

function affiche_ligne ($id_serveur, $date_journee)
{
    // Définition des couleurs utilisé dans le tableau
    $rouge = "#FF0000";
    $vert = "#66FF00";
    $sql_etat_serveur = "SELECT JOURNAL, SERVICES FROM serveurs , etat_serveur
    WHERE ETAT_SERVEUR.ID_SERVEUR = SERVEURS.ID_SERVEUR
    AND ETAT_SERVEUR.ID_SERVEUR = $id_serveur
    AND ETAT_SERVEUR.DATE_ETAT = $date_journee;";
    $req_etat_serveur = mysql_query($sql_etat_serveur) or die('Erreur SQL !'.$sql_etat_serveur.''.mysql_error());
    if (mysql_num_rows($req_etat_serveur) == 0)
    {
        ?><td align="center" colspan="2">N/A</td><?php
    }
    while ( $data = mysql_fetch_array( $req_etat_serveur ) )
    {
            $journal = $data['JOURNAL'];
            $service = $data['SERVICES'];
            if ( $service == "ok" )
            {
                $bgcolor="$vert";
                $print="ok";
            }
            else
            {
                $bgcolor="$rouge";
                $print="ko";
            } ?>
            <td  align="center" width="50" bgcolor="<?php echo $bgcolor; ?>"><?php
                if ( $print == "ok" )
                {
                    echo "ok";
                }
                else
                {
                    ?><a href="#" title="<?php echo $service; ?>" style="text-decoration:none; link color=black"><?php echo $print; ?></a><?php
                } ?>
            </td><?php       
           
            if ( $journal == "ok" )
            {
                $bgcolor="$vert";
                $print="ok";
            }
            else
            {
                $bgcolor="$rouge";
                $print="ko";
            } ?>
            <td  align="center" width="50" bgcolor="<?php echo $bgcolor; ?>"><?php
                if ( $print == "ok" )
                {
                    echo "ok";
                }
                else
                {
                    ?><a href="#" title="<?php echo $journal; ?>" style="text-decoration:none; link color=black"><?php echo $print; ?></a><?php
                } ?>
            </td><?php   
           

           
    }
}
?>

<table border="1">
    <tr>
        <td rowspan="2" align="center">
            Serveur
        </td>
        <!-- Ligne qui correspond à l'affichage de la date. Il y a une colone par date qu'on récupère par SQL !-->
        <!-- On appelle la fonction qui va appeler la date !-->
        <?php
        for ( $i = 0; $i < 5; $i++ )
        {
            //Partie qui permet de calculer la date du lendemain (du lundi au vendredi de la semaine choisie)
            $date_journee = mktime(0,0,0,substr($date_lundi,5,2),substr($date_lundi,8,2)+$i,substr($date_lundi,0,4));
            $date_requete_journee = $date_journee;
            $date_journee = date("Y-m-d",$date_journee);
            $date_journee = "'$date_journee'";
            affiche_date($date_requete_journee);
        } ?>
    </tr>
    <tr>   
        <?php
        for ( $i = 0; $i < 5; $i++ )
        {
            //Partie qui permet de calculer la date du lendemain (du lundi au vendredi de la semaine choisie)
            $date_journee = mktime(0,0,0,substr($date_lundi,5,2),substr($date_lundi,8,2)+$i,substr($date_lundi,0,4));
            $date_requete_journee = $date_journee;
            $date_journee = date("Y-m-d",$date_journee);
            $date_journee = "'$date_journee'"; ?>
            <?php
            affiche_titre($date_requete_journee);
        } ?>
    </tr>
    <?php
    //Requète qui l'ID des serveurs
    $sql_serveurs = "SELECT SERVEURS.ID_SERVEUR, NOM_SERVEUR FROM serveurs;";
    $req_serveurs = mysql_query($sql_serveurs) or die('Erreur SQL !'.$sql_serveurs.''.mysql_error());
    $c=0;
   

   
    while ( $data = mysql_fetch_array( $req_serveurs ) )
    {
        ?>
        <tr><?php
        $id_serveur = $data['ID_SERVEUR'];
        $serveur = $data['NOM_SERVEUR'];
        if ($c%2 != 0)
        {
            $bgcolor="#123abcd";
        }
            else
        {
            $bgcolor="#823abcd";
        } ?>
        <td bgcolor="<?php echo $bgcolor; ?>"><?php
            echo $serveur; ?>
        </td><?php
        $max_day = date('N');
        for ( $i = 0; $i < $max_day; $i++ )
        {
        //Partie qui permet de calculer la date du lendemain (du lundi au vendredi de la semaine choisie)
        $date_journee = mktime(0,0,0,substr($date_lundi,5,2),substr($date_lundi,8,2)+$i,substr($date_lundi,0,4));
        $date_requete_journee = $date_journee;
        $date_journee = date("Y-m-d",$date_journee);
        $date_journee = "'$date_journee'";
        affiche_ligne($id_serveur, $date_journee);
        }
        ?>
        </tr><?php
        $c++;
    } ?>
</table>
[/code]
Si quelqu'un a une idée pour optimiser le tout, je suis preneur smile

Hors ligne

#4 14-01-2010 16:29:12

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Tableau complexe avec interrogation de base de données

>>Si quelqu'un a une idée pour optimiser le tout, je suis preneur

moi, je te propose une gomme wink
















































































une poubelle, ce serai encore mieux wink

a++

Hors ligne

#5 14-01-2010 17:02:56

Cyrilpop
Membre
Inscription : 11-01-2010
Messages : 20

Re : Tableau complexe avec interrogation de base de données

Pierrot a écrit :

>>Si quelqu'un a une idée pour optimiser le tout, je suis preneur

moi, je te propose une gomme wink

une poubelle, ce serai encore mieux wink

a++

C'est intelligent ca...
Je ne suis pas expert en php/mysql (ca se voit surement) mais je suppose qu'il fortement possible d'optimiser le code de la page...

Donc si la solution est autre que tout détruire je suis preneur. Sinon passez votre chemin wink

Hors ligne

#6 14-01-2010 17:25:54

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Tableau complexe avec interrogation de base de données

>>C'est intelligent ca...

a mon image big_smile:D

>>Je ne suis pas expert en php/mysql (ca se voit surement) mais je suppose qu'il fortement possible d'optimiser le code de la page...

toutes les affirmations de cette phrase sont exactes wink

>>Donc si la solution est autre que tout détruire je suis preneur

et bien, prends wink

a++

Hors ligne

#7 14-01-2010 20:12:05

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : Tableau complexe avec interrogation de base de données

Ta requête de base était correcte. Et tu récupérais le nom du serveur.
Sachant que si tu ordonnes ton tableau en fonction de l'ordre dans lequel tu devrais l'afficher tu n'as plus qu'à parcourir ainsi :

tableau_serveur = {serveur1,serveur2,serveur3,serveur4}
j = 0
Pour toutes les valeurs du tableau_sql : i
    Si tableau_sql[i][nom_serveur] = tableau[j] alors
        afficher tableau_sql[i][etat]
        i++
    Sinon
        afficher "offline"
    Fin Si
    j++
Fin Pour

Hors ligne

#8 15-01-2010 10:08:12

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Tableau complexe avec interrogation de base de données

Saluton,
Honnêtement, je n'ai pas le temps de me pencher sur ton script, mais le ton narquois de Pierrot me laisse augurer qu'il doit comporter une énormité genre ne pas utiliser une possibilité de jointure relationnelle en SQL.
Promis je regarde ça tiu finsemajno


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#9 15-01-2010 10:43:49

Cyrilpop
Membre
Inscription : 11-01-2010
Messages : 20

Re : Tableau complexe avec interrogation de base de données

xTG a écrit :

Ta requête de base était correcte. Et tu récupérais le nom du serveur.
Sachant que si tu ordonnes ton tableau en fonction de l'ordre dans lequel tu devrais l'afficher tu n'as plus qu'à parcourir ainsi :

tableau_serveur = {serveur1,serveur2,serveur3,serveur4}
j = 0
Pour toutes les valeurs du tableau_sql : i
    Si tableau_sql[i][nom_serveur] = tableau[j] alors
        afficher tableau_sql[i][etat]
        i++
    Sinon
        afficher "offline"
    Fin Si
    j++
Fin Pour

pas bête l'idée de mettre le retour de la requête sql dans un tableau php, j'avoue que je n'y avais pas pensé... Je vais me pencher la dessus smile Merci pour ce coup de pouce (aie ca fait mal un coup... Quoi que avec le pouce ca va big_smile)
Dès que j'ai eu le temps d'optimiser ca, je repasse par ici pour donner le code... Ca pourra toujours servir pour les suivants smile

Hors ligne

#10 15-01-2010 15:23:47

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Tableau complexe avec interrogation de base de données

>>mais le ton narquois de Pierrot

je suis narquoi moaaaaaa ???? roll

tous est fesable dans une requète wink
même le calcul des dates wink
par exemple ça :
//Partie qui permet de calculer la date du lendemain (du lundi au vendredi de la semaine choisie)
      $date_journee = mktime(0,0,0,substr($date_lundi,5,2),substr($date_lundi,8,2)+$i,substr($date_lundi,0,4));
      $date_requete_journee = $date_journee;
      $date_journee = date("Y-m-d",$date_journee);
      $date_journee = "'$date_journee'";
      affiche_date($date_requete_journee);

quand je lis ça, ça me fais penser à :
pourquoi faire simple quand on peut faire compliqué big_smile:D
a++

Hors ligne

Pied de page des forums