';
// 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 '';
}
else {
unset($_POST);
}
// affiche ou ré-affiche le formulaire de saisie des données
echo '