Script pour exploiter directement les vues MySQL

ViPHP
pjl
ViPHP | 2119 Messages

08 févr. 2010, 13:46

Bonjour,

Ca fait un bon moment que je ne suis pas venu ne faisant presque plus de PHP et très peu de base de données.

J'en ai quand même une qui me sert à gérer pas mal de choses dans mon entreprise (suivi du parc micro et logiciel, MAJ de l'AD, gestion d'un serveur fax).
Cette base grossit régulièrement et s'enrichit de nouvelles fonctions et pour l'utiliser plus facilement, j'ai pas mal de vues.

Seulement, mon collègue refuse d'entendre parler de MySQL et ne jure que par Accés.
Du coup, je cherche un script qui permetrait directement d'afficher le résultat des vues dans une page Web.
Grosso modo, j'ai un menu déroullant, je choisis ma vue et j'affiche le résultat.
Existe-t-il un script qui le fait déjà ?
Comme ça, je balance le script sur le petit intranet que j'ai mis en place et il arrete de me casser les pieds.
De mon coté, je n'ai rien trouvé.

PS : pas sur d'avoir posé la question au bon endroit vu que ca concerne plusieurs rubrique du forum.

Eléphant du PHP | 453 Messages

08 févr. 2010, 16:32

Hello pjl,
Seulement, mon collègue refuse d'entendre parler de MySQL et ne jure que par Accés.
Rooo, ça existe ? Il doit te faire marcher... :lol: Je n'ai jamais essayé mais je sais que php peut discuter avec Access. Je me demande si pdo peut discuter avec...
Du coup, je cherche un script qui permetrait directement d'afficher le résultat des vues dans une page Web.
Grosso modo, j'ai un menu déroullant, je choisis ma vue et j'affiche le résultat.
Existe-t-il un script qui le fait déjà ?
À ma connaissance, je ne connais pas un tel script. Je ne pense pas que ce soit très long à mettre en place. Je parle d'un point de vue fonctionnalité.

En faisant simple :
ton formulaire avec le menu select (généré dynamiquement), un submit et peut être un hidden
et le php :
<?php
    try{
        $dsnMysql = "mysql:dbname=unebase;host=lhote";
        $utilisateur = "lutilisateur";
        $mot_de_passe = "le_pass";
        
        $mySql = new PDO($dsnMysql,$utilisateur,$mot_de_passe);
        $mySql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
        $html = new XMLWriter();
        $html->openMemory();
        $html->setIndent(true);
        
        // une_vue = $_POST["une_vue"];
        $sqlDonnees = "SELECT * FROM une_vue";
        $sqlEnTete = "SHOW COLUMNS FROM une_vue";
        
        //requetes
        $listeDonnees = $mySql->query($sqlDonnees);
        $donnees = $listeDonnees->fetchAll(PDO::FETCH_NUM);
        
        $listeEnTete = $mySql->query($sqlEnTete);
        $enTete = $listeEnTete->fetchAll(PDO::FETCH_ASSOC);
        
        //preparation affichage
        $html->startElement("table");
        
        //en tete
        $html->startElement("tr");
        for($i = 0 ; $i < count($enTete) ; $i++){
            $html->writeElement("th",str_replace("_"," ",$enTete[$i]["Field"]));
        }
        $html->endElement();
        
        //donnees
        for($j = 0 ; $j < count($donnees) ; $j++){
            $html->startElement("tr");
            for($k = 0 ; $k < count($donnees[$j]) ; $k++){
                $html->writeElement("td",$donnees[$j][$k]);
            }
            $html->endElement();
        }
        $html->endElement();
        
        echo $html->outputMemory();
   
    }catch(Exception $e){
        echo $e->getMessage();
    }
?>
* À noter que je n'ai pas peaufiné le code html (summary, caption, etc.) et qu'il est surement judicieux de préparer tes requêtes vu qu'elles risquent d'être récurrentes. Il serait peut être astucieux de faire une requête dynamique (l'utilisateur clique sur un en-tête et il y un order by ...). Pour la mise en forme, css oblige ^^

Je sais pas si ce bout de piste te va ?

Bonne journée à toi
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Eléphant du PHP | 453 Messages

10 févr. 2010, 15:37

Hello,

Je repasse par là pour améliorer ce que j'ai écrit en amont. Là, le script est fonctionnel. Il manque un système de pagination. Tu peux utiliser Pager et sa doc se trouve ici. Pour retrouver les vues dans ta base, il suffit de changer le terme après LIKE de la requête :
$sqlVue = sprintf("SHOW TABLES  LIKE %s ", "vue_%"); 
Bizarrement, je n'arrive pas à préparer les requêtes. Si une âme charitable peut m'expliquer le pourquoi du comment, ce serait sympa de sa part. ^^

*config_connect.php
<?php
    define("HOTE","un_hote");
    define("SGBDR","unebase");
    define("DSN_MYSQL","mysql:dbname=".SGBDR.";host=".HOTE);
    define("UTILISATEUR","un_utilisateur");
    define("MOT_DE_PASSE","|_|n_p455_3cr!7_3n_|_337");
?>
*class.html.php
<?php
    class HTML extends XMLWriter{        
        public function writeMyElement($element,$elementValue,$attributs){
            $this->startElement($element);
            foreach($attributs as $attribut => $value){
                $this->writeAttribute($attribut,$value);
            }
            $this->text($elementValue);
            $this->endElement();
        }
    }
?>
*visionneuse_de_vues_mysql.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
	<head>
		<meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />
		<title>des vues</title> 
                <link href="style.css" type="text/css" rel="stylesheet" />
	</head>

	<body>
<?php
    try{
        require_once "config_connect.php";
        require_once "class.html.php";
        $vue = "vue";
        $afficher = "afficher";
        
        $mySql = new PDO(DSN_MYSQL,UTILISATEUR,MOT_DE_PASSE);
        $mySql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        
        $html = new HTML();
        $html->openMemory();
        $html->setIndent(true);
        
        $html->startElement("form");
        $html->writeAttribute("method","post");
        $html->writeAttribute("action",htmlspecialchars($_SERVER["SCRIPT_NAME"]));
        
        $html->startElement("fieldset");
        $html->writeElement("legend","choix des vues");
        
        $html->startElement("p");
        
        $attributsLabelChoisir = array("for" => $vue);
        $html->writeMyElement("label","choisir : ",$attributsLabelChoisir);
        
        
        $html->startElement("select");
        $html->writeAttribute("name",$vue);
        $html->writeAttribute("id",$vue);
        
        $sqlVue = "SHOW TABLES "; // LIKE '%vue'
        $listeVues = $mySql->query($sqlVue);
        $lesVues = $listeVues->fetchAll(PDO::FETCH_NUM);
        
        //option
        for($vueActuelle = 0, $nbVues = count($lesVues); $vueActuelle < $nbVues ; $vueActuelle++){
            $attributsOptionChoisir = array("value" => $lesVues[$vueActuelle][0]);
            if(isset($_POST[$vue]) && $_POST[$vue] === $lesVues[$vueActuelle][0])
                $attributsOptionChoisir["selected"] = "selected";
            $html->writeMyElement("option",str_replace("_"," ",$lesVues[$vueActuelle][0]),$attributsOptionChoisir);
        }
        $html->endElement(); // select
        $html->endElement(); // p
        
        $attributsAfficher = array("type" => "submit", "name" => $afficher, "value" => $afficher);
        $html->writeMyElement("button","afficher",$attributsAfficher);
        $html->endElement(); // fieldset
        $html->endElement(); // form
        
        //soummission du formulaire
        if(isset($_POST[$afficher]) && $_POST[$afficher] === $afficher){
            $sqlDonnees = sprintf("SELECT * FROM %s",$_POST[$vue]);
            $sqlEnTete = sprintf("SHOW COLUMNS FROM %s",$_POST[$vue]);
            
            $listeDonnees = $mySql->query($sqlDonnees);
            $donnees = $listeDonnees->fetchAll(PDO::FETCH_NUM);
            
            $listeEnTete = $mySql->query($sqlEnTete);
            $enTete = $listeEnTete->fetchAll(PDO::FETCH_ASSOC);
            
            $html->startElement("table");
            $html->writeAttribute("summary","Affichages de la vue ".$_POST[$vue]." (".SGBDR.")");
            $html->writeElement("caption",str_replace("_"," ",$_POST[$vue])." : ");
            //en tete
            $html->startElement("tr");
            $html->writeAttribute("class","bordure_basse");
            for($i = 0 ; $i < count($enTete) ; $i++){
                $html->writeElement("th",str_replace("_"," ",$enTete[$i]["Field"]));
            }
            $html->endElement();
            
            //donnees
            for($j = 0 ; $j < count($donnees) ; $j++){
                $html->startElement("tr");
                
                $modulo = $j % 2;
                if($modulo === 1)
                    $html->writeAttribute("class","colorer");
                
                for($k = 0 ; $k < count($donnees[$j]) ; $k++){
                    $html->writeElement("td",$donnees[$j][$k]);
                }
                $html->endElement();
            }
            $html->endElement();
            
        }
        
        echo $html->flush();    
        
    }catch(Exception $e){
        echo $e->getMessage();
    }
    
?>
	</body>
</html>
*style.css (fait à l'arrache)
body{
    color:#666; /* le chiffre de la bête lol */
    font-family:arial,helvetica,sans-serif;
    font-size:.8em;
    margin:0;
    padding:0;
}
form{
    margin:10px;
}
fieldset{
    border:1px solid #666;
}
legend,label{
    color:#666;
}
legend{
    font-variant:small-caps;
    font-weight:bold;
}
caption{
    text-align:left;
    font-style:italic;
    margin:5px 0px;
}
label{
    font-variant:small-caps;
    font-weight:bold;
}
select{
    padding:3px;
    border:none;
    color:#47757e;
    background-color:#e1ecef;
}
fieldset,button,select{
    border-radius:5px;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
}
button{
    border:none;
    background-color:#47757e;
    padding:5px;
    color:white;
}
table{
    margin:25px 10px;
    border-bottom:1px solid #2b464c;
    border-collapse:collapse;
    min-width:98%;
}
th,td{
    padding:5px 10px;
}

.colorer{
    background-color:#e1ecef;
}
.bordure_basse{
    border-bottom:1px solid #2b464c;
}
Modifié en dernier par niuxe le 10 févr. 2010, 17:35, modifié 1 fois.
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

ViPHP
ViPHP | 5462 Messages

10 févr. 2010, 16:23

la requete pour allé chercher les vue c'est
SELECT * FROM INFORMATION_SCHEMA.VIEWS

Eléphant du PHP | 453 Messages

10 févr. 2010, 17:16

Hello, stealth35,

Roo, je ne connaissais pas cette requête et comment aller chercher des infos de ce type. Merci^^ À propos de information_schemas, c'est une BDD interne, n'est ce pas ? À vrai dire, je n'ai pas eu encore la curiosité de regarder les données qu'il y a dedans. Apparemment, il y a des informations très intéressantes. Peux tu en dire plus stp ?

Est ce que par hasard, tu serais pourquoi la préparation des requêtes (en-tête, données) ne sont pas possibles dans mon cas ? J'ai trouvé ça bizarre...

Bonne soirée à toi.
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

ViPHP
ViPHP | 5462 Messages

10 févr. 2010, 17:40

Hello, stealth35,

Roo, je ne connaissais pas cette requête et comment aller chercher des infos de ce type. Merci^^ À propos de information_schemas, c'est une BDD interne, n'est ce pas ? À vrai dire, je n'ai pas eu encore la curiosité de regarder les données qu'il y a dedans. Apparemment, il y a des informations très intéressantes. Peux tu en dire plus stp ?

Est ce que par hasard, tu serais pourquoi la préparation des requêtes (en-tête, données) ne sont pas possibles dans mon cas ? J'ai trouvé ça bizarre...

Bonne soirée à toi.
ouai c'est interne ta plein d'info sympa dedans, en plus tu peu faire des tris comparer a SHOW
plus d'info
http://dev.mysql.com/doc/refman/5.0/fr/ ... chema.html
http://dev.mysql.com/doc/refman/5.0/en/ ... chema.html


sinon pour ta requête préparer t'avais fait quoi ?