Verificateur d'oubli du double égal dans une condition.

5/5 (4 avis)

Vue 4 860 fois - Téléchargée 104 fois

Description

Pour les développeurs un peu étourdis qui oublient de doubler l'opérateur "=" dans une condition. Cette erreur n'est pas une erreur de syntaxe, aussi n'est-elle pas signalée à l'execution par le language php. Et pourtant cela peut provoquer un comportement complètement différent de ce que l'on attend de son script.

Ce script, compatible que sous linux, recherche et affiche, sans les modifier, les conditions où se trouve un égal isolé. Reste ensuite à vérifier la pertinence de l'écriture et de la rectifier ou non.

Source / Exemple :


<?php

//Script de vérification des oublis du double "egal" dans une condition dans un developpement linux

//affiche les repertoires et fichiers
function afficher_entete ( $titre ) {
	echo "<!-- Entête de la fenêtre -->\r\n";
	echo "<!-- titre de la box -->\r\n";
	echo "<table border=0 width=520 cellspacing=0 cellpadding=2>\r\n";
	echo "<tr>\r\n";
	echo "<H3>$titre\r\n";
	echo "</H3></tr>\r\n";
	echo "</td></tr>\r\n";
	echo "</table>\r\n";
	return 1;
}
function select_fichier($fichier,$tab_rep,$chemin,$old_tab_rep,$old_chemin,$rocade,$choix)
{	
	//Pour ne retenir que le nom du fichier sans son chemin
	$reihcif=explode("/",strrev($chemin));
	$fichier=strrev($reihcif[0]);
	
	$aide_chemin="Emplacement des répertoires et fichiers proposés.";
	$aide_fichier="Sélectionnez un fichier à vérifier ou un répertoire à explorer.";
	echo "<form selection=".$_SERVER['PHP_SELF']." method=POST >";
	echo "<table border=0 width=920 cellspacing=5 cellpadding=0>";
	echo "<tr>
	<td align='right' font-size='8px' color='#003366'><a font-size='8px' href=\"javascript:alert('$aide_chemin')\")>Chemin</a>:</td>
	<td align='left'>
	<select name=repertoire onchange='submit(submit_repertoire)'>
	<option value=";
	if ($choix==1)
	{
		echo "$rocade>$rocade</option";
	}
	else
	{
		echo "$old_chemin>$old_chemin</option>";
	}
	
	//champ de saisie du répertoire
	foreach ($old_tab_rep as $sentier)
	{
		if ($choix==1)
		{
			$cible=$rocade.$sentier;
		}
		else
		{
			$cible=$old_chemin.$sentier;
		}
		if (is_dir($cible)==true)
		{
			$slatch=0;
			if (ereg("/$",$sentier))
			{
				$slatch=1;
			}
			if ($slatch==0)
			{
				$cible=$cible."/";
			}
			echo "<option";
		}
		echo " value=".$cible;
		if ($choix==1)
		{
			if (($cible)==$old_chemin)
			{
				echo " selected";
			}
		}
		else
		{
			if (($cible)==$chemin)
			{
				echo " selected";
			}
		}
		echo ">".$cible."</option>";
	}
	echo "</select></td>";
	echo "<td align='right' font-size='8px' color='#003366'><a font-size='8px' href=\"javascript:alert('$aide_fichier')\")>Fichier</a>:</td>
	<td align='left'>
	<select name=fichier onchange='submit(submit_fichier)'>
	<option value=0>S&#233lectionner...</option>";
	
	//champ de saisie du repertoire ou fichier
	foreach ($tab_rep as $rep)
	{
		echo "<option value=".$rep;
		if ($choix==1)
		{
			if ($rep==$fichier)
			{
				echo " selected";
			}
		}
		else
		{
			if ($rep==$chemin)
			{
				echo " selected";
			}
		}
		echo ">".$rep."</option>";
	}
	echo "</select></td></tr>";
	echo "<input type=hidden name=old_fichier value=".$fichier.">";
	echo "<input type=hidden name=chemin value=".$chemin.">";
	echo "<input type=hidden name=chemin value=".$old_chemin.">";
	echo "<input type=hidden name=action value=1>";
	echo "<tr><td colspan=2 align=center>&nbsp;&nbsp;&nbsp;<input type=submit
	name=submit_repertoire value=explorer></td>";
	echo "<td colspan=2 align=center>&nbsp;&nbsp;&nbsp;<input type=submit
	name=submit_fichier value=Verifier></td></tr>";
	echo "<tr>\r\n</tr>";
	//trait de séparation
	echo "<tr><td colspan=\"10\"><hr></td</tr>\r\n";
	echo "</table>";
	echo "</form>\r\n";
}
function afficheMauvais($mauvais,$chemin)
{
	echo "<table width=600 border=1 cellpadding=5>";
	if (count($mauvais)>0)
	{
		echo "<tr><th nowrap bgcolor='#006699'><b><font color='#FFFFFF'>N° ligne</font></b></th>
		<th nowrap bgcolor='#006699'><b><font color='#FFFFFF'>Condition litigieuse dans le fichier $chemin</font></b></th></tr>";
		foreach ($mauvais as $ligne)
		{
			$tab_num=explode(":",$ligne);
			$num=$tab_num[0];
			$condition=strstr($ligne,":");
			$condition=ltrim($condition,":");
			echo "<th nowrap bgcolor='#006699'><font color='#FFFFFF'>$num</font></th><td>$condition</td></tr>";
		}
	}
	else
	{
		echo "<tr><th nowrap bgcolor='#006699'><b>Aucune ligne litigieuse dans le fichier $chemin</b></th></tr>";
	}
	echo "</table>";
}
//Pour afficher le résultat des tables de tests
//echo "<br>chemin=$chemin<br>";
// code exécuté au chargement de la page
$action = $_REQUEST["action"];
//pour afficher la page d'aide concernée
$_SESSION["page_aide"]="verif_syntaxe.php";
afficher_entete ( "D&#233veloppement: Oubli du double \"&#233gal\" dans les conditions");
$error = "";
$choix=0;

//si on sélectionne un répertoire à explorer ou un fichier à vérifier
if ($action==1)
{
	//on conserve le chemin précédent et on récupère le contenu de ce chemin pour permettre de repartir en arrière dans l'arborescence
	$old_chemin=$_REQUEST["repertoire"];
	$old_fichier=$_REQUEST["fichier"];
	if (empty($old_chemin))
	{
		$old_chemin="/";
	}
	exec("ls $old_chemin",$old_tab_rep);
	$i=0;
	foreach ($old_tab_rep as $entite)
	{
		unset ($cible);
		$cible=$old_chemin.$entite;
		if (is_dir($cible)==true)
		{
			$old_tab_rep[$i]=$entite."/";
		}
		$i++;
	}
	
	//Si on sélectionne un fichier ou un répertoire suivant
	if ($_REQUEST["fichier"] && $_REQUEST["fichier"]!=$_REQUEST["old_fichier"])
	{	
		$chemin=$_REQUEST["repertoire"].$_REQUEST["fichier"];
		if (is_dir($chemin)==true)
		{
			
			//On recherche le contenu du répertoire sélectionné
			
			unset($tab_rep);
			exec("ls $chemin",$tab_rep);
			$i=0;
			foreach ($tab_rep as $entite)
			{
				unset ($cible);
				$cible=$chemin.$entite;
				$slatch=0;
				if (ereg("/$",$entite))
				{	
					$slatch=1;
				}
				$direction=is_dir($cible);
				if (is_dir($cible)==true && $slatch==0)
				{
					$tab_rep[$i]=$entite."/";
				}
				$i++;
			}
			//on réaffiche le formulaire pour avancer dans l'arborescence
			select_fichier($fichier,$tab_rep,$chemin,$old_tab_rep,$old_chemin,$rocade,$choix);
		}
		elseif (is_file($chemin)==true)
		{
			$choix=1;	//le formulaire de choix doit réagir différement
			$tab_rep=$old_tab_rep;
			
			//Pour descendre d'un niveau dans l'arborescence
			$rocade0=rtrim($old_chemin,"/");
			$edacor=strstr(strrev($rocade0),"/");
			$rocade=strrev($edacor);
			
			exec("ls $rocade",$rep_precedent);
			$i=0;
			foreach ($rep_precedent as $entite)
			{
				unset ($cible);
				$cible=$rocade.$entite;
				$slatch=0;
				if (ereg("/$",$entite))
				{
					$slatch=1;
				}
				if (is_dir($cible)==true && $slatch==0)
				{
					$old_tab_rep[$i]=$entite."/";
				}
				$i++;
			}
			//print_r($rep_precedent);
			//on réaffiche le formulaire pour reculer dans l'arborescence ou choisir un autre fichier
			select_fichier($fichier,$tab_rep,$chemin,$rep_precedent,$old_chemin,$rocade,$choix);
			//On vérifie la syntaxe du fichier sélectionné: Y-a-'il un if avec une égalité à un seul "égal" ?
			$debut_ligne="if \?(";
			$critere="[0-9a-zA-Z\"]]\? \?= \?[0-9a-zA-Z$\"]";
			//On liste toutes les lignes, dotées d'une syntaxe suspecte,avec leur n° de ligne
			exec("cat '$chemin' | grep -n '$debut_ligne' | grep '$critere'",$mauvais);
			
			afficheMauvais($mauvais,$chemin);
		}
	}
	//Si on revient en arrière dans l'arborescence, recherche du contenu du répertoire précédent
	elseif($_REQUEST["repertoire"] && ($_REQUEST["repertoire"]."/")!=$old_chemin)
	{	
		$chemin=$_REQUEST["repertoire"];
		//Pour descendre d'un niveau dans l'arborescence
		$rocade0=rtrim($old_chemin,"/");
		$edacor=strstr(strrev($rocade0),"/");
		$rocade=strrev($edacor);
		
		exec("ls $rocade",$rep_precedent);
		$i=0;
		foreach ($rep_precedent as $entite)
		{
			unset ($cible);
			$cible=$rocade.$entite;
			$slatch=0;
			if (ereg("/$",$entite))
			{
				$slatch=1;
			}
			if (is_dir($cible)==true && $slatch==0)
			{
				$old_tab_rep[$i]=$entite."/";
			}
			$i++;
		}
		unset($tab_rep);
		exec("ls $chemin",$tab_rep);

		$i=0;
		foreach ($tab_rep as $entite)
		{
			unset ($cible);
			$cible=$chemin.$entite;
			
			
			$slatch=0;
			if (ereg("/$",$entite))
			{
				$slatch=1;
			}
			if (is_dir($cible)==true && $slatch==0)
			{
				$tab_rep[$i]=$entite."/";
			}
			$i++;
		}
		//Pour descendre d'un niveau dans l'arborescence
		$rocade0=rtrim($old_chemin,"/");
		$edacor=strstr(strrev($rocade0),"/");
		$old_chemin=strrev($edacor);
		//array_unshift($old_tab_rep,$rocade);
		
		select_fichier($fichier,$tab_rep,$chemin,$old_tab_rep,$old_chemin,$rocade,$choix);
		
	}
	else
	{
		echo "<P class=textcontactr>Traitement impossible.</P>";
	}
}
else
{
	//On affiche le formulaire avec la proposition de la racine de l'arborescence
	$old_table_rep=array();
	$old_chemin="/";
	$chemin="/";
	unset($tab_rep);
	exec("ls $chemin",$tab_rep);
	$i=0;
	foreach ($tab_rep as $entite)
	{
		unset ($cible);
		$cible=$chemin.$entite;
		if (is_dir($cible)==true)
		{
			$tab_rep[$i]=$entite."/";
		}
		$i++;
	}
	select_fichier($fichier,$tab_rep,$chemin,$old_tab_rep,$old_chemin,$rocade,$choix);
}

?>

Conclusion :


Le script utilise du shell pour localiser le fichier du script à vérifier. Une fois le fichier sélectionneé, le shell cherchera les lignes où existe un " if " puis vérifiera qu'aucun "=" n'est isolé dans cette condition. S'il en trouve, il l'affichera dans un tableau avec son n° de ligne.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
13 mai 2007 à 08:58
Et puis suffit de coder avec Zend.. ;-) Lui, il le signale, ce genre d'étourderie (un peu trop souvent à mon goût d'ailleurs...)
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
8 mai 2007 à 13:49
Je comprends pas trop l'intérêt, je vois pas pourquoi avec PHP tu t'embêtes avec des soucis de portabilité, et 300 lignes, c'est énorme O_o. Enfin ^^ j'aurais mis une reg exp qui cherche des chaines du type "if( * = * )" avec qq raffinement sur les tolérances des whitespaces et une bonne définition pour les *. Ca aurait suffit non?
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
7 mai 2007 à 12:23
Salut,

+1

Et j'aouterais que je ne vois pas bien l'intérêt d'un tel script. Si on se trompe et qu'on utilise au lieu de on s'en rend quand même vite compte, parce que :
- soit on a assigné à une variable une valeur d'un autre type que le type d'origine de la variable => ça coince sûrement plus loin
- dans une boucle if, c'est toujours la même condition qui est exécutée
- la variable a une valeur que l'on n'attend pas
- etc

Bref, un peu de bon sens permet de trouver l'erreur quand on fait l'étourderie...
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
7 mai 2007 à 12:14
Wouaw... plus de 300 lignes de code pour ça... mieux vaut peut être prendre directement les bonnes habitudes... après certes on est jamais à l'abri d'un oubli... .. . ;o)

Pourquoi utiliser le shell pour trouver le fichier... php aurait très bien pu le faire en interne et ainsi le script serait portable avec tous les OS... dans la même idée utilise la constante DIRECTORY_SEPARATOR plutôt que /... .. .

Sinon ton script sait il faire la différence avec

if(false !($handle fopen($target)))

ou

if($handle = fopen($target))

sinon...

elseif (is_file($chemin)==true)

>

elseif (is_file($chemin) === true)

Pour finir utilise plutot les simples quotes et à l'inverse utilise les doubles quotes pour les attributs html... et surtout vire tes multiples echo() pour un seul echo()

@ tchaOo°

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.