affichage aléatoire d'image

Nathalie2006
Invité n'ayant pas de compte PHPfrance

04 juin 2006, 08:24

Bonjour,

J'ai réussi à afficher une image en background en fonction des jours :

Avec les images renommées : img01.jpg, img02.jpg ....
$jour=date("d"); 
$image="img".$jour.".jpg";
<body background="<?echo $image;?>">

Maintenant, je voudrais faire la même chose MAIS cette fois-ci, je voudrais qu'il affiche de façon aléatoire une image quelconque à partir d'un répertoire appelé "photos" à chaque seconde d'intervalle

Je commence mon code par : $sec=date("s"); et ensuite je suis bloqué !!!

Pouvez-vous m'aider s'il vous plaît à coder, car je suis hyper débutante, merci d'avance pour votre aide forte précieuse.

Nathalie

Mammouth du PHP | 19672 Messages

04 juin 2006, 08:54

Alors proposition : ton système implique que tu as exactement autant d'images qu'il y a de secondes dans une minute, ce qui pose problème si tes images commencent à img01.jpg, il manquerait l'image img00.jpg et donc il te faut 59 images. Si l'appel est sélectionné à la seconde 0, tu n'auras rien d'autre qu'une erreur pour cause de fichier non trouvé.

À la place, je suggère un autre système utilisant la fonction rand() qui va définir un nombre aléatoire, ici pour l'exemple basé sur 50 images de img01.jpg à img50.jpg, ce qui va donner :
<?php
/* On choisit un nombre aléatoire de 1 à "nb_img" (par exemple 50) */
$num = rand(1, 50);
/* Si le nombre est inférieur à 10, on le complète en mettant un zéro initial pour avoir 02 et non 2 */
$num = ($num < 10) ? "0". $num : $num;
/* On construit la chaine */
$image = "img". $num .".jpg";
?>
<body background="<?php echo($image); ?>">
Tu pourrais avoir un code encore plus intéressant en établissant dynamiquement le second paramètre de rand() en comptant au préalable le nombre de fichiers images. Sinon, tel quel, le code t'obligera à modifier les paramètres si tu modifies le nombre d'images stockées.
Il faudrait donc commencer par stocker tes images dans un répertoire spécifique dans lequel tu ne mettras rien d'autre. Ensuite, explore une fonction comme read_dir() pour compter les images. Pour être encore plus générique et ne pas limiter quant au noms des images, stockes les noms de fichiers dans un tableau indexé et établis le rand() sur le nombre de lignes stockées dans ce tableau.

Je ne te mets pas davantage de code, explore un peu et fais des essais : si tu bloques sur la compréhension d'un détail, reviens poser une question :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Nathalie2006
Invité n'ayant pas de compte PHPfrance

04 juin 2006, 10:36

j'ai écrit ce code mais cela semble ne pas marcher sniff snifff

<?php

if ($handle = opendir('photos/')) {

while (false !== ($file = readdir($handle))) {
       if ($file != "." && $file != "..") {
           $monTableau=array();
		   $monTableau[]=$file; 
		   	return($monTableau);
		   $max=count($monTableau);
		   $num = rand(0, $max);
		   $image = $monTableau[$num];
       } 	     
}
}

?>
<body background="<?php echo $image; ?>">


De l'aide s'il vous plaît...

Nathalie

Nathalie2006
Invité n'ayant pas de compte PHPfrance

04 juin 2006, 11:43

Personne ne peut m'aider à corriger mon code précédent s'il vous plaît, car avec ce code,cela ne m'affiche rien du tout...

Votre aide svp, merci

Nathalie

Mammouth du PHP | 19672 Messages

04 juin 2006, 11:46

...mais cela semble ne pas marcher ...
Nathalie, je me doute bien que c'est frustrant de voir un code qui nous coûte en effort intellectuel se vautrer lamentablement sans qu'on sache pourquoi. Mais un code erroné génère habituellement des erreurs qu'il convient d'interpréter pour corriger ce qui ne va pas.

En clair, ton message n'apporte pas les éléments qui permettraient de t'aiguiller vers la réponse : on a pas les messages d'erreur et rien n'indique dans ton message que tu n'en as pas...

En débuggage, il peut être pratique de faire afficher tes variables, ça aide souvent à débloquer rapidement quand on s'aperçoit par exemple que les variables sont vides ou encore que la valeur n'est pas celle attendue.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Nathalie2006
Invité n'ayant pas de compte PHPfrance

04 juin 2006, 12:21

Cyrano,

avec ce code :
<?php 

if ($handle = opendir('photos/')) { 

while (false !== ($file = readdir($handle))) { 
       if ($file != "." && $file != "..") { 
           $monTableau=array(); 
           $monTableau[]=$file; 
               return($monTableau); 
           $max=count($monTableau); 
           $num = rand(0, $max); 
           $image = $monTableau[$num]; 
       }           
} 
} 

?>
il n'affiche aucune message d'erreur ,j'ai juste une page blanche,c'est tout ,alors qu'il est supposé avoir une image en background...

Nathalie

Mammouth du PHP | 19672 Messages

04 juin 2006, 12:30

Oui, mais je t'ai suggéré une méthode pour débugguer qui n'apparaît pas dans ton code. D'autre part, ce code comporte quelques curiosités:
- un return() : que fait-il là ?
- la sélection de ton image à chaque tour de la boucle while alors que le tableau n'est pas forcément complet s'il reste des éléments à parcourir dans le répertoire. Piste de résolution, voici une modification:
<?php
if ($handle = opendir('photos/'))
{
    while (false !== ($file = readdir($handle)))
    {
        if ($file != "." && $file != "..")
        {
            $monTableau = array();
            $monTableau[] = $file;
        }
    }
    /* Débuggage : */
    echo("<pre>\n");
    var_dump($monTableau);
    echo("</pre>\n");
    /* fin débuggage */

    $max   = count($monTableau);
    $num   = rand(0, $max);
    $image = $monTableau[$num];
}
?>
Autre truc de débuggage : quand tu mets un if() quelque part, mets donc un else à la suite avec un message d'erreur personnalisé, ça aide beaucoup aussi parfois.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: