begin process at 2010 02 10 05:40:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > FONCTION RECURSIVE DE RECHERCHE DE FICHIER SELON UNE EXTENSION OU UN GROUPE D'EXTENSION

FONCTION RECURSIVE DE RECHERCHE DE FICHIER SELON UNE EXTENSION OU UN GROUPE D'EXTENSION


 Information sur la source

Note :
5,25 / 10 - par 4 personnes
5,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Tutoriaux Niveau :Débutant Date de création :19/07/2005 Date de mise à jour :19/07/2005 16:29:54 Vu / téléchargé :8 191 / 240

Auteur : garfield90

Ecrire un message privé
Commentaire sur cette source (45)
Ajouter un commentaire et/ou une note

 Description

Ayant marre de voir des sources crades sur Code-sources et ayant l'opportunité de faire un code ces jours ci, je vous propose une manière de coder relativement propre (c'est ce que je pense ;) )


but :
permet de voir l'interet des expressions rationnelles ( ou régulières)
site interessant : http://qwix.media-box.net/index.php/2004/07/26/3-L esExpressionsRegulieresCompatiblesPerlEnPhpPartie1
montre ce qu'est une fonction récursive et comment en faire une
gestion des erreurs en fonction du retour de la fonction
intérêt d'un code bien commenté
le source n'a pas d'interet en lui meme a part de voir les points ennoncé plus haut

inconvénients :
utilisation de l'artillerie lourde pour un script simple

Définition :
fonction récursive :
fonction qui réalise une opération triviale ou dans le cas contraire s'appele elle-même afin de d'obtenir ce cas trivial

Source

  • fichier function/function.php
  • <?php
  • function takeFile( $_dir="" , $allowExtension=array() )
  • {
  • // vérifie que les types des paramètres sont corrects
  • if ( ! is_string( $_dir ) ){
  • return -2 ; // erreur : $_dir n'est pas une chaine de caractere
  • }
  • if ( ! is_array( $allowExtension ) ){
  • return -3 ; // erreur : $allowExtension n'est pas un tableau
  • }
  • // permet de garder les URL des images lors de l'appel récursif
  • global $tabFile;
  • if ( is_dir( $_dir ) ){
  • if ( $dh = opendir( $_dir ) ) {
  • /* définition des variables de travail */
  • // détermine les répertoires à ne pas parcourir ( . et .. sont a proscrire car entraine un boucle infinie )
  • $forbiddenDir = array( ".", ".." );
  • // détermination du pattern permettant de récuperer les fichiers des extensions souhaité
  • if ( count( $allowExtension ) > 0 ){
  • foreach ( $allowExtension as $extension ){
  • if ( ! isset( $listExtension ) ){
  • $listExtension = "(\.".$extension;
  • }else{
  • $listExtension .= "|\.".$extension;
  • }
  • }
  • $listExtension .= ')';
  • }else{
  • $listExtension = '';
  • }
  • // explication sur les patterns des expressions rationnelles
  • // #masque#option
  • // (\w*) suite de 0,n caratère alphanumérique
  • // i en option indique le fait que la recherche est insensible a la casse
  • // | = OU logique
  • $pattern = '#(\w*)'.$listExtension.'$#i';
  • // parcours tous les fichiers et répertoires courants du répertoire $_dir
  • while ( ( $file = readdir( $dh ) ) !== false ) {
  • // nom complet du fichier sinon is_dir ne marche pas (me suis déjà fait avoir)
  • $completeFile = $_dir.'/'.$file;
  • // lance la récursivité si et seulement si le fichier en cours est un dossier autorisé
  • if ( is_dir( $completeFile ) and ! in_array( $file, $forbiddenDir ) ){
  • takeFile($completeFile, $allowExtension);
  • }elseif ( preg_match( $pattern, $file ) ){
  • // ajout du chemin d'accès du fichier à tabFile
  • $tabFile[] = $completeFile;
  • }
  • }
  • closedir( $dh );
  • return count( $tabFile ) - 1;
  • }
  • }else{
  • return -4 ;// erreur : répertoire inexistant
  • }
  • }
  • ?>
  • // fichier de test ( permet d'afficher une image différente toutes les 3 secondes )
  • fichier index.php ( mais peut s'appeler un_nom.php )
  • <?php
  • session_start();
  • // permet le debugging a décommenter
  • // error_reporting( E_ERROR | E_WARNING | E_PARSE | E_NOTICE );
  • // mets un message d'erreur si le fichier n'existe pas + n'inclu qu'une fois le fichier
  • require_once "function/function.php";
  • /* définition des variables utiles au script */
  • // sert simplement à l'exemple : affichage d'une image toutes les 3 secondes
  • if ( ! isset( $_SESSION["i"]) ){
  • $_SESSION["i"] = 1 ;
  • }else{
  • $_SESSION["i"]++;
  • }
  • // détermine le répertoire où se situe le script
  • preg_match( "#/(\w*).php#", $_SERVER["SCRIPT_FILENAME"], $name ); // trouve le nom du script courant
  • $_dir = str_replace( $name[0], '', $_SERVER["SCRIPT_FILENAME"] );
  • // tableau des extensions autorisées
  • $allowExtension = array( "gif", "jpg", "jpeg", "bmp", "png" );
  • // exemple d'utilisation
  • $nb = takeFile( $_dir, $allowExtension);
  • ?>
  • <html>
  • <head>
  • <?php
  • // permet de rafraichir la page toutes les 3 secondes si le repertoire contient des images
  • // gestion des erreurs
  • switch ( $nb )
  • {
  • case -4 :
  • $message = 'répertoire inexistant';
  • break;
  • case -3 :
  • $message = '2nd paramètre incorrect';
  • break;
  • case -2 :
  • $message = '1er parametre incorrect';
  • break;
  • case -1 :
  • $message = 'aucune image dans les répertoires parcourus';
  • break;
  • default :
  • // le modulo ( % ) permet d'avoir une valeur comprise entre 0 et le nombre d'image - 1
  • $i = $_SESSION["i"];
  • $_SESSION["i"] = ( $i % $nb ) ;
  • // permet d'avoir l'adresse distante à la place de l'adresse physique
  • $image = str_replace( $_SERVER["DOCUMENT_ROOT"], "http://".$_SERVER["HTTP_HOST"], $tabFile[$i] );
  • $message = '<img src="'.$image.'" alt="'.$i.'"/><br />';
  • echo '<meta content="3" http-equiv="refresh" />';
  • break;
  • }
  • ?>
  • </head>
  • <body>
  • <?php
  • /* définition des variables utiles au script */
  • echo $message;
  • // permet de vérifier si les résultats sont ceux attendus a décommenter pour vérifier
  • // print_r( $tabFile );
  • ?>
  • </body>
  • </html>
fichier function/function.php

<?php

function takeFile( $_dir="" , $allowExtension=array() )
{

	// vérifie que les types des paramètres sont corrects

	if ( ! is_string( $_dir ) ){
		return -2 ; // erreur : $_dir n'est pas une chaine de caractere
	}

	if ( ! is_array( $allowExtension ) ){
		return -3 ; // erreur : $allowExtension n'est pas un tableau
	}


	// permet de garder les URL des images lors de l'appel récursif
	global $tabFile;

	if ( is_dir( $_dir ) ){
		if ( $dh = opendir( $_dir ) ) {

			/* définition des variables de travail */

			// détermine les répertoires à ne pas parcourir ( . et .. sont a proscrire car entraine un boucle infinie )
			$forbiddenDir = array( ".", ".." );

			// détermination du pattern permettant de récuperer les fichiers des extensions souhaité
			if ( count( $allowExtension ) > 0 ){
				foreach ( $allowExtension as $extension ){
					if ( ! isset( $listExtension ) ){
						$listExtension = "(\.".$extension;
					}else{
						$listExtension .= "|\.".$extension;
					}
				}
				$listExtension .= ')';
			}else{
				$listExtension = '';
			}

			// explication sur les patterns des expressions rationnelles
			//  #masque#option
			// (\w*) suite de 0,n caratère alphanumérique
			// i en option indique le fait que la recherche est insensible a la casse
			// | = OU logique
			$pattern = '#(\w*)'.$listExtension.'$#i';

		        // parcours tous les fichiers et répertoires courants du répertoire $_dir
	                while ( ( $file = readdir( $dh ) ) !== false ) {
                                // nom complet du fichier sinon is_dir ne marche pas (me suis déjà fait avoir)
				$completeFile = $_dir.'/'.$file;

				// lance la récursivité si et seulement si le fichier en cours est un dossier autorisé
				if ( is_dir( $completeFile ) and ! in_array( $file, $forbiddenDir ) ){
					takeFile($completeFile, $allowExtension);
				}elseif ( preg_match( $pattern, $file ) ){
					// ajout du chemin d'accès du fichier à tabFile
					$tabFile[] = $completeFile;
				}
	        }
	        closedir( $dh );
			return count( $tabFile ) - 1;
		}
	}else{
		return -4 ;// erreur : répertoire inexistant
	}
}
?>

// fichier de test ( permet d'afficher une image différente toutes les 3 secondes )
fichier index.php ( mais peut s'appeler un_nom.php )
<?php
session_start();

// permet le debugging a décommenter
// error_reporting( E_ERROR | E_WARNING | E_PARSE | E_NOTICE );

// mets un message d'erreur si le fichier n'existe pas + n'inclu qu'une fois le fichier
require_once "function/function.php";

/* définition des variables utiles au script */
// sert simplement à l'exemple : affichage d'une image toutes les 3 secondes

if ( ! isset( $_SESSION["i"]) ){
	$_SESSION["i"] = 1 ;
}else{
	$_SESSION["i"]++;
}

// détermine le répertoire où se situe le script
preg_match( "#/(\w*).php#", $_SERVER["SCRIPT_FILENAME"], $name ); // trouve le nom du script courant
$_dir = str_replace( $name[0], '', $_SERVER["SCRIPT_FILENAME"] );

// tableau des extensions autorisées
$allowExtension = array( "gif", "jpg", "jpeg", "bmp", "png" );

// exemple d'utilisation
$nb = takeFile( $_dir, $allowExtension);

?>
<html>
	<head>
		<?php
		// permet de rafraichir la page toutes les 3 secondes si le repertoire contient des images
		// gestion des erreurs
		switch ( $nb )
		{
			case -4 :
				$message = 'répertoire inexistant';
				break;
			case -3 :
				$message = '2nd paramètre incorrect';
				break;
			case -2 :
				$message = '1er parametre incorrect';
				break;
			case -1 :
				$message = 'aucune image dans les répertoires parcourus';
				break;
			default :
				// le modulo ( % ) permet d'avoir une valeur comprise entre 0 et le nombre d'image - 1
				$i = $_SESSION["i"];
				$_SESSION["i"] = ( $i % $nb ) ;
				// permet d'avoir l'adresse distante à la place de l'adresse physique
				$image = str_replace( $_SERVER["DOCUMENT_ROOT"], "http://".$_SERVER["HTTP_HOST"], $tabFile[$i] );
				$message = '<img src="'.$image.'" alt="'.$i.'"/><br />';
				echo '<meta content="3" http-equiv="refresh" />';
				break;
		}
		?>
	</head>
	<body>
		<?php

		/* définition des variables utiles au script */

		echo $message;

		// permet de vérifier si les résultats sont ceux attendus a décommenter pour vérifier
		// print_r( $tabFile );
		?>
	</body>
</html>

 Conclusion

Plus de bug connus,
Code fait à l'arrache donc il est surement optimisable
code HTML surement hors norme mais ce n'est pas le but (dès que j'ai 5 minutes je m'y attele)


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

19 juillet 2005 14:27:17 :
19 juillet 2005 modif 1 : gestion correcte des extensions (nom de fichier), echappement du . devant l'extension (.gif|.png) => (\.gif|\.png) modif 2 : si il n'y avait pas d'image le script se raffraichissait quand même (ben, plus maintenant)
19 juillet 2005 16:29:54 :
malalam> correction des espaces autour des appel de fonctions ;) (normalement, j'ai la meme norme partout) rajout du i dans les regex pour rendre "casse insensitive" pour la recherche des fichiers avec extensions

 Sources du même auteur

Source avec Zip GÉNÉRATION DU CODE HTML POUR UN TABLEAU (HÉRITE DE LA CLASSE...
Source avec Zip MOTEUR DE TEMPLATE PHP5

 Sources de la même categorie

Source avec Zip EXEMPLE DE CRÉATION D'UN SCRIPT D'AUTHENTIFICATION par phpAnonyme
Source avec Zip Source avec une capture N/X API: GOOGLE MAPS DEPUIS PHP VALID W3C par GillesWebmaster
PHP EXTRAIRE DES MAILS D'UN GROS FICHIER LOCAL OU DISTANT par cosmoswarezone1
FORMULAIRE PHP + VERIFICATION + ENVOI DU MAIL par cosmoswarezone1
Source avec Zip Source avec une capture CODE BARE!!! par toutoos

Commentaires et avis

Commentaire de malalam le 19/07/2005 13:06:31 administrateur CS

Hello,

si je peux me permettre, tu aurais mieux fait de faire renvoyer $tabFile, au lieu de le mettre global. Ca aurait ete plus logique que de renvoyer le nombre d'entrees qu'il possede.
Ta fonction devrait retourner le tableau contenant les fichiers. Apres, on en fait ce qu'on veut.
Pour les extensions...bah, beaucoup a deja ete dit la-dessus ;-)
Mais tester le type mime de l'image aurait ete plus judicieux a mon sens.
Et L'error_reporting a E_ALL marchait aussi bien ;-) Mais pourquoi pas, ca montre les possibilites.
Sinon c'est rigolo, mais ca fait mal aux yeux lol.

Commentaire de PaDa le 19/07/2005 13:33:42

Yop
Mon faible niveau en php me permet pas de commenter le code dans sa globalité, et je peux pas le tester la où je suis, mais.. à tout hasard t'as pas oublié d'échapper les points lorsque tu définis $listExtension ?
En l'état, ton pattern est le suivant :
#(\w*)(.gif|.jpg|.jpeg|.bmp|.png)$#
Ce qui reconnait bien test.jpg, test.gif mais aussi testgif
(et pas test.GIF d'ailleurs, ptet rajouter un "i" ?)
J'ai peut etre pas saisi tout le détail, donc ca reste une question naive ;)
Bonne continuation

Commentaire de sebmafate le 19/07/2005 13:36:52 administrateur CS

il manque les \ devant les .gif et companie...
#(\w*)(\.gif|\.jpg|\.jpeg|\.bmp|\.png)$#

il faut aussi que l'expression soit insensible à la casse.

Commentaire de Anthomicro le 19/07/2005 13:53:25

Salut,

vu que c'est un formulaire de recherche autant bosser sur les extensions de fichiers, bosser sur le type mime serait ultra gourmand, mais c'est une bonne idée à creuser pour un moteur de recherche aux fonctionnalités poussées ;-)

Commentaire de malalam le 19/07/2005 13:54:58 administrateur CS

Ouais mais il peut essayer d'afficher une image qui n'en est pas une, la.

Commentaire de Anthomicro le 19/07/2005 14:03:42

C'est sûr, mais qui renommerait les extensions des fichiers sur son serveur ?

Commentaire de garfield90 le 19/07/2005 14:09:00

sebmafate, PaDa> merci pour le bug, je corrige ca de suite, j'avais pas fait le test sur le nomext sans le point

malalam > j'ai utilisé la variable globale pour éviter d'avoir un parametre supplémentaire mais ca rend le source encore plus propre donc je vais le prendre en compte
de meme pour le type mime

le script n'est pas sur le test des extensions, c'est juste un source pour faire un code propre pour montrer aux jeunes (comprendre pour l'experience et non l'age) développeurs ce qui faut faire et de montrer des fonctions 'achement utile mais souvent méconnues donc mal exploitées.

Pouvez vous aussi me critiquer (positif et négatif) sur la manière de coder afin que ce code soit plus un exemple de code a faire plutot qu'un script en lui meme

Commentaire de malalam le 19/07/2005 14:50:06 administrateur CS

Ok, lol. Ben j'ai deja donne mon avis sur le retour de la fonction :-)

Si tu veux vraiment etre propre, reste coherent (mais bon je fais pareil lol) :
#  if ( ! is_string($_dir) )
#     {
#         return -2 ; // erreur : $_dir n'est pas une chaine de caractere
#     }
#    
#     if (!is_array($allowExtension) ){  

Les deux if () sont differents quant auy espaces.
Pareil ici :
#  if ( is_dir($_dir) ){
#         if ($dh = opendir($_dir)) {

Et un peu partout en fait.

include "function/function.php";
=> personnellement je prefere require (qui affiche une erreur si la page n'est pas la), et generalement require_once () aui n'inclue la page qu'une seule fois.

Je n'aime pas les switch () mais ca, c'est une question de gouts.

Commentaire de garfield90 le 19/07/2005 14:53:07

malalam> "Ouais mais il peut essayer d'afficher une image qui n'en est pas une, la. "
donc a chaque fois que tu traites un fichier, tu testes si le code mime est bon ;)
la rien ne dit qu'il y ai eu upload avant (pour les paranos, on peut dire aussi import de fichier(s) non mis par l'administrateur), donc t'as une fonction ou une classe qui vérifie tout ca (je vais peut etre m'en faire une, tiens ;))
sur ce je retourne taffer

Commentaire de malalam le 19/07/2005 15:22:10 administrateur CS

Ben en tous cas, sur le seul explorateur que j'ai fait, lol, oui, je teste si un fichier est une image avec de mettre une balise img pour l'afficher. Je teste juste avec getimagesize(), a dire vrai. Pas la peine de faire une classe quand une fonction le fait tres bien toute seule :-) De toutes facons, ca ne prend pas plus de ressource puisque de ttes facons, je veux aussi recuperer la taille de l'image dans mon cas.
Pour les autres fichiers, on s'en fout un peu.

Commentaire de GRenard le 19/07/2005 16:31:41

C'est rare les erreurs négatives. Tu utilises parfois des " ou parfois des '... reste constant. Tes variables n'ont certainement pas toujours les bons types et tu les traitent dans un type différent ($_SESSION["i"]++... c'est un string je crois par défaut et tu le traites en int)
cf mon tutorial sur la bonne programmation
http://www.phpcs.com/code.aspx?id=24870

(Je dis ca parce que t'as marre des sources crades ;))

Je sais pas ce qui vous prend mais vous êtes de plus en plus à utiliser "and" plutôt que "&&" et "or" plutôt que "||". C'est pas interdit, mais ATTENTION à la "Précédence des opérateurs" (http://ca.php.net/manual/fr/language.operators.php). Ces 2 opérateurs logiques n'ont pas du tout la même précédence...

Commentaire de Anthomicro le 19/07/2005 16:47:53

"Je sais pas ce qui vous prend mais vous êtes de plus en plus à utiliser "and" plutôt que "&&" et "or" plutôt que "||""

Peut-être aussi pour une question de goût ? je préfère le OR et AND je trouve ça plus propre :-) et ça ne m'a mais alors absolument jamais posé problème dans mes scripts.

Commentaire de garfield90 le 19/07/2005 16:48:17

GRenard>
le coup du "and" , ca m'a échappé d'habitude j'utilise && .
j'ai lu le lien, pour moi il s'agissait purement et simplement d'alias, je crois que je vais garder mes habitudes ;)

des types en php?
normalement, il doit prendre le type de la valeur passé à l'initialisation donc c'est un entier mais peut etre me trompe je.

les erreurs sont négatives car cela permet de les différenciés et ne pas les confondre avec le nombre de valeurs dans tabFile.
Au fait, en cas est ce rare ?

pour les ' et ", les mauvaises habitudes ont la vie dure et à 4h du mat ( j'étais un peu crevé, excuse bidon ;) )

Je corrige ca un peu plus tard

Comme d'hab, t'as des commentaires pertinents

Commentaire de Anthomicro le 19/07/2005 16:51:54

suffit d'utiliser les parenthèses à la place et ça ne posera pas de problèmes... l'avantage des ||, && et des combinaisons de OR et AND est qu'ils permettent de ne pas utiliser de parenthèses dans certains cas...

Commentaire de malalam le 19/07/2005 17:00:50 administrateur CS

Le probleme de precedence ne se pose que si on utilise || et AND dans la meme condition, en fait.
Les operateurs de comparaisons et operateurs logiques autres sont de toutes facons au-dessus.

Commentaire de Anthomicro le 19/07/2005 17:14:35

En fait on parle de problème mais tout dépend de quel côté on se place ^^

Commentaire de GRenard le 19/07/2005 17:43:17

Si tu utilises des += et des choses du genre la ca va mal aller... (si tu ne mets pas de parenthèses)

Côté $_SESSION, t'es chanceux, il garde les types (test|i:4;) (i signifie integer). Donc ok, il n'y a pas de problème... Mais c'est différent pour les POST et GET qui sont toujours en string...

Si tu retournes des integer positif à la normal, ok alors, j'avais pas scruter le script non plus :P mais normalement, dans ce cas là, on retourne soit -1 ou alors des constantes d'erreur ! (ca je ne l'ai pas écrit dans la bonne prog lol, mais ca se passe plutot avec des classes)

Commentaire de malalam le 19/07/2005 17:45:13 administrateur CS

+= avec un and ou un or ? Dans la meme expression ? J'ai du mal a trouver un exemple (ce serait vrai hein, mais je ne trouve pas d'exemple ou ce soit possible).

Commentaire de Anthomicro le 19/07/2005 17:45:54

"si tu ne mets pas de parenthèses"

On est d'accord, c'est ce que je dis plus haut en plus résumé ;-)

"mais normalement, dans ce cas là, on retourne soit -1 ou alors des constantes d'erreur !"

Idem que la remarque que tu m'avais faite vis à vis des majuscules dans la fonction header, ici je ne trouve pas qu'il y ait de "normalité". Tu peux retourner ce que tu veux dans une fonction, un nombre étant plus rapide à traiter qu'une constante, autant retourner un nombre, qu'il soit négatif ou non, ce n'est qu'un nombre après tout, non ?

Commentaire de Anthomicro le 19/07/2005 17:47:43

"si tu ne mets pas de parenthèses"

On est d'accord, c'est ce que je dis plus haut en plus résumé ;-)

"mais normalement, dans ce cas là, on retourne soit -1 ou alors des constantes d'erreur !"

Idem que la remarque que tu m'avais faite vis à vis des majuscules dans la fonction header, ici je ne trouve pas qu'il y ait de "normalité". Tu peux retourner ce que tu veux dans une fonction, un nombre étant plus rapide à traiter qu'une constante, autant retourner un nombre, qu'il soit négatif ou non, ce n'est qu'un nombre après tout, non ?

Commentaire de GRenard le 19/07/2005 18:06:01

Une constante, c'est plus significatif.

Essaie ca malalam
<?php
$test = 4;

if ($test=5 && $test==5)
echo 'O1';
else
echo 'N1';

echo '<br />';

$test = 4;

if ($test=5 and $test==5)
echo 'O2';
else
echo 'N2';
?>

Commentaire de garfield90 le 19/07/2005 18:08:20

GRenard > le "t'es chanceux", je te trouve assez fort la, un script se teste tout de même avant d'être poster ;)

pour les $_GET et $_POST, j'aurais vu que ca ne marcherai pas donc $_POST['i'] = intval($_POST['i']) + 1 ; // pour etre vraiment sur mais je pense que le intval n'est pas nécessaire ( problème des langages non typé donc de PHP )

je ne vois pas trop l'interet de définir des constantes pour des erreurs sachant que la gestion des  erreurs est spécifique à chaque fonction.

En plus, il existe un 'risque potentiel' ( faible mais existant ) de doublon de constante donc un test pour savoir si elle n'est pas déjà définie donc ta gestion d'erreur ne marche plus ou alors ca devient vite le bordel

Le seul interet ( que je vois ) de l'utilisation de constante pour la gestion des erreurs est la lisibilité donc peut etre que je le mettrai ( ceci étant aussi un but de ce script )

Commentaire de GRenard le 19/07/2005 18:20:31

En php, ils définissent bien des constantes pour les modules... tu n'as qu'à suivre un modèle comme ils font.
Pour ce qui est de intval, tu peux faire ce que tu veux (bin oui c'est du php) mais c'est mal coder si tu ne le mets pas quand il faut le mettre. Parce que normalement tu ne peux pas faire string+int

Commentaire de garfield90 le 19/07/2005 18:29:26

GRenard > Pour ton exemple, je pense voir la différence mais j'ai du mal a en voir l'application ni meme l'interet

perso, je trouve que faire une différence entre les 2 est une abbération ( un ET/OU logique reste un ET/OU logique )

J'ai plus l'impression que c'est une ruse de sioux pour faciliter des opérations ( opaque à mon point de vue )

Cependant, je ne vois pas l'interet d'affecter un variable pour la tester dans la même structure logique.

soit on fait
$test = 4;
...
if ( $test==5)
   echo 'O1';
else
   echo 'N1';
$test = 5;

soit
$test = 4 ;
...
$test = 5;
if ( $test==5)
   echo 'O2';
else
   echo 'N2';

Pour l'instant, le seul interet est le gain d'une ligne de code

Les resultats sont identiques aux tiens


En gros ,
'and' permet de faire une affectation avant un test et '&&' après

Je suis en attente d'une application réelle de cette différence car ce que tu nous montres c'est la différence de résultat

Commentaire de Anthomicro le 19/07/2005 18:37:01

AND et OR ont une priorité de traitement inférieure à && et ||

Commentaire de garfield90 le 19/07/2005 18:38:54

intval : C'est pour ca qu'en premiere intention je l'aurai mis

pour les constantes dans les modules de PHP, je le savais (preuve utilisation de E_ALL etc ) mais de tête, connais tu toutes les constantes qu'il employe, plus les constantes définies dans des packages que tu n'as pas fais, etc.

Pour les constantes, on arretes la ( je l'ai ajouterai pour une question de visibilité dans une version ultérieure, mais pour l'instant je ne suis pas convaincu )

Commentaire de GRenard le 19/07/2005 18:54:29

Bravo garfield, tu as trouvé le code qui en résultait... c'était qu'un pur exemple tout a fait bidon mais qui montre bien qu'il y a une différence entre ces deux opérateurs.

Constante : GARFIELD_FILE_ERROR_FOLDER , si tu retrouves cette constante quelque part, c'est que tu n'es vraiment pas chanceux. Reste non convaincu si tu veux :P s'il y avait juste -1 ok, mais la, il y en a plusieurs... imagine que tu n'aies pas le fichier d'accompagnement ? tk...

Commentaire de garfield90 le 19/07/2005 19:11:07

Si t'as pas le fichier d'accompagnement, tu peux pas executer le code donc je vois pas l'interet de l'utiliser.

de plus, les retours sont commenté, ce qui fait que tu sais a quoi correspond le code retourné

je l'aurais noté comme ca :
GARFIELD_E_FONCTION_NOMERREUR

comme quoi la notation des constantes sont différentes.

Pour la différence ok, mais ma question est ou en est l'interet ?
Si jamais t'as une réponse, je suis preneur

Commentaire de GRenard le 19/07/2005 19:38:46

Il existe différente manière de coder, voilà ma réponse.

Commentaire de malalam le 20/07/2005 10:43:13 administrateur CS

=> GRenard, je n'ai pas remis en doute que ca fonctionnait comme ca, je le sais bien, je demandais juste si tu avais un veritable exemple applique. Parce que ce que tu as fait la, heu...c'est theorique : on ne ferait jamais ca dans un script. C'est stupide. Je te demandais si tu avais un exemple applique, concret, ou on pourrait en effet tomber sur ce probleme lors du developpement d'une vraie application php.
personnellement, je n'ai jamais mis dans une expression une affectation ET un operateur logique. Je ne vois pas d'exemple concret ou ca pourrait arriver.

Commentaire de garfield90 le 20/07/2005 10:51:42

GRenard>
quand je disais :
"Pour la différence ok, mais ma question est ou en est l'interet ?
Si jamais t'as une réponse, je suis preneur"

C'était pour la différence entre le &&/|| et le and/or

Et tout comme malalam, j'attends une utilisation concrete de cette différence

Commentaire de Anthomicro le 20/07/2005 11:06:07

"Je ne vois pas d'exemple concret ou ca pourrait arriver."

Moi non plus mais bon on va attendre la réponse... (qui va bien me faire rire je pense)

Commentaire de Anthomicro le 20/07/2005 11:20:23

ça t'évite de rajouter une ligne dans la condition pour affecter une valeur à ta variable, mais bon c'est peu clair...

Commentaire de garfield90 le 20/07/2005 11:25:50

Anthomicro>
Ouais, je suis ok avec toi. Cependant, je trouve ca pas très propre ( algorithmiquement parlant )
et creer 2 opérateurs rien que pour ca je trouve que c'est de l'artillerie très lourde ;)

Commentaire de malalam le 20/07/2005 12:29:49 administrateur CS

Et puis mettre une affectation dans une condition, comme ca, pour moi ca veut dire ca :

est ce que l'affectation a reussi et est-ce que la variable est egale a x.

Ca ne veut pas dire :

affecte x a cette variable
est ce que cette variable est egale a x.

algorithmiquement parlant, comme le dit Garfield.



if ($data = 5)
renvoie true.

Commentaire de Anthomicro le 20/07/2005 12:42:51

En fait c'est justement là qu'intervient la priorité entre les opérateurs, dans un cas il va d'abord affecter la valeur et ensuite la comparer, dans l'autre il va faire l'inverse ;-)

Commentaire de malalam le 20/07/2005 13:09:38 administrateur CS

Oui mais ca n'a rien a faire, l'affectation, dans un if(). Enfin a mon sens, je ne trouve pas ca logique. En plus dans ce cas mieux vaut utiliser
if (($a=5) === true and $a === 5)
ou
if (($a=5) === true && $a === 5)
parce que si on affecte 0, on est dans le caca...
Donc, on a des parentheses :-) lol.

Commentaire de Anthomicro le 20/07/2005 13:35:19

Oulà je trouve ça hideux mdr...

Perso je n'affecte jamais dans une condition, et j'utilise des parenthèses qui sont plus compréhensible que de changer et mettre des AND avec des && mélangés, d'ailleurs Grenard dit lui-même dans sa source sur la bonne programmation qu'il faut faire ça... Si lui-même n'applique pas ses conseils (sic)

Commentaire de coucou747 le 22/07/2005 14:31:41

quand on doit tester le retour de deux fonction équivalentes (si l'une d'entre elle réussi alors on n'exécute pas le code..)

$retour=fonction...
if ($retour=(autre fonction qui peut renvoyer false) and $false!==$retour)
sera différent de :
if ($retour=(autre fonction qui peut renvoyer false) && $false!==$retour)

on ne peut vraiment utiliser ces lignes de codes que quand on se sert du retour d'une seule des deux fonction...

(l'exemple parait moins bidon ?)

Commentaire de garfield90 le 22/07/2005 14:40:41

salut coucou747, ton script est un peu moins bidon mais je ferai :

fonct() et fonct2() retournant des valeurs booléennes

if ( ( fonct() && fonct2() ) !== false )
{
   //traitement
}

Commentaire de coucou747 le 22/07/2005 14:46:29

pardonnez, lors de mon précédent post, le $ devant false...

dans un sens oui, mais si tu t'interesse en premier lieu au résultat de fonc1 et de fonc2 ...

$retour=fonc1();
echo 'fonc 1 renvoi : "'.$retour.'" ! <br />';
if ($retour=fonc2() && false!==$retour)
echo 'et fonc 2 : '.$retour.'<br />';

Commentaire de Anthomicro le 22/07/2005 20:54:16

Mouais, chacun y voit son utilité, perso ça ne me sert pas (et ça ne me servira pas dans l'immédiat) :-)

Commentaire de malalam le 23/07/2005 12:02:34 administrateur CS

Coucou => effectivement ton exemple est plus clair et plus utile. Dans ce cas oui, ca peut etre utilise, et ca peut etre dangereux. Enfin...sans utilisation de parentheses evidemment (perso je les utilise souvent pour delimiter mes conditions, et savoir, en relecture plusieurs semaines apres, ce que j'ai voulu regrouper et faire exactement).

Commentaire de coucou747 le 23/07/2005 12:55:42

j'ai jamais dit que je préférais une écriture...

Personellement, j'ai toujours fait aec les || et &&...

Commentaire de garfield90 le 08/08/2005 10:36:29

en fait, je pense que l'utilisation la plus courante du or est :

$requete=mysql_db_query("SELECT * FROM membre",$db_base) or die(mysql_error());

ou des trucs dans ce genre la.
On s'est vraiment pris la tete pour pas grand chose, l'utilisation du 'or' se fait principalement dans les affectations avec des ressources (lecture de fichiers, connexion aux bases, ...).

Pour le 'and', je cherche une autre explication rationnelle ( a part, d'avoir la synthaxe or/and et non pas que or, pour l'instant je vois pas ;) )

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,406 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales