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

5/5 (4 avis)

Vue 4 676 fois - Téléchargée 101 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
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
Et puis suffit de coder avec Zend.. ;-) Lui, il le signale, ce genre d'étourderie (un peu trop souvent à mon goût d'ailleurs...)
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

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?
Messages postés
2480
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
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...
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

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.