Besoins de votre analyse

Eléphanteau du PHP | 31 Messages

29 juin 2012, 15:56

Bonjour, je me permets de poster ici et de vous demander votre analyse !
D'abord, j'explique j'essaye d'ajouter au script categorizator une gestion d'admin avec la possibilité d'en ajouter et de les modifier, tous fonctionne j'ai suivi quelque tuto et tp sur divers sites pour en arriver là mais, j'aimerais si possible sans trop abuser avoir votre analyse sur le code, car j'aimerais le faire correctement.

Voici ma page modifier_administrateur
<?php
session_start(); 

// On inclue le fichier config et fonction
include 'config.php';
include 'fonction.php';

// Si tu n'es pas connecté tu n'as rien à faire ici
if(!isset($_SESSION['login'])) {die('
<style type="text/css">
<!--
	h4.alert_warning {
	display: block;
	width: 95%;
	margin: 20px 3% 0 3%;
	margin-top: 20px;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
	background: #F5F3BA url(images/icn_alert_warning.png) no-repeat;
	background-position: 10px 10px;
	border: 1px solid #C7A20D;
	color: #796616;
	padding: 10px 0;
	text-indent: 40px;
	font-size: 14px;}
-->
</style>
<h4 class="alert_warning">Vous devez être connecté pour accéder à cette partie de l\'annuaire ! <a href="connexion.php">Connexion</a></h4>');}

// Si ce n'est pas le créateur on affiche une erreur
else if ($_SESSION['id']!=1) {die('
<style type="text/css">
<!--
	h4.alert_warning {
	display: block;
	width: 95%;
	margin: 20px 3% 0 3%;
	margin-top: 20px;
	-webkit-border-radius: 5px;
	-moz-border-radius: 5px;
	border-radius: 5px;
	background: #F5F3BA url(images/icn_alert_warning.png) no-repeat;
	background-position: 10px 10px;
	border: 1px solid #C7A20D;
	color: #796616;
	padding: 10px 0;
	text-indent: 40px;
	font-size: 14px;}
-->
</style>
<h4 class="alert_warning">Vous n\'avez pas le niveau requis pour accéder à cette page ! <a href="accueil.php">Retour à l\'accueil</a></h4>');}

// On recupere l'id de l'administrateur
$id = $_GET['id'];

// Pour la gestion du formulaire 
// Initialisation du message de réponse
$message = null;


// Si le formulaire est envoyé
if (isset($_POST['pseudo'])) 
{

     /* Récupération des variables issues du formulaire
     Teste l'existence les données post en vérifiant qu'elles existent, qu'elles sont non vides et non composées uniquement d'espaces.
     (Ce dernier point est facultatif et l'on pourrait se passer d'utiliser la fonction trim())
     En cas de succès, on applique notre fonction Verif_magicquotes pour (éventuellement) nettoyer la variable */
     $pseudo = (isset($_POST['pseudo']) && trim($_POST['pseudo']) != '')? Verif_magicquotes($_POST['pseudo']) : null;
     $mail = (isset($_POST['mail']) && trim($_POST['mail']) != '')? Verif_magicquotes($_POST['mail']) : null;

	 // Requête pour recupere les infos de l'admninstrateur
	$requete = "SELECT pseudo, mail FROM ".$admin." WHERE ID = ".$id."";
     
    // Exécution de la requête
    $req_exec = mysql_query($requete) or die(mysql_error());
     
	// Création du tableau associatif du résultat
    $resultat = mysql_fetch_assoc($req_exec);
		
		
     if(isset($pseudo,$mail)) 
     {

	 // On verifie que le pseudo est unique ! si il est changer 
		if($pseudo!=$resultat['pseudo']) 
		{			
			// Requête pour compter le nombre d'enregistrements répondant à la clause : champ du pseudo de la table != pseudo posté dans le formulaire
			$requete = "SELECT count(*) as nb FROM ".$admin." WHERE pseudo = '".$pseudo."'";
     
            // Exécution de la requête
            $req_exec = mysql_query($requete) or die(mysql_error());
     
			// Création du tableau associatif du résultat
            $resultat = mysql_fetch_assoc($req_exec);
			
		    // nb est le nom de l'allias associé à count(*) et retourne le résultat de la requête dans le tableau $resultat; 
            if ($resultat['nb'] == 0) 
            // Résultat du comptage = 0 pour ce pseudo, on peut donc l'enregistrer 
            {				
				$update = "UPDATE ".$admin." SET pseudo = '".$pseudo."' WHERE ID = ".$id."";          			
				// Exécution de la requête de mise à jour
				$update_exec = mysql_query($update) or die(mysql_error());
			  
				/* Si l'update s'est faite correctement (la requête retourne "true" en cas de succès, je peux donc utiliser 
				l'opérateur de comparaison strict '==='  c.f. http://fr.php.net/manual/fr/language.op ... arison.php) */
				if ($update_exec === true) 
				{
					$message = '<h4 class="alert_success">Le pseudo de l\'administrateur à été changer.</h4>';
				}	
			}
			else 
			{
				// Le pseudo est déjà utilisé
				$message = '<h4 class="alert_warning">Ce pseudo est déjà utilisé, changez-le.</h4>';
			}
		}	
			// On verifie que le mail est unique ! si il est changer 
			else if($mail!=$resultat['mail']) 
			{			
				// Requête pour compter le nombre d'enregistrements répondant à la clause : champ du mail de la table != mail posté dans le formulaire
				$requete = "SELECT count(*) as nb FROM ".$admin." WHERE mail = '".$mail."'";
     
				// Exécution de la requête
				$req_exec = mysql_query($requete) or die(mysql_error());
		 
				// Création du tableau associatif du résultat
				$resultat = mysql_fetch_assoc($req_exec);
				
				// nb est le nom de l'allias associé à count(*) et retourne le résultat de la requête dans le tableau $resultat; 
				if ($resultat['nb'] == 0) 
				// Résultat du comptage = 0 pour ce mail, on peut donc l'enregistrer 
				{				
					$update = "UPDATE ".$admin." SET mail = '".$mail."' WHERE ID = ".$id."";          			
					// Exécution de la requête de mise à jour
					$update_exec = mysql_query($update) or die(mysql_error());
			  
					/* Si l'update s'est faite correctement (la requête retourne "true" en cas de succès, je peux donc utiliser 
					l'opérateur de comparaison strict '==='  c.f. http://fr.php.net/manual/fr/language.op ... arison.php) */
					if ($update_exec === true) 
					{
						$message = '<h4 class="alert_success">L\'email de l\'administrateur à été changer.</h4>';
					}	
				}
				else 
				{
					// Le pseudo est déjà utilisé
					$message = '<h4 class="alert_warning">Cette email est déjà utilisé, changez-la.</h4>';
				}			
			}
		}
     else 
     {    // Au moins un des deux champs "pseudo" ou "mot de passe" n'a pas été rempli
          $message = '<h4 class="alert_error">Les champs "Pseudo" et "Email" doivent être remplis.</h4>';
     }
}

// On recupere les infos de l'administrateur 
$requete = "SELECT pseudo, mail FROM ".$admin." WHERE ID = ".$id."";
     
// Exécution de la requête
$req_exec = mysql_query($requete) or die(mysql_error());
     
// Création du tableau associatif du résultat
$resultat = mysql_fetch_assoc($req_exec);
			  
// On definie quelque valeurs comme le titre et le la page en cours
define("TITRE", "Modifier un administrateur");
define("ARIANE", "<a href=\"accueil.php\">Accueil administration</a> <div class=\"breadcrumb_divider\"></div> <a class=\"current\">". TITRE ."</a>");

// On affiche le haut de page (header.php)
include 'header.php';

// On inclue la collone de droite
include 'colonne.php';

?>

 
 <section id="main" class="column">
		
		<article class="module width_full">
			<header><h3>Modification d'un administrateur</h3></header>
				<?php if(isset($message)) echo $message ?>
				
				<form action="#" method="post">		
					<div class="module_content">
						<fieldset>
							<label for="pseudo">Pseudo :</label>
							<input type="text" name="pseudo" id="pseudo" value="<?php echo $resultat['pseudo']; ?>">
						</fieldset>						
						<fieldset>
							<label for="mail">Email : </label>
							<input type="text" name="mail" id="mail" value="<?php echo $resultat['mail']; ?>">
						</fieldset>						
						<div class="clear"></div>
					</div>
					
					<footer>
						<div class="submit_link">					
							<input type="submit" id="valider" value="Modifier l'administrateur" class="alt_btn">
							<input type="reset" value="Reset">
						</div>
					</footer>
				</form>				
		</article><!-- end of post new article -->
		
		<h4 class="alert_info">Pour changer son mot de passe l'administrateur doit utiliser le lien "Mot de pase perdu ?"</h4>
			
		<div class="spacer"></div>
	</section>


</body>

</html>
Si quelqu'un passe et veut bien donner son avis je l'en remercie d'avance, n'hésitez pas à être franc c'est le but de ce message. Merci et bonne journée azuriel.

Mammouth du PHP | 2278 Messages

29 juin 2012, 17:41

Je me suis amusé avec le début
// On inclut le fichier config et fonction
include 'config.php';
include 'fonction.php';

// Si tu n'es pas connecté tu n'as rien à faire ici
/* les styles gagneraient à se trouver dans une feuille de style externe ou à être déclarés au début*/
$warning = "";
if(!isset($_SESSION['login'])) 
{
	$warning = "<h4 class='alert_warning'>Vous devez être connecté pour accéder à cette partie de l\'annuaire ! 
	<a href='connexion.php'>Connexion</a></h4>";

}
// Si ce n'est pas le créateur on affiche une erreur
elseif ($_SESSION['id']!=1) 
{
	$warning = "<h4 class='alert_warning'>Vous n\'avez pas le niveau requis pour accéder à cette page ! 
	<a href='accueil.php'>Retour à l\'accueil</a></h4>";
}
if ($warning != "")
{
	die($warning);
}
Il faudrait pour inclure les styles définis à l'extérieur commencer la page par l'incantation:
<!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">
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<link rel="stylesheet" type="text/css" href="dictographe.css" media="screen" />
<meta name='statut' content='final' />

</head>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
AB
ViPHP | 5818 Messages

29 juin 2012, 17:51

Dans ta première requête tu utilise la variable $admin mais on ne voit pas où tu l'a définie avant de l'utiliser :
$requete = "SELECT pseudo, mail FROM ".$admin." WHERE ID = ".$id."";
Le tuto d'inscription/connexion que tu as suivi est super :lol: cependant tu as omis un élément important qu'il contient :
Avec mysql Il faut toujours utiliser mysql_real_escape_string pour protéger les variables à l'intérieur d'une requête


Au fait, il fonctionne comme tu veux ce script ?

Eléphanteau du PHP | 31 Messages

29 juin 2012, 18:17

Bonjour sirakawa,
ok pour ta remarque je le fait de suite !

Bonjour AB,
Oui le script fonctionne correctement et pour une fois je l'ai compris tout de suite (enfin je crois...)
Tu dit :
Il faut toujours utiliser mysql_real_escape_string
Il faut donc faire ceci :
mysql_real_escape_string($admin) ??
Pour la variable $admin elle est dans le fichier config avec les infos pour la base de données comme ceci
$admin = "Table_Administrateur" 
Sinon dans l'ensemble c'est correct ou c'est du n'importe quoi ?
Je vous remercie de vos réponses rapide :wink:

ViPHP
AB
ViPHP | 5818 Messages

29 juin 2012, 18:41

Il faut donc faire ceci :
mysql_real_escape_string($admin) ??
Non pas pour celle-ci, mais pour toutes les autres. Lis la doc et particulièrement les injections de code (piratage) que tu risque si tu ne le fais pas.
Sinon dans l'ensemble c'est correct ou c'est du n'importe quoi ?
Je vous remercie de vos réponses rapide :wink:
Je regarderai plus en détails plus tard, pas le temps pour l'instant.

Mammouth du PHP | 2278 Messages

29 juin 2012, 18:43

Moi je trouve ça plutôt bien fichu.
Un petit effort supplémentaire de présentation, peut-être sur les indentations.
Et puis, mais ça ce n'est que moi:
je n'aime ni
if (bidule){
   instructions;}
ni
if (bidule)
{
    instructions;}
et je préfère
if (bidule)
{
    instructions;
}
et quand les commentaires ne sont pas très longs il sont bien après le if avec une indentation inverse ce qui est bien utile dans certaines situations complexes.
if (bidule) //____________________________ la condition bidule est satisfaite
{
    if (truc) //__________la condition truc est vraie
    {
    }
    else  //___________la condition truc est fausse
    {
    }
else   //____________________________ la condition bidule n'est pas satisfaite
{   
    instructions;
}
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 31 Messages

29 juin 2012, 18:47

Ok je vais suivre vos instructions, merci de me consacrer un peu de votre temps :wink:

Tel que suggéré j'ai modifié, mes fichier comme ceci :
// On definie l'erreur
	define ("ERREUR", "<h4 class=\"alert_warning\">Vous devez être connecter pour vous deconnecter ! <a href=\"connexion.php\">Connexion à l'administration</a></h4>");
	include 'erreur.php';
	exit;
Et la page erreur.php
<!doctype html>
<html lang="fr">

<head>
	<meta charset="utf-8"/>
	<title>Administration de l'annuaire - Erreur !</title>
	
	<link rel="stylesheet" href="css/layout.css" type="text/css" media="screen" />
	<!--[if lt IE 9]>
	<link rel="stylesheet" href="css/ie.css" type="text/css" media="screen" />
	<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
	<![endif]-->
</head>

<body>

	<section id="main" class="column">
		<?php echo ERREUR; ?>	
		<div class="spacer"></div>
	</section>

</body>
</html>
Comme ça c'est mieux

Je vais continuer de modifier mes fichier en suivant vos instructions et je reposte ma page plus tard :D

ViPHP
AB
ViPHP | 5818 Messages

29 juin 2012, 19:11

Le fait de mettre des lien js vers d'autres sites pour construire son site est très discutable.

De nombreux développeurs le font mais je ne trouve pas que cela soit une bonne idée. L'avantage évident est que le code appelé peut évoluer sans ton intervention mais c'est aussi potentiellement un pb : tu ne maîtrise pas le contenu et cela revient à faire une confiance aveugle à certains sites. En admettant que cela ne pose pas de pb, reste le pb que ces liens peuvent se trouver indisponibles (panne de serveur) et dans ce cas ta page va ramer grave (souvent plus de trente seconde) avant d'interrompre la tentative de chargement de ce lien temporairement rompu pour enfin afficher le reste de ton code.

Eléphanteau du PHP | 31 Messages

29 juin 2012, 19:16

Effectivement vu sous cet angle c'est discutable, je vais m'arranger pour avoir directement tous les fichiers.
Merci pour cet avis sur ce point AB et bon appétit

ViPHP
AB
ViPHP | 5818 Messages

30 juin 2012, 17:50

Effectivement vu sous cet angle c'est discutable, je vais m'arranger pour avoir directement tous les fichiers.
Merci pour cet avis sur ce point AB et bon appétit
Sage précaution :wink:
Je dis cela d'expérience car par exemple sur ce site j'utilise les services de "addthis" pour avoir une liste d'adresses mise à jour automatiquement vers les réseaux sociaux (en pied de page). Un jour leur serveur est tombé en panne et ce jour là, galère totale pour faire afficher le site alors qu'en plus ce code n'est pas indispensable pour le fonctionnement général.
Solution : pour avoir une liste mise à jour et un lien sûr, j'ai créé une tâche automatisée qui une fois par jour va chercher leur code sur leur serveur et si disponible, enregistre le contenu dans un fichier sur notre serveur :)

Eléphanteau du PHP | 31 Messages

30 juin 2012, 18:03

Bonjour AB,
Je vais suivre ton conseil et mettre tous les fichiers sur le serveur, car comme tu dis si le fichier est indisponible ce n'est pas top.

Merci pour ce conseil, car franchement je ne m'étais jamais posé la question.

ViPHP
ViPHP | 2577 Messages

30 juin 2012, 18:33

Bonjour,

Personnellement j'aurai fait des fonctions :
<?PHP
controle_acces(1);
if (controle_saisie()) {
   traitement();
}
affichage();
?>
controle_acces() est une fonction qui traite le controle de $_SESSION['id'] et affiche le message.
controle_saisie() regroupe les controles. Chaque erreur fait un return false et un return true à la fin
traitement() fait la mise à jour.
affichage() affiche la page.

J'y vois l'avantage de séparer les problèmes de programmation en fonction plus simple à mes yeux.

Eléphanteau du PHP | 31 Messages

30 juin 2012, 18:42

Bonjour Mazarini,

Si j'ai bien tous compris ton code serai fonctionnelle tel quel ?
Et fonctionne comme ceci :
controle_acces(1);  // Si 1 c'est le créateur
if (controle_saisie()) { // On vérifie l'id
    traitement(); // Ici on regarde si l'id est 1 si ce n'est pas le cas : return false
}
 affichage(); // Sinon on affiche la page
C'est ça ou je n'ai pas compris ?
Et comment tu affiche l'erreur ? comme ceci :
traitement($erreur_niveau)
Merci de ta réponse et bonne fin de journée :wink:

ViPHP
ViPHP | 2577 Messages

30 juin 2012, 19:21

Dans controle_saisie, tu fais tous les controles et dans traitement uniquement l'update.

Pour le message d'erreur, tu utilises une variable globale comme $message par exemple.

Eléphanteau du PHP | 31 Messages

30 juin 2012, 20:25

Ok, vais essayer ça :wink:

Dit, tu n'aurais pas un lien avec de la doc sous la main ?
Je recherche avec google mais, pas trouvé :oops: