'; // ouvre la base $bdd = ouvreBase(); $sep = ""; // séparateur facultatif entre n° de ligne et n° de champ $sl = ','; // séparateur pour liste $chplages; $taillepaquet = 15; // nombre de lignes affichées par page //$sens = ">="; // sens de lecture de la table (croissant) $plages = array(); // pile des clés début de page affichée $debut = 0; // clé primaire minimale de la première page $lectureseule = FALSE; // si TRUE interdit toute mise à jour $maxexport = 100000; // nombre maxi de lignes exportées // fonction d'ouverture de la base de données function ouvreBase() { // retourne l'objet $bdd instanciation de la classe PDO $host = "localhost"; // serveur $param2 = "monuser"; // user base $param3 = "monpasse"; // password base $options = " --opt --single-transaction --skip-lock-tables "; $base = "mabase"; // nom base try { $param1="mysql:host=".$host.";dbname=".$base; $bdd = new PDO($param1,$param2,$param3); $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // pour gérer les erreurs return $bdd; } catch (Exception $e) { die('Erreur fatale:'.$e->getMessage()); } } //fonction retournant la liste des tables de la base // $select est TRUE ou FALSE function listeTables($bdd,$select) { $reponse = $bdd->query("show tables ;") or die(print_r($bdd->errorInfo())); $i=0; while ($donnees = $reponse->fetch()) { $options[$i] = $donnees; $i++; } $reponse->closecursor(); if ($select) { $nbtable = count($options); for ($t=0;$t<$nbtable;$t++) { $options[$t][1] = $options[$t][0]; // créer le libellé pour select } } return $options; } // fonction générique de lecture de table pour ordre sql donné // retourne un tableau des réponses function selectTable($bdd,$sql) { $donnees = array(); $options = array(); $reponse = $bdd->query($sql) or die(print_r($bdd->errorInfo())); $i=0; while ($donnees = $reponse->fetch()) { $options[$i] = $donnees; $i++; } $reponse->closecursor(); return $options; } // fonction générique d'affichage d'un champ Html précédé de son label function afficheChamp($label,$nomfor,$typechamp,$taille,$options,$suite,$ro) { // si $typechamp est text ou absent, génére un input type=text // si $option commence par Erreur ! affiche en rouge // si $option commence par Attention ! affiche en bleu // si option autre affiche en vert // si $typechamp est select, génére un select option // si typechamp est checkbox, génère une case à cocher // si typechamp est area, génère une zone texte // si typechamp est password, génère un champ passe (non visible) // si $typechamp est ... à développer // $nomfor devient le name et le for/id // $label est le texte du label du champ // $options est un tableau des options possibles pour un select ou la valeur par défaut si text // $suite est un espace ou un
(par défaut) // $ro = Readonly, ou non renseigné Champ à saisir --OK-- // Utilisé par tous $style = ""; if ($suite != ' ') $suite ='
'; if ($typechamp == 'select') { echo ''; echo ''.$suite; } elseif ($typechamp == 'checkbox') { echo ''.$suite; } elseif ($typechamp == 'area') { echo ''; echo ''.$suite; } elseif ($typechamp == 'password') { echo ''.$suite; } elseif ($typechamp == 'date') { // pas de différence avec type text pour l'instant echo ''.$suite; } else { // cas du champ text if (substr($options,0,8) == 'Erreur !') { // affiche message d'erreur en rouge $style = 'color:red;'; } elseif (substr($options,0,11) == 'Attention !') { // affiche message d'alerte en bleu $style = 'color:blue;'; } else { $style =''; } echo ''.$suite; } } // fonction de récupération des caractéristiques des champs de la table function showTable($bdd,$nomtable) { $sql = "SHOW COLUMNS FROM ".$nomtable." ;"; $nomChamps = selectTable($bdd,$sql); return $nomChamps; } /* fonction de lecture de table de base de données $table contient le nom de la table à lire $sens vaut >= ou <= ou = ou ... $limite nombre de lignes lues par page ... $debut ... à partir de retourne un tableau lignes, champs de la table */ function lireTables($bdd,$table,$limite,$debut) { $options = array(); $reponse = $bdd->query("SELECT * FROM ".$table." LIMIT ".$limite." OFFSET ".$debut." ;") or die(print_r($bdd->errorInfo())); $i=0; while ($donnees = $reponse->fetch()) { $options[$i] = $donnees; $i++; } $reponse->closecursor(); return $options; } // demande utilisateur de modification de la table // ----------------------------------------------- if (isset($_POST['nomtable']) AND isset($_POST['sauver']) ) { if (!$lectureseule) { try { $bdd->beginTransaction(); // ouvre une transaction $ajouter = FALSE; $nomtable = $_POST['nomtable']; $nomChamps = showTable($bdd,$nomtable); // retrouve le nom des champs de la table // lance la mise à jour $rmax = count($nomChamps); $nch = count($_POST)-3; // nombre de champs de $_POST $lmax = ($nch / ($rmax+1)); // nombre de lignes de la table doit tomber juste $sql = "-"; // ??? $faire = FALSE; for ($l=0;$l<$lmax;$l++) { // pour chaque ligne génère le prepare $action = trim($_POST['action'.$l]); // enlève les espaces début et fin $action = substr($action,0,1); // récupère le 1er caractère de la 1ère colonne if ($action == "S") { // si suppression demandée if ($nomChamps[0][5] == "auto_increment") { $ch = ':ch'.$l.$sep.'0'; // récupère nom du champ id $sql = "DELETE FROM ".$nomtable." WHERE ".$nomChamps[0][0]." = ".$ch." ;"; } else { $sql = "DELETE FROM ".$nomtable." WHERE "; for ($r=0;$r<$rmax;$r++) { $ch = ':ch'.$l.$sep.$r; if ($nomChamps[$r][3] == "PRI") $sql = $sql." ".$nomChamps[$r][0]." = ".$ch." AND "; } $sql = substr($sql,0,-4); // supprime AND final en trop } $req = $bdd->prepare($sql) or die(print_r($bdd->errorInfo()) ); // prepare la suppression $champ = array(); if ($nomChamps[0][5] == "auto_increment") { $ch = 'ch'.$l.$sep.'0'; // ajoute l'id en auto incrément $champ[$ch] = $_POST[$ch]; // contruit le tableau d'exécution } else { for ($r=0;$r<$rmax;$r++) { // ou génère champs de la clé primaire $ch = 'ch'.$l.$sep.$r; if ($_POST[$ch] != "" AND $nomChamps[$r][3] == "PRI") { $champ[$ch] = $_POST[$ch]; } } } $req->execute($champ) or die(var_dump($bdd->errorInfo())); $_POST['action'.$l] = ""; // raz action effectuée $faire = TRUE; } elseif ($action == "A") { // si ajout demandé $ajouter = TRUE; $sql = "INSERT INTO ".$nomtable." ("; // construit l'ordre sql if ($nomChamps[0][5] == "auto_increment") $ri = 1; // saute l'id si auto incrément else $ri = 0; for ($r=$ri;$r<$rmax;$r++) { $ch = "ch".$l.$sep.$r; if ($_POST[$ch] != "") { // si le champ est renseigné, générer nom champ $sql = $sql." ".$nomChamps[$r][0].","; // } } $sql = rtrim($sql,","); // enlever , en trop sur dernier $sql = $sql.") VALUES ("; for ($r=$ri;$r<$rmax;$r++) { $ch = "ch".$l.$sep.$r; if ($_POST[$ch] != "") { // si le champ est renseigné, générer valeur $sql = $sql.":ch".$l.$sep.$r.","; } } $sql = rtrim($sql,","); // enlever , en trop sur dernier $sql = $sql." ) ;"; // fermer parenthèse $req = $bdd->prepare($sql) or die(print_r($bdd->errorInfo()) ); // prepare l'ajout $champ = array(); for($r=$ri;$r<$rmax;$r++) { // saute id si auto incrément (ri=1) $ch = "ch".$l.$sep.$r; if ($_POST[$ch] != "") { $champ[$ch] = $_POST[$ch]; } } $req->execute($champ) or die(var_dump($bdd->errorInfo())); // exécute la requête $_POST['action'.$l] = ""; // raz action effectuée $faire = TRUE; } elseif ($action == "M") { // si modification demandée $sql = "UPDATE ".$nomtable." SET "; // construit l'ordre sql if ($nomChamps[0][5] == "auto_increment") $ri = 1; // saute l'id si auto incrément else $ri = 0; for($r=$ri;$r<$rmax;$r++) { $ch = "ch".$l.$sep.$r; if ($_POST[$ch] != "" AND $nomChamps[$r][3] != "PRI") { // si champ renseigné et non clé, générer set champ $sql = $sql." ".$nomChamps[$r][0]."=:ch".$l.$sep.$r.","; } } $sql = rtrim($sql,","); // enlever , en trop sur dernier if ($ri == 1) // si auto incrément $sql = $sql." WHERE ".$nomChamps[0][0]." = :ch".$l.$sep."0 ;"; // ajoute la sélection sur id else { $sql = $sql." WHERE "; for ($r=0;$r<$rmax;$r++) { if ($nomChamps[$r][3] == "PRI") { $sql = $sql." ".$nomChamps[$r][0]." = :ch".$l.$sep.$r." AND "; } } $sql = substr($sql,0,-4); // enlève AND en trop } $sql = $sql." ;"; $req = $bdd->prepare($sql) or die(print_r($bdd->errorInfo()) ); // prépare la modif $champ = array(); if ($ri == 1) { // si auto incrément $ch = "ch".$l.$sep."0"; // ajoute l'id indice 0 $champ[$ch] = intval($_POST[$ch]); } for($r=$ri;$r<$rmax;$r++) { // pour tous les champs sauf autoincrément $ch = "ch".$l.$sep.$r; if ($_POST[$ch] != "" ) { // si champ renseigné, génére valeur $champ[$ch] = $_POST[$ch]; } } $req->execute($champ) or die(var_dump($bdd->errorInfo())); // exécute la requête $_POST['action'.$l] = ""; // raz action effectuée $faire = TRUE; } else { $_POST['action'.$l] = ""; // raz action effectuée } } // informe l'utilisateur if ($faire) { $chplages = $_POST['liste']; // rester sur même page (M,S ok) $plages = explode($sl,$chplages); $debut = array_pop($plages); $lplages = count($plages); $debut = $plages[$lplages-1]; $_POST['liste'] = implode($sl,$plages); $_POST['message1'] = 'Modification(s) ou Suppression(s) ou Ajout(s) de table '.$nomtable.' effectué(s)'; } $_POST['afficher'] = "Afficher"; // force nouvel affichage $bdd->commit(); // valide et termine la transaction } // fin transaction catch(Exception $e) { $bdd->rollback(); // invalide la transaction $_POST['message'] = 'Erreur ! Rien n\'a été créé, modifié ou supprimé !'; } } } // demande utilisateur d'exporter la table en csv if (isset($_POST['nomtable']) AND isset($_POST['exporter']) ) { $poubelle = array_pop($_POST); // éliminer le post du exporter // retrouve le nom des champs de la table $nomtable = $_POST['nomtable']; $nomChamps = showTable($bdd,$nomtable); // retrouve le nom des champs de la table $rmax = count($nomChamps); // nombre de champs de la table dont id $nch = count($_POST)-1; // oter nomtable // le séparateur de champs peut être , ou ; $sepe = ';'; $nom_fichier = "export/".$nomtable.".csv"; $options = lireTables($bdd,$nomtable,$maxexport,1,$sens); $lmax = count($options); // chaque ligne est un enregistrement du fichier csv $fp = fopen($nom_fichier,'w'); for ($i=0;$i<$lmax;$i++) { $buffer = ""; for ($j=0;$j<$rmax;$j++) { $buffer = $buffer.$options[$i][$j].$sepe; } $buffer = $buffer."\n"; fwrite($fp,$buffer); } fclose($fp); $_POST['message1'] = 'Export table '.$nomtable.' effectué'; $_POST['afficher'] = "Afficher"; } // demande utilisateur d'affichage de la table if (isset($_POST['nomtable']) AND ( isset($_POST['afficher']) OR isset($_POST['suivant']) OR isset($_POST['precedent']))) { if (isset($_POST['liste']) AND isset($_POST['suivant'])) { $chplages = $_POST['liste']; $plages = explode($sl,$chplages); $lplages = count($plages); $debut = $plages[$lplages-1]; $_POST['message1'] = 'Affichage page suivante de la table '.$_POST['nomtable']; } if (isset($_POST['liste']) AND isset($_POST['precedent'])) { $chplages = $_POST['liste']; $plages = explode($sl,$chplages); $debut = array_pop($plages); $debut = array_pop($plages); $lplages = count($plages); $debut = $plages[$lplages-1]; $_POST['liste'] = implode($sl,$plages); $_POST['message1'] = 'Affichage page précédente de la table '.$_POST['nomtable']; } // affiche le nom des champs (et autres caractéristiques) de la table $nomChamps = showTable($bdd,$_POST['nomtable']); $lmax = 0; // affiche contenu de la table si elle existe $options = liretables($bdd,$_POST['nomtable'],$taillepaquet,$debut); $lmax = count($options); // nombre de lignes de la table $rmax = count($nomChamps); // nombre de colonnes if ($lmax <= 1) { $_POST['message'] = 'La table est vide '; } else { $_POST['message'] = 'La table comporte '.$rmax.' champs dont les '.$lmax.' lignes suivantes de la page courante affichée'; } echo '

Affichage de la table '.$_POST['nomtable'].'

'; echo 'Lecture Appuyer sur le bouton Page suivante pour faire défiler la table, appuyer sur le bouton Page précédente pour revenir sur la page précédente.
'; if ($lectureseule) echo '
'; if (!$lectureseule) echo 'Edition Dans la colonne AMS mettre M pour modifier toute ligne, S pour la supprimer, A pour la doublonner puis renseigner ou modifier les champs (sauf Id géré automatiquement par le programme)
Pour créer une nouvelle ligne mettre A dans la colonne AMS de la dernière ligne prévue et renseigner les champs.
Dans tous les cas, appuyer sur le bouton Enregistrer les modifications effectuées.
Nota Bene: la ligne ajoutée apparaît toujours comme dernière ligne de la table, sur la dernière page affichée !
Pour exporter la table entière au format csv, appuyer sur le bouton Exporter au format csv

'; echo '
'; echo ''; echo ''; echo ''; echo ''; // ajouter champ action (Ajout,Suppression,Modification) for ($r=0;$r<$rmax;$r++) { echo ''; } echo ''; for ($l=0;$l<$lmax;$l++) { echo ''; echo ''; // champ action for ($r=0;$r<$rmax;$r++) { $champ = $options[$l][$r]; if ($nomChamps[$r][5] == "auto_increment") // cas clé en autoincrément echo ''; else { if ($nomChamps[$r][3] == "PRI") // interdit la modif des champs clés echo ''; else echo ''; } } echo ''; } // gestion de la pile des pages lues if (isset($_POST['liste'])) $plages = explode($sl,$_POST['liste']); else $plages = array(); $lplages = count($plages); if ($lplages == 0) $plages[$lplages] = $debut; // empiler premier lu $plages[$lplages+1] = $debut+$taillepaquet-1; // empiler dernier lu (-1 pour rappel dernier->premier) $chplages = implode($sl,$plages); // transforme en liste $lpages = count($plages); // ajout ligne blanche pour permettre ajout echo ''; echo ''; for ($r=0;$r<$rmax;$r++) { $champ = ""; if ($nomChamps[$r][5] == "auto_increment") echo ''; else { echo ''; } } echo ''; echo '
AMS'.$nomChamps[$r][0].'

'; if (isset($_POST['message1'])) { if ($lmax != $taillepaquet) $_POST['message1'] = "Dernières lignes de la table ".$_POST['nomtable']; afficheChamp('','message1','text','100',$_POST['message1'],'','Readonly'); } else afficheChamp('','message1','text','100','','','Readonly'); echo ''; // sauvegarde pile des plages lues // génères submit d'exécution if ($lplages >= 2) // affiche bouton précédent si nécessaire echo ''; if ($lmax == $taillepaquet) // affiche bouton suivant si nécessaire echo ''; if (!$lectureseule) echo '   '; echo ' '; echo '
'; } else { unset($_POST); } // affiche ou ré-affiche le formulaire de saisie des données echo '
'; echo '

Choix de la table à éditer

'; echo 'Aide en ligne
'; echo 'Sélectionner une table puis appuyer sur le bouton Afficher la table sélectionnée pour la voir.

'; $tables = listeTables($bdd,'TRUE'); afficheChamp('Nom table ','nomtable','select','3',$tables,' ',''); if (isset($_POST['message'])) afficheChamp('','message','text','100',$_POST['message'],'','Readonly'); else afficheChamp('','message','text','100','','','Readonly'); echo '
'; ?>