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

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

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.