[Code impur] - rename et nettoyage...

Eléphant du PHP | 103 Messages

05 févr. 2009, 02:15

Salutations,

Soit le code suivant :
	<?
    $rep = '../pict/photos/';
	$backuprep = '../admin/move/photos/';
	//$rep1 = substr_replace($rep, 0, -1);
    $vig = '../pict/photos/thumbs/';
	$backupvig = '../admin/move/thumbs/';
	//$vig1 = substr_replace($vig, 0, -1);
    $ext = 'jpg';
    $ipl = '4';
    $wid = '120';
    $widtab = '96%';
    $bor = '0';
    $cpd = '0';

  	// $xplodevig = explode('.',$lstvig2);

	$listerep = scanDir($rep);
	$extensionrep = 0;
	foreach ($listerep as $fichrep) {
	
		/*    On ne retient que les fichiers && ceux dont l'extention est jpg ou JPG */
		if (is_file($rep . $fichrep) && preg_match('#[^·]\.jpg$#i', $fichrep)) {
			$extensionrep++;
		}	
	}
	
	$listevig = scanDir($vig);
	$extensionvig = 0;
	foreach ($listevig as $fichvig) {
	
		/*    On ne retient que les fichiers && ceux dont l'extention est jpg ou JPG */
		if (is_file($vig . $fichvig) && preg_match('#[^·]\.jpg$#i', $fichvig)) {
			$extensionvig++;
		}
	}

	$listerepbck = scanDir($backuprep);
	$extensionrepbck = 0;
	foreach ($listerepbck as $fichrepbck) {
	
		/*    On ne retient que les fichiers && ceux dont l'extention est jpg ou JPG */
		if (is_file($backuprep . $fichrepbck) && preg_match('#[^·]\.jpg$#i', $fichrepbck)) {
			$extensionrepbck++;
		}	
	}

	$listevigbck = scanDir($backupvig);
	$extensionvigbck = 0;
	foreach ($listevigbck as $fichvigbck) {
	
		/*    On ne retient que les fichiers && ceux dont l'extention est jpg ou JPG */
		if (is_file($backupvig . $fichvigbck) && preg_match('#[^·]\.jpg$#i', $fichvigbck)) {
			$extensionvigbck++;
		}
	}

	echo '<div align="center">';
	echo '<table width="'.$widtab.'" border="'.$bor.'" cellpadding="'.$cpd.'" cellspacing="'.$csc.'"><tr>';
	echo '<td align="center">Nombre de photos ".jpg" :&nbsp;'.$extensionrep.'</td>';
	echo '<td align="center">Nombre de miniatures ".jpg" :&nbsp;'.$extensionvig.'</td>';
	echo '</tr><tr>';
	echo '<td align="center">Nombre de photos ".jpg" backupées :&nbsp;'.$extensionrepbck.'</td>';
	echo '<td align="center">Nombre de miniatures ".jpg" backupées :&nbsp;'.$extensionvigbck.'</td>';
	echo '</tr></table><br />';
	
    echo '<table width="'.$widtab.'" border="1" cellpadding="'.$cpd.'" cellspacing="'.$csc.'"><tr valign="bottom">';

    $compt=0;
    $dp = opendir($vig);
    while($entree = readdir($dp)){
	if ($entree != "." && $entree != ".." && preg_match('#[^·]\.jpg$#i', $entree)) {
    
    $class = substr($entree, -7, -4);
    $rest = substr($entree, 0, -8);
    
    // Definition de la version haute def. de l'image
    $entree1 = substr_replace($entree, '', 0, 4);
	
	// Debug
	// echo $rep.$entree1.'<br />';
	// echo $backuprep.$entree1.'<br />';
	// echo $vig.$entree.'<br />';
	// echo $backupvig.$entree.'<br />';
	
	// EXIF
	ini_set('exif.encode_unicode', 'UTF-8');
	$exif = @exif_read_data($rep.$entree1, 0, true); // Lecture des metadonnées EXIF, avec non affichage des erreurs
    $date0 = $exif['EXIF']['DateTimeOriginal'];
	$date1 = substr($date0, 0, 10);
	//$date2 = str_replace(":", "/", $date1);
	$date2 = explode(":", $date1);
		
    if(is_file($vig.$entree) && preg_match('#[^·]\.jpg$#i', $fichvig)){
	if($compt%$ipl == 0){ echo '</tr><tr valign="bottom">'; }
    echo '<td align="center">';
    echo "<a href=# onClick=\"window.open('".$rep.$entree1."','_blank','toolbar=0, location=0, directories=0, status=0, scrollbars=1, resizable=1, copyhistory=0, menuBar=0, width=800, height=600');return(false)\">";
    echo '<img border=0 width='.$wid.' src="'.$vig.$entree.'"></a><br /><font size="1">';
	if(!is_file($rep.$entree1) && !preg_match('#[^·]\.jpg$#i', $fichrep)){
		echo '<font color="#990000"><br />La photo<br />'.$entree1.'<br />est introuvable...</font><br /><br />';
	} // rep
	else {
	echo '&nbsp;'.$exif['FILE']['FileName'].'<br /><br />';
	// echo '&nbsp;'.$exif['IFD0']['DateTime'].'<br />';
	echo '- '.$date2[2].'/'.$date2[1].'/'.$date2[0].' -<br />';
	// echo ''.$exif['EXIF']['DateTimeOriginal'].'<br />';
	echo ''.$exif['IFD0']['Model'].'<br />';
	echo 'Ouverture : '.$exif['COMPUTED']['ApertureFNumber'].'<br />';
	echo 'Exposition : '.$exif['EXIF']['ExposureTime'].'<br />';
	echo 'ISO : '.$exif['EXIF']['ISOSpeedRatings'].'<br /><br /><br />';
	// echo '&nbsp;'.$exif['EXIF']['Flash'].'<br />';
	// echo '&nbsp;'.$exif['COMPUTED']['Copyright.Photographer'].'<br />';
	// echo '&nbsp;'.$exif['COMPUTED']['Copyright.Editor'].'<br />';
	// echo '&nbsp;'.$exif['COMPUTED']['Copyright'].'<br />';
	// echo '&nbsp;'.$exif['IFD0']['Copyright'].'<br />';
	} // else rep
	
	echo '<center><form name="form1" method="POST" action=""><input type="checkbox" name="photo[]" value="'.$rep.$entree1.'">Photo&nbsp;<input type="checkbox" name="thumb[]" value="'.$vig.$entree.'">Vign.&nbsp;<br /><input type="submit" name="send" value="Supprimer"></form></center>';
	
	if(isset($_POST['send'])){
	$post1 = (isset($_POST['photo'])) ? $_POST['photo']:null;
	$post2 = (isset($_POST['thumb'])) ? $_POST['thumb']:null;
	// bouclons sur le tableau qui a été transmis et supprimons les valeurs sélectionnées 
	if (!empty($post1)) { 
	   foreach($post1 as $valeur1) {
			@rename($valeur1, $backuprep.$entree1);
			}
	}
	if (!empty($post2)) { 
	   foreach($post2 as $valeur2) {
			@rename($valeur2, $backupvig.$entree);
			}
	}
	}

	echo '</font></td>';
    $compt++;
    
	} // vig
	else {
		echo '<font color="#990000">Vign.&nbsp;'.$vig.$entree.'&nbsp;introuvable</font><br /><br />';
	} // else vig
    }
    }
    
    echo '</tr></table>';
    echo '</div>';
                
    ?>
J'aurais 2 questions :

:arrow: En quoi (et comment/ou) ce code peut il encore être allégé ? (Je bosse dessus depuis 3 jours !!!)
:arrow: La fonction "rename" utilisé dans cette partie du code (et qui est un peu le centre d'interet de cette page) ne semble plus correctement fonctionner (il supprime mais ne déplace plus) :
(...)
echo '<center><form name="form1" method="POST" action=""><input type="checkbox" name="photo[]" value="'.$rep.$entree1.'">Photo&nbsp;<input type="checkbox" name="thumb[]" value="'.$vig.$entree.'">Vign.&nbsp;<br /><input type="submit" name="send" value="Supprimer"></form></center>';
	
	if(isset($_POST['send'])){
	$post1 = (isset($_POST['photo'])) ? $_POST['photo']:null;
	$post2 = (isset($_POST['thumb'])) ? $_POST['thumb']:null;
	// bouclons sur le tableau qui a été transmis et supprimons les valeurs sélectionnées 
	if (!empty($post1)) { 
	   foreach($post1 as $valeur1) {
			@rename($valeur1, $backuprep.$entree1);
			}
	}
	if (!empty($post2)) { 
	   foreach($post2 as $valeur2) {
			@rename($valeur2, $backupvig.$entree);
			}
	}
	}
(...)
Pouvez-vous donc me sauver ? ;-)

A vous lire,

ViPHP
ViPHP | 1136 Messages

05 févr. 2009, 08:52

Salut ....

Apres une première lecture rapide , pour récupérer tes fichiers .jpg , pourquoi n'utilises tu pas la fonction glob() , ce qui t'évitera de devoir parcourir la totalité de tes fichiers apres un scandir() , et de les faire passer dans une expression régulière ..

Le gain de performance sera minime je pense , mais tu vas gagner quelques lignes de codes ...

PS: excellent votre asso WDA :wink:

Eléphant du PHP | 103 Messages

05 févr. 2009, 08:58

Salut ....

Apres une première lecture rapide , pour récupérer tes fichiers .jpg , pourquoi n'utilises tu pas la fonction glob() , ce qui t'évitera de devoir parcourir la totalité de tes fichiers apres un scandir() , et de les faire passer dans une expression régulière ..

Le gain de performance sera minime je pense , mais tu vas gagner quelques lignes de codes ...
(...)
Salutations,

Merci de ton aide.
Pour les scandir() / glob(), je n'ai fais que suivre les conseils de "Ripat", ici même :
:arrow: http://www.phpfrance.com/forums/viewtop ... 985#277985
(...)
PS: excellent votre asso WDA :wink:
Merci, cela fait 13 ans que nous portons le projet à bout de bras... ;)

ViPHP
ViPHP | 1136 Messages

05 févr. 2009, 10:08

Pour tes fonctions rename ,
enléve les "@" qui se trouve devant , afin d'afficher l'erreur , si erreur il y a ..

Ensuite , pour optimiser encore ton code , ( c'est du détail mais bon puisque tu es demandeur ) , dans les boucles foreach() , dans la façon dont tu l'utilises , les tableau son passé par valeur .. autrement dit , ils sont copiés ...

Le principe est d'ajouter le '&' comme ceci
foreach ($tab as &$val) { ... }
Ainsi , ton tableau sera passé par référence , prendra donc bien moins de mémoire .. mais bo n, si c'est des petits tableaux , l'intérêt est encore une fois minime ...


Pour glob() , je ne sais pas .. un test de performance peut peut être répondre à la question ... quelqu'un l'a t'il déjà fait ?


Ensuite , ici :

Ton code :
if(isset($_POST['send'])){
    $post1 = (isset($_POST['photo'])) ? $_POST['photo']:null;
    $post2 = (isset($_POST['thumb'])) ? $_POST['thumb']:null;
    // bouclons sur le tableau qui a été transmis et supprimons les valeurs sélectionnées 
    if (!empty($post1)) { 
       foreach($post1 as $valeur1) {
            @rename($valeur1, $backuprep.$entree1);
            }
    }
    if (!empty($post2)) { 
       foreach($post2 as $valeur2) {
            @rename($valeur2, $backupvig.$entree);
            }
    }
    } 
Perso , je trouve qu'il y a une vérification de trop ... qui ne sert à rien ... celà revient au même de faire ceci :
    if(isset($_POST['send'])){
	    // bouclons sur le tableau qui a été transmis et supprimons les valeurs sélectionnées 
	    if (!empty($_POST['photo'])) { 
	       foreach($_POST['photo'] as $valeur1) {
	            @rename($valeur1, $backuprep.$entree1);
	            }
	    }
	    if (!empty($_POST['thumb'])) { 
	       foreach($_POST['thumb'] as $valeur2) {
	            @rename($valeur2, $backupvig.$entree);
	            }
	    }
    }
Ensuite , s'il ne peut y avoir qu'une image posté par envoie , pourquoi l'avoir mis sous forme de tableau dans le formullaire ...si tu enléves les [ ] apres photo[] et thumb[] , ainsi , le code de renommage se reduit encore ,plus besoin de parcourir un tableau ..

  if(isset($_POST['send'])){
	    // bouclons sur le tableau qui a été transmis et supprimons les valeurs sélectionnées 
	    if (!empty($_POST['photo'])) { 
	        @rename($_POST['photo'], $backuprep.$entree1);
	    }
	    if (!empty($_POST['thumb'])) { 
	            @rename($_POST['thumb'], $backupvig.$entree);
	    }
    }

Voilà .. pour l'erreur de renommage , donne nous ce que retourne la foction rename() , sans le à devant .. ainsi , on saura s'il faut chercher ailleurs ou pas ..

Eléphant du PHP | 103 Messages

06 févr. 2009, 15:33

(...)
Voilà .. pour l'erreur de renommage , donne nous ce que retourne la foction rename() , sans le à devant .. ainsi , on saura s'il faut chercher ailleurs ou pas ..
Bon, j'ai tout suivi à la lettre.

Je viens aussi de virer les "@" devant les "rename" (mis auparavant car sinon, cela répète l'erreur de la dite image dans TOUTES les cellules du tableau).

Avant, cela me disait juste qu'il ne trouvait plus l'image (normal, puisque je venais de la supprimer, et que je ne sais pas comment faire pour lui faire reloader la page apres deplacement de l'image).

Maintenant (avec tes modifs.), cela me met :
Warning: rename() expects parameter 1 to be string, array given in /listing.php5 on line 151

Warning: rename() expects parameter 1 to be string, array given in /listing.php5 on line 154
Les lignes 151 & 154 correspondent aux "rename".

Cela ne supprime plus (ni ne déplace) les photos. En fait, cela ne fait rien. :)
Je rappelle que je veux les déplacer, non les supprimer.

Voici le code tel qu'il est maintenant :
(...)
	<?
    $rep = '../pict/photos/';
	$backuprep = '../admin/move/photos/';
	//$rep1 = substr_replace($rep, 0, -1);
    $vig = '../pict/photos/thumbs/';
	$backupvig = '../admin/move/thumbs/';
	//$vig1 = substr_replace($vig, 0, -1);
    $ext = 'jpg';
    $ipl = '4';
    $wid = '120';
    $widtab = '96%';
    $bor = '0';
    $cpd = '0';

  	// $xplodevig = explode('.',$lstvig2);

	$listerep = scanDir($rep);
	$extensionrep = 0;
	foreach ($listerep as &$fichrep) {
	
		/*    On ne retient que les fichiers && ceux dont l'extention est jpg ou JPG */
		if (is_file($rep . $fichrep) && preg_match('#[^·]\.jpg$#i', $fichrep)) {
			$extensionrep++;
		}	
	}
	
	$listevig = scanDir($vig);
	$extensionvig = 0;
	foreach ($listevig as &$fichvig) {
	
		/*    On ne retient que les fichiers && ceux dont l'extention est jpg ou JPG */
		if (is_file($vig . $fichvig) && preg_match('#[^·]\.jpg$#i', $fichvig)) {
			$extensionvig++;
		}
	}

	$listerepbck = scanDir($backuprep);
	$extensionrepbck = 0;
	foreach ($listerepbck as &$fichrepbck) {
	
		/*    On ne retient que les fichiers && ceux dont l'extention est jpg ou JPG */
		if (is_file($backuprep . $fichrepbck) && preg_match('#[^·]\.jpg$#i', $fichrepbck)) {
			$extensionrepbck++;
		}	
	}

	$listevigbck = scanDir($backupvig);
	$extensionvigbck = 0;
	foreach ($listevigbck as &$fichvigbck) {
	
		/*    On ne retient que les fichiers && ceux dont l'extention est jpg ou JPG */
		if (is_file($backupvig . $fichvigbck) && preg_match('#[^·]\.jpg$#i', $fichvigbck)) {
			$extensionvigbck++;
		}
	}

	echo '<div align="center">';
	echo '<table width="'.$widtab.'" border="'.$bor.'" cellpadding="'.$cpd.'" cellspacing="'.$csc.'"><tr>';
	echo '<td align="center">Nombre de photos ".jpg" :&nbsp;'.$extensionrep.'</td>';
	echo '<td align="center">Nombre de miniatures ".jpg" :&nbsp;'.$extensionvig.'</td>';
	echo '</tr><tr>';
	echo '<td align="center">Nombre de photos ".jpg" backupées :&nbsp;'.$extensionrepbck.'</td>';
	echo '<td align="center">Nombre de miniatures ".jpg" backupées :&nbsp;'.$extensionvigbck.'</td>';
	echo '</tr></table><br />';
	
    echo '<table width="'.$widtab.'" border="1" cellpadding="'.$cpd.'" cellspacing="'.$csc.'"><tr valign="bottom">';

    $compt=0;
    $dp = opendir($vig);
    while($entree = readdir($dp)){
	if ($entree != "." && $entree != ".." && preg_match('#[^·]\.jpg$#i', $entree)) {
    
    $class = substr($entree, -7, -4);
    $rest = substr($entree, 0, -8);
    
    // Definition de la version haute def. de l'image
    $entree1 = substr_replace($entree, '', 0, 4);
	
	// Debug
	// echo $rep.$entree1.'<br />';
	// echo $backuprep.$entree1.'<br />';
	// echo $vig.$entree.'<br />';
	// echo $backupvig.$entree.'<br />';
	
	// EXIF
	ini_set('exif.encode_unicode', 'UTF-8');
	$exif = @exif_read_data($rep.$entree1, 0, true); // Lecture des metadonnées EXIF, avec non affichage des erreurs
    $date0 = $exif['EXIF']['DateTimeOriginal'];
	$date1 = substr($date0, 0, 10);
	//$date2 = str_replace(":", "/", $date1);
	$date2 = explode(":", $date1);
		
    if(is_file($vig.$entree) && preg_match('#[^·]\.jpg$#i', $fichvig)){
	if($compt%$ipl == 0){ echo '</tr><tr valign="bottom">'; }
    echo '<td align="center">';
    echo "<a href=# onClick="window.open('".$rep.$entree1."','_blank','toolbar=0, location=0, directories=0, status=0, scrollbars=1, resizable=1, copyhistory=0, menuBar=0, width=800, height=600');return(false)">";
    echo '<img border=0 width='.$wid.' src="'.$vig.$entree.'"></a><br /><font size="1">';
	if(!is_file($rep.$entree1) && !preg_match('#[^·]\.jpg$#i', $fichrep)){
		echo '<font color="#990000"><br />La photo<br />'.$entree1.'<br />est introuvable...</font><br /><br />';
	} // rep
	else {
	echo '&nbsp;'.$exif['FILE']['FileName'].'<br /><br />';
	// echo '&nbsp;'.$exif['IFD0']['DateTime'].'<br />';
	echo '- '.$date2[2].'/'.$date2[1].'/'.$date2[0].' -<br />';
	// echo ''.$exif['EXIF']['DateTimeOriginal'].'<br />';
	echo ''.$exif['IFD0']['Model'].'<br />';
	echo 'Ouverture : '.$exif['COMPUTED']['ApertureFNumber'].'<br />';
	echo 'Exposition : '.$exif['EXIF']['ExposureTime'].'<br />';
	echo 'ISO : '.$exif['EXIF']['ISOSpeedRatings'].'<br /><br /><br />';
	// echo '&nbsp;'.$exif['EXIF']['Flash'].'<br />';
	// echo '&nbsp;'.$exif['COMPUTED']['Copyright.Photographer'].'<br />';
	// echo '&nbsp;'.$exif['COMPUTED']['Copyright.Editor'].'<br />';
	// echo '&nbsp;'.$exif['COMPUTED']['Copyright'].'<br />';
	// echo '&nbsp;'.$exif['IFD0']['Copyright'].'<br />';
	} // else rep
	
	echo '<center><form name="form1" method="POST" action=""><input type="checkbox" name="photo[]" value="'.$rep.$entree1.'">Photo&nbsp;<input type="checkbox" name="thumb[]" value="'.$vig.$entree.'">Vign.&nbsp;<br /><input type="submit" name="send" value="Supprimer"></form></center>';
	
	// if(isset($_POST['send'])){
	// $post1 = (isset($_POST['photo'])) ? $_POST['photo']:null;
	// $post2 = (isset($_POST['thumb'])) ? $_POST['thumb']:null;
	// bouclons sur le tableau qui a été transmis et supprimons les valeurs sélectionnées 
	// if (!empty($post1)) { 
	//    foreach($post1 as &$valeur1) {
	// 		@rename($valeur1, $backuprep.$entree1);
	// 		}
	// }
	// if (!empty($post2)) { 
	//    foreach($post2 as &$valeur2) {
	// 		@rename($valeur2, $backupvig.$entree);
	// 		}
	// }
	// }
	
	if(isset($_POST['send'])){
        // bouclons sur le tableau qui a été transmis et supprimons les valeurs sélectionnées 
        if (!empty($_POST['photo'])) { 
            rename($_POST['photo'], $backuprep.$entree1);
        }
        if (!empty($_POST['thumb'])) { 
            rename($_POST['thumb'], $backupvig.$entree);
        }
    } 

	echo '</font></td>';
    $compt++;
    
	} // vig
	else {
		echo '<font color="#990000">Vign.&nbsp;'.$vig.$entree.'&nbsp;introuvable</font><br /><br />';
	} // else vig
    }
    }
    
    echo '</tr></table>';
    echo '</div>';
                
    ?>
(...)
Merci encore de ton aide... :)

ViPHP
ViPHP | 1136 Messages

07 févr. 2009, 11:13

Là ca ne va , pas car tu as laissé dans ton formulaire :

photo[] et thumb[]

alors la fonction nous dit bien :
Warning: rename() expects parameter 1 to be string, array given in /listing.php5 on line 151

Traduction (juste pour le fun ):
He Ho , à la fonction rename là .. qu'est-ce tu me donnes comme paramètres .. , c'est une chaine de caractères que je veux , pas un satané tableau .. regardes mieux à la ligne 151 ...
:lol:

C'est normale , car le fait de laisser les [ ] dans ton formulaire , $_POST ['photo'] et $_POST['thumb'] sont des tableaux ...

Eléphant du PHP | 103 Messages

09 févr. 2009, 15:30

(...)
C'est normale , car le fait de laisser les [ ] dans ton formulaire , $_POST ['photo'] et $_POST['thumb'] sont des tableaux ...
Bon, je viens de virer les [] du form.

Les fichiers se suppriment encore au lieu de se déplacer.
J'ai vérifié le CHMOD du dossier de destination, il est en 777.
La page est en PHP5.

Le code est donc maintenant :
(...)	echo '<center><form name="form1" method="POST" action=""><input type="checkbox" name="photo" value="'.$rep.$entree1.'">Photo&nbsp;<input type="checkbox" name="thumb" value="'.$vig.$entree.'">Vign.&nbsp;<br /><input type="submit" name="send" value="Supprimer"></form></center>';
	
(...)
	
	if(isset($_POST['send'])){
        // bouclons sur le tableau qui a été transmis et supprimons les valeurs sélectionnées 
        if (!empty($_POST['photo'])) {
            rename($_POST['photo'], $backuprep.$entree1);
        }
        if (!empty($_POST['thumb'])) {
            rename($_POST['thumb'], $backupvig.$entree);
        }
    }(...)
Snif :(

Any idea ?

Eléphant du PHP | 103 Messages

18 févr. 2009, 23:03

Personne ? :cry:

ViPHP
ViPHP | 1136 Messages

19 févr. 2009, 09:08

Et bien , pour voir ce qu'il se passe exactement ,

Ca serai pas mal , de voir ce que retourne la fonction rename()

TRUE | FALSE ?

genre :
try{

   if( !rename($_POST['thumb'], $backupvig.$entree) ){
        throw new Exception( "Erreur à la fonction rename ! __FILE__ : __LINE__ " );
   }

}catch(Exception $e){
    echo $e->getMessage();
    exit(1);
}
Ou alors vérifier aussi les paramètres que tu lui donnes ...

Par exemple :
var_dump( $_POST['photo'] );
var_dump( $backuprep.$entree1 );