Mini liste générique affichant une table mysql et permettant l'ajout ou la suppression, avec ou sans mot de passe, xhtml/css

Soyez le premier à donner votre avis sur cette source.

Vue 12 555 fois - Téléchargée 1 104 fois

Description

Grâce à une seule page de php/xhtml/css/javascript :
Le code va lire votre table (par exemple une liste de courses, une guest list,...) et va afficher ses données correctement formatées, avec une boite de login si vous l'avez décidé.
si vous êtes loggué ou bien si vous avez désactivé le logging, vous pourrez alors ajouter et supprimer des lignes.
une restriction cependant : la table mysql doit contenir comme premier champ une clé primaire de type int et auto_increment (c'est l'id)
voila :)

Source / Exemple :


<?php
/* ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' */
/*                   Script made by mOut on april 2005                   */
/*                         updated on june 2007                          */
/*                    www.mout.fr - mout85@gmail.com                     */
/*                                   ©                                   */
/* ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' */

/* =========================== CONFIGURATION =========================== */

//titre (et sous-titre) de votre page et adresse e-mail de contact :
$titre              = 'Titre';
$soustitre          = 'Sous-titre';
$email              = 'vous@domaine.com';
//largeur de chaque colonne (une largeur de 10 fait 70 pixels) :
$largeurcolonnes    = 20;
//colonne a trier (0 pour la clé, ou bien 1 ou 2 ou 3...) :
$orderby            = 0;

//----------------------------------------------------
//paramètres de votre base de données mysql :
$mysql['server']    = ''; //free: sql.free.fr
$mysql['login']     = '';
$mysql['password']  = '';
$mysql['database']  = ''; //free: votre login
$mysql['table']     = '';
//ATTENTION, votre table doit contenir une clé primaire en auto_increment 
//en premier champ de table (non affichée ensuite ici), les champs suivants
//constituant ceux affichés (donc au choix TEXT, VARCHAR, INT, etc.)

//----------------------------------------------------
//protégé par mot de passe (true/false) :
$pp                 = true;
//si true, alors indiquez le mot de passe :
$password           = 'motdepasse';

/* ====================== FIN DE LA CONFIGURATION ====================== */

error_reporting(0); //error_reporting(E_ALL); si vous avez des problèmes

$self = $_SERVER['PHP_SELF'];

@session_start();
$admin = false;
if(isset($_POST['pass']) && $_POST['pass']==$password)
    $admin = true;
elseif(isset($_SESSION['pass']) && $_SESSION['pass']===true)
    $admin = true;
$_SESSION['pass'] = $admin;

mysql_connect($mysql['server'],$mysql['login'],$mysql['password'])
    or die('Erreur lors de la connexion à la base MySQL : '.mysql_error());

mysql_select_db($mysql['database'])
    or die('Erreur lors du choix de la table MySQL : '.mysql_error());

$r = mysql_query('SELECT * FROM '.$mysql['table'])
     or die('Erreur lors de la lecture des données de la table : '.mysql_error());

$numfields = mysql_num_fields($r);

for($i=0;$i<$numfields;$i++)
    $fields[] = mysql_field_name($r,$i);

if(isset($_POST[$fields[1]])){
    if(!$pp || ($pp && $admin)){
        $q = "INSERT INTO ".$mysql['table']." (";
        for($i=1;$i<$numfields-1;$i++)
            $q.= $fields[$i].", ";
        $q.= $fields[$numfields-1].") VALUES (";
        for($i=1;$i<$numfields-1;$i++)
            $q.= "'".$_POST[$fields[$i]]."', ";
        $q.= "'".$_POST[$fields[$numfields-1]]."')";
        mysql_query($q) or die(mysql_error());
    }
    else
        exit("Erreur : vous n'avez pas les droits pour cette action.");
}

if(isset($_GET['delete'])){
    if(!$pp || ($pp && $admin)){
    	$req = 'DELETE FROM '.$mysql['table'].' WHERE '.$_GET['primary'].'='.$_GET['delete'];
    	mysql_query($req) or die('['.$req.'] '.mysql_error());
    }
    else
        exit("Erreur : vous n'avez pas les droits pour cette action.");
}

//on refait la requête de sélection pour actualiser la page :
$r = mysql_query("SELECT * FROM ".$mysql['table']." ORDER BY ".$fields[$orderby]." ASC")
     or die("Erreur lors de la lecture des données de la table : ".mysql_error());

?>
<!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" xml:lang="fr" lang="fr">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <meta http-equiv="Content-Language" content="fr" />
  <title><?php echo $titre; ?></title>
  <script type="text/javascript">
    function post(){
      if(document.getElementById('add_1').value!='')
        document.getElementById('flist').submit();
    }
  </script>
  <style type="text/css" media="screen,print">
    a { text-decoration: none; color: #048; }
    a:hover { color: red; }
    body { font-family: Helvetica, sans-serif; font-size: 12px; }
    th { border-bottom: 1px solid #888; background-color: #eee; }
    tr:hover { background-color: #eee; }
    input:focus { border: 2px solid #888; }
    td,th { height: 22px; }
    th { width: <?php echo $largeurcolonnes*8; ?>px; }
    #actualiser { font-size: 12px; }
    #lb { position: absolute; bottom: 18px; left: 20px; font-size: 10px; position: fixed; }
    #rb { position: absolute; bottom: 10px; right: 28px; position: fixed; }
    img { border: none; }
  </style>
  <style type="text/css" media="print">
    .noprint { display:none; }
    body,table,tr,td { font-size: 12px; }
    td,th { height: 16px; }
  </style>
</head>
<body>

<div style="text-align: center">
  <h1>
    <a href="<?php echo $self; ?>"><?php echo $titre; ?></a>
  </h1>
  <?php echo ( $soustitre!='' ? '<p>'.$soustitre.'</p>' : '' ); ?>
  <h3 id="actualiser" class="noprint">
    <a href="<?php echo $self; ?>">Actualiser la page</a>
  </h3>
</div>

<form method="post" id="flist" action="<?php echo $self; ?>">
<table style="margin-left: auto; margin-right: auto;">
  <?php
  //titres des colonnes :
  echo '<tr>';
  for($i=1;$i<$numfields;$i++)
      echo '<th>'.$fields[$i].'</th>';
  echo '</tr>'."\n";
  
  //lignes de la table :
  $count=0;
  while($l=mysql_fetch_array($r)){
      echo '<tr>';
      for($i=1;$i<$numfields;$i++)
          echo '<td>'.htmlspecialchars($l[$i]).'</td>';
      if(!$pp || ($pp && $admin))
          echo '<td class="noprint"><a href="'.$self.'?primary='.$fields[0].'&delete='.$l[0].'" onclick="return confirm(\'Etes-vous sûr de vouloir supprimer cette entrée ?\')">Del</a></td>';
      echo '</tr>'."\n";
      $count++;
  }
  
  //formulaire d'ajout d'une ligne :
  if(!$pp || ($pp && $admin)){
    if($count<30){
      echo '<tr class="noprint">';
      for($i=1;$i<$numfields;$i++)
          echo '<td><input type="text" size="'.$largeurcolonnes.'" name="'.$fields[$i].'" id="add_'.$i.'" /></td>';
      echo '<td style="height: 30px">';
      echo '<a href="javascript:void(0)" onclick="post()">Add</a>';
      echo '<input type="submit" style="display:none" />';
      echo '</td></tr>'."\n";
    }
    else
      echo '<tr class="noprint"><td colspan="3"><b>Liste pleine.</b></td></tr>'."\n";
  }
  ?>
</table>
</form>

<p class="noprint"> </p><p class="noprint" style="text-align:center"><?php echo $count; ?> total records | <a href="http://www.mout.fr/">made by mOut</a></p>

<div id="lb" class="noprint">Contact : <a href="mailto:<?php echo $email; ?>"><?php echo $email; ?></a>.</div>
<?php
if(!$admin && $pp){
    //attention pour xhtml, certains serveurs insèrent un input hidden pour le session_id, juste après le <form> :
    echo '<form method="post" id="fadmin" action="'.$self.'">';
    echo '<div id="rb" class="noprint"><p>';
    echo '<input type="password" name="pass" id="pass" size="10" /> ';
    echo '<a href="javascript:void(0)" onclick="document.getElementById(\'fadmin\').submit();">Admin</a>';
    echo '<input style="display:none" type="submit" />';
    echo '</p></div></form>';
    echo '<script type="text/javascript"> document.getElementById(\'pass\').focus(); </script>';
}
else
    echo '<script type="text/javascript"> document.getElementById(\'add_1\').focus(); </script>';
?>

</body>
</html>

Conclusion :


attention à l'encodage ! ici c'est spécifié ISO-8859-1, donc il faut enregistrer le fichier texte PHP en ANSI, mais si votre base est en UTF-8, enregistrez-le en UTF-8 et mettez à jour la balise META !

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Anthomicro
Messages postés
9440
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8 -
Salut,

<?=$titre?> : à bannir, remplace par <?php echo $titre; ?>

Ensuite tu peux faire appel à une feuille de style externe plutôt que de mettre tout le style dans une balise <style>

:-)
antoine129
Messages postés
64
Date d'inscription
vendredi 28 mai 2004
Statut
Membre
Dernière intervention
5 juin 2006
-
salut :)
tout d'abord je ne suis pas d'accord, le raccourci <?=$titre?> est tout à fait standard quoique méconnu mais de plus en plus utilisé.
ensuite pour la feuille de style l'avantage était de faire tout le script en un seul fichier ;-)
j'aurais pu évidemment utiliser une feuille de style externe, mais quel intérêt?
merci pour tes remarques :)
antoine.
cs_Anthomicro
Messages postés
9440
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8 -
"le raccourci <?=$titre?> est tout à fait standard"

Place maintenant l'option "short_open_tags" de ton serveur à "off" et reviens tester ton script...

Ensuite pour la feuille de style externe c'est surtout pour clarifier le code html et gagner du trafic...
antoine129
Messages postés
64
Date d'inscription
vendredi 28 mai 2004
Statut
Membre
Dernière intervention
5 juin 2006
-
je ne connais pas beaucoup de serveurs qui mettent cette option à off... et ça raccourci pas mal les choses !
pour la feuille de style si tu veux disons que ça dépend de l'utilisation :)
toutphp
Messages postés
107
Date d'inscription
lundi 24 mai 2004
Statut
Membre
Dernière intervention
5 mai 2010
-
En ce qui concerne le gain de bande passante avec la feuille de style, il faut avouer que le gain ne sera réellement visible que pour un gros site qui envoie plusieurs pages diffèrentes avec la même feuille !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.