Besoin d'aide en PHP

Fermé
Olivier - 3 déc. 2005 à 21:34
 Olivier - 15 déc. 2005 à 13:39
Bonjour,
je voudré utiliser le script PHP qui permet de effectuer une selection aléatoire d'images sans doublon que j'ai trouvé sur un site.
je ne comprend pas tres bien les explications. Pourriez vous m'aider?
Merci d'avance.

Mon souhait est de faire apparaitre 78 images aléatoirement mais masquées de dot de carte dans un tableau de 6 colonnes par 13 lignes afin que le joueur puisse en choisir 13 sans voire ce qu'il choisit.
Mes images sont bien nommées image_no1 et sont dans le bon dossier sur le serveur.

Voici ce que j'ai tapé sur ma page HTML où je souhaite faire apparaitre mes images:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title> Jeu</title>
</head>

<body>
<?php
$lien1="http://www.bigboss.fr/4_jeu/cartespetite/image_no1";
....
....
....
....

$lien78="http://www.bigboss.com/4_jeu/cartespetite/image_no78";



print "<table border=\"0\" width=\"100%\" cellpadding=\"0\">";


if ($i >9)
{
$tirage=0;
while ($tirage < 79)
{
$ok=1;
$tirage++;
srand((double)microtime()*1000000);
$tirage_no = floor(rand(1,count($image)));
$tage[$tirage] = $tirage_no;
for ($v=0; $v<$tirage; $v++)
{
if ($t_no[$v] == $tirage_no)
{
$tirage--;
$ok=0;
}
}
if ($ok == 1)
{
$result[$tirage]=$image[$tirage_no];
}
}
for ($n=1; $n<=78; $n=$n+13)
{
print "<tr>";
for ($j=0; $j<13; $j++)
{
$no=$n+$j;
$url="../cartespetite/image_no".$result[$no].".gif";
if (!file_exists($url))
{
$url="../cartespetite/image_no".$result[$no].".jpg";
}
if (file_exists($url)) {
print "<td align=\"center\"><a href=\"$lien.$result[$no]\" ";
print "target=\"_blank\"><img border=\"0\" src=\"$url\">";
print "</a></td>";
}
else
{
print "<td align=\"center\"> </td>";
}
}
print "</tr>";
}
}
print "</table>";
?>
</body>
</html>
A voir également:

19 réponses

aralicia Messages postés 20 Date d'inscription samedi 3 décembre 2005 Statut Membre Dernière intervention 26 juin 2007 1
3 déc. 2005 à 22:47
bon, je suis assez déconcertée par ton script. En effet, un grand nombre de variables ne sont pas initialisées avant d'être testées.
analyse de ton script(mes messages sont sous forme de commentaires en gras

<?php
$lien1="http://www.bigboss.fr/4_jeu/cartespetite/image_no1";
....
....
....
....

$lien78="http://www.bigboss.com/4_jeu/cartespetite/image_no78";
//déclaration des variables contenant les adresses des images. RAS


print "<table border=\"0\" width=\"100%\" cellpadding=\"0\">";
// affichage de la balise table. !attention: balise print utilisé: existence en php par sûre, preferer echo


if ($i >9)
{
// $i ? variable non définie précédement, utilité du test inconnue
$tirage=0;
while ($tirage < 79)
{
$ok=1;
$tirage++;
srand((double)microtime()*1000000);
//réinistalisation du générateur aléatoir à chaque nouvelle boucle. mauvaise idée car inutile. une seule initalisation suffit en début de script
$tirage_no = floor(rand(1,count($image)));
$tage[$tirage] = $tirage_no;
for ($v=0; $v<$tirage; $v++)
{
if ($t_no[$v] == $tirage_no)
{
// $t_no ? variable non définie précédement, utilité du test inconnue
$tirage--;
$ok=0;
}
}
if ($ok == 1)
{
$result[$tirage]=$image[$tirage_no];
}
}
//fin apparente du choix de l'ordre des images
//début de l'affichage des images
for ($n=1; $n<=78; $n=$n+13)
{
print "<tr>";
for ($j=0; $j<13; $j++)
{
$no=$n+$j;
$url="../cartespetite/image_no".$result[$no].".gif";
if (!file_exists($url))
{
$url="../cartespetite/image_no".$result[$no].".jpg";
}
if (file_exists($url)) {
print "<td align=\"center\"><a href=\"$lien.$result[$no]\" ";
print "target=\"_blank\"><img border=\"0\" src=\"$url\">";
// pourquoi utiliser une adresse ansolue pour le lien et une adresse relative pour l'image? la cible est pourtant la même
print "</a></td>";
}
else
{
print "<td align=\"center\"> </td>";
}
}
print "</tr>";
}
}
print "</table>";
?>
//fin de l'affichage des images. même remarque à propos de print



Comme tu peux le voir, ton script possede quelques erreurs. une autre erreur que je n'ais pas encore mentionné est qu'il est programmé pour afficher 13 lignes et 6 colonnes, contrairement à ce que tu a mis.
Si tu le souhaite, je peux te guider pour corriger toi-même ton script, ou t'en faire un moi-même.
Si tu veux simplement que je te guide, si tu pouvais me donner ton niveau en php, pour que je ne me lance pas dans des trucs trop compliqués.
0
Avant tout, un grand merci à toi aralicia.
Mon niveau en php est debutant.
Je souhaite que tu m'aide a corriger mon script car c'est plus gratifiant . mais merci quand meme pour ta proposition qui est de le créer toi même. Eventuellement si je n'y arrive pas, alors oui peut etre que je te le demanderrai.
Pour l'heure je vais etudier ce que tu m'as mis apres avoir dormis.lol
puis je te renverrai ce que j'ai modifié en y integrant du commentaire.
Encore merci a toi.
0
Pers_firewall > Olivier
4 déc. 2005 à 11:31
bonjour
je cgherche des infos pour exporter ma base de donnees...si tu peux m'aider cela serait sympa..merci
0
Bonjours,
J'ai donc fait quelques modifications suivant tes explications.
Mais je t'avous n'avoir pas plus de resultats.
Voici ce que j'ai fait:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title>La roue de la vie - Jeu</title>


</head>


<body>
<?php
$lien1="http://www.bigboss.fr/4_jeu/cartespetite/image_no1";
.
.
.

$lien78="http://www.bigboss.fr/4_jeu/cartespetite/image_no78";



echo "<table border=\"0\" width=\"100%\" cellpadding=\"0\">";
//J'ai donc remplacé tous les print par echo

$tirage=0;
while ($tirage < 79)
{
$ok=1;
$t_no=0;
//initialisation de la variable $t_no a 0
$tirage++;
srand((double)microtime()*1000000);
//Dois-je le mettre avant le while?
$tirage_no = floor(rand(1,count($image)));
$tage[$tirage] = $tirage_no;
//permet apparement de ne pas tirer deux fois la meme //image
for ($v=0; $v<$tirage; $v++)
{
if ($t_no[$v] == $tirage_no)

{
$tirage--;
$ok=0;
}
}
if ($ok == 1)
{
$result[$tirage]=$image[$tirage_no];
}
}
//Je souhaite effectivement un tableau de 13 lignes et 6 colonnes
for ($n=1; $n<=78; $n=$n+13)
{
echo "<tr>";
for ($j=0; $j<13; $j++)
{
$no=$n+$j;
$url="http://www.bigboss.fr/4_jeu/cartespetite/image_no".$result[$no].".gif";
if (!file_exists($url))
{
$url="http://www.bigboss.fr/4_jeu/cartespetite/image_no".$result[$no].".jpg";
}
if (file_exists($url))
{
echo "<td align=\"center\"><a href=\"$lien.$result[$no]\" ";
echo "target=\"_blank\"><img border=\"0\" src=\"$url\">";
//je ne sais pas ce qu'est une adresse ansolue
echo "</a></td>";
}
else
{
echo "<td align=\"center\"> </td>";
}
}

echo "</tr>";
}
echo "</table>";
?>
</body>
</html>

Voila le resultat sur mon navigateur:

"; $tirage=0; while ($tirage < 79) { $ok=1; $t_no=0; $tirage++; srand((double)microtime()*1000000); $tirage_no = floor(rand(1,count($image))); $tage[$tirage] = $tirage_no; for ($v=0; $v<$tirage; $v++) { if ($t_no[$v] == $tirage_no) { $tirage--; $ok=0; } } if ($ok == 1) { $result[$tirage]=$image[$tirage_no]; } } for ($n=1; $n<=78; $n=$n+13) { echo ""; for ($j=0; $j<13; $j++) { $no=$n+$j; $url="http://www.bigboss.fr/4_jeu/cartespetite/image_no".$result[$no].".gif"; if (!file_exists($url)) { $url="http://www.bigboss.fr/4_jeu/cartespetite/image_no".$result[$no].".jpg"; } if (file_exists($url)) { echo ""; echo ""; } else { echo " "; } } echo ""; } echo ""; ?>
0
Voici le script original sur lequel je me suis appuié:

1/ Préalable :
--------------
Dans le dossier images, il faut que le nom des images aléatoires soient du sytle :

image_no1.gif ou image_no1.jpg
image_no2.jpg ou image_no2.gif
etc...

Définir : soit dans un fichier à part, soit dans une table, soit avec le script
les liens associés aux images. Ce qui donne :

$lien1="https://www.lyad.fr";
$lien2="pageaccueil.php?r=1";
$lien3="../top/index.htm";
etc...

2/ Script :
-----------
*/

$lien1="https://www.lyad.fr";
$lien2="pageaccueil.php?r=1";
$lien3="../top/index.htm";
/*
.
.
.
*/
$lienX="http://...";


print "<table border=\"0\" width=\"100%\" cellpadding=\"0\">";

// s'il y a plus de 9 images
// car si <9 images, il n'y a pas besoin de faire un affichage aléatoire
// la variable $i compte le nombre d'images dans le répertoire images
// ou peut-être donné par un mysql_numrows() si c'est une table qui est utilisé
if ($i > 9)
{
// tirage des 9 images
$tirage=0;
while ($tirage < 10)
{
$ok=1;
$tirage++;
srand((double)microtime()*1000000);
$tirage_no = floor(rand(1,count($image)));
$t_no[$tirage] = $tirage_no;
// verif que 2 même nb ne soit pas tiré
for ($v=0; $v<$tirage; $v++)
{
if ($t_no[$v] == $tirage_no)
{
$tirage--;
$ok=0;
}
}
if ($ok == 1)
{
$result[$tirage]=$image[$tirage_no];
}
}

// affichage du tableau 3x3
for ($n=1; $n<=9; $n=$n+3)
{
print "<tr>";
for ($j=0; $j<3; $j++)
{
$no=$n+$j;
$url="../images/image_no".$result[$no].".gif";
if (!file_exists($url)) // si l'image n'existe pas
{
$url="../images/image_no".$result[$no].".jpg";
}
if (file_exists($url)) // si l'image existe alors on l'affiche
{
print "<td align=\"center\"><a href=\"$lien.$result[$no]\" ";
print "target=\"_blank\"><img border=\"0\" src=\"$url\">";
print "</a></td>";
}
else
{
// sinon on n'affiche rien
print "<td align=\"center\"> </td>";
}
}
print "</tr>";
}
}
print "</table>";
0
aralicia Messages postés 20 Date d'inscription samedi 3 décembre 2005 Statut Membre Dernière intervention 26 juin 2007 1
4 déc. 2005 à 20:50
Alors, j'ai fais des test, et je suis arrivé à une conclusion. Si la seconde partie du script, qui gère l'affichage des images fonctionne, la première non. Et pour cause, le tableau $result qu'elle renvoie est vide!

Ma proposition est donc de garder la partie qui fonctionne et de refaire complètement la partie qui ne marche pas.

Nous conserverions donc:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
<title>La roue de la vie - Jeu</title>


</head>


<body>
<?php

echo "<table border=\"0\" width=\"100%\" cellpadding=\"0\">";

//
//
//script a réécrire
//
//
//
//
//



for ($n=1; $n<=78; $n=$n+13)
{
echo "<tr>";
for ($j=0; $j<13; $j++)
{
$no=$n+$j;
$url="http://www.bigboss.fr/4_jeu/cartespetite/image_no".$result[$no].".gif";
if (!file_exists($url))
{
$url="http://www.bigboss.fr/4_jeu/cartespetite/image_no".$result[$no].".jpg";
}
if (file_exists($url))
{
echo "<td align=\"center\"><a href=\"$url\" ";
echo "target=\"_blank\"><img border=\"0\" src=\"$url\">";
echo "</a></td>";
}
else
{
echo "<td align=\"center\"> pas d'image à afficher </td>";
}
}

echo "</tr>";
}
echo "</table>";
?>
</body>
</html>




tu remarquera également que j'ai supprimé la liste de $lien1... et remplacé son utilisation par $url, qui vaut exactement la même chose dans le cas présent, puisque c'est l'adresse de l'image. La liste de liens n'est utile que si tu fait des liens vers des pages web.

maintenant il va faloir refaire la partie de selection si tu est d'accord. si on peut encore repartir du script de base qu'ils on fournit.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ca marche pour moi.
en ce qui concerne les liens, je souhaite faire apparaitre les13 images que le joueur aurra choisi sur la page html suivante. Dois je donc les garder?
pour la premiere partie j'ai essayé çà mais ça ne marche pas.Et là je suis bloqué.
$tirage=0;
$t_no=0;
srand((double)microtime()*1000000);
while ($tirage < 79)
{
$ok=1;
$tirage++;
$tirage_no = floor(rand(1,count($image)));
$tage[$tirage] = $tirage_no;
for ($v=0; $v<$tirage; $v++)
{
if ($t_no[$v] == $tirage_no)
{
$tirage--;
$ok=0;
}
}
if ($ok == 1)
{
$result[$tirage]=$image[$tirage_no];
}
}
0
help.....
0
aralicia Messages postés 20 Date d'inscription samedi 3 décembre 2005 Statut Membre Dernière intervention 26 juin 2007 1
6 déc. 2005 à 16:48
dsl, j'ai pas eu le temps de répondre avant, mais voiçi un algorithme qui devrai fonctionner, tu n'aura plus qu'a l'ecrire en PHP:

main(){ //code principal

entier liste[78] := {1,2,3,4,5,6, ... ,78} // liste des images possibles
entier taille_liste := 78 // taille de la liste ci-dessus
entier resultat[78] // liste des résultats
entier indice
entier temp

intialisation du générateur
pour indice allant de 1 à 78 avec un pas de 1 // boucle for
temp := nombre aléatoire entre 1 et taille_liste // tirage d'un numéro
resultat[indice] := liste[temp] // choix de l'image correspondant au noméro tiré
fonction décalage()
fin pour
}


fonction décalage(){ //fonction décalant la liste des images encores possibles
entier i
pour i allant de temp à taille_liste avec un pas de 1
liste[i] := liste[i+1]
finpour
taille_liste := taille_liste - 1
}



Cet algo est simple, bonne chance ^^
0
B@|-|@N Messages postés 386 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 7 décembre 2007 62
6 déc. 2005 à 17:10
Salut.
Juste un petit truc, j'ai pas trop le temps pour l'instant, mais je reviendrai ce soir.

Tu initialises ta variable $t_no à 0 puis tu fais appel à elle en tant que tableau. Utilise plutôt comme initialisation :
$t_no = array();

Pour info, la fonction print existe bien en php.

Enfin, je me demande si le file_exists est bien utilisé. Ca marche pas comme les différentes fonctions relatives aux fichiers de php i.e. avec un id fichier ?

A toute à l'heure.

Bahan
0
Bin là je suis largué....
désolé.
0
aralicia Messages postés 20 Date d'inscription samedi 3 décembre 2005 Statut Membre Dernière intervention 26 juin 2007 1
6 déc. 2005 à 22:12
Aïe! Programmeur largué, Projet Arreté... c'est mauvais... bon... tu fais quels études et à quel niveau?
Que je sache ce que je doive dire ou non...
0
je ne compte pas abandonner..
je suis au chomage
je developpe un peux mais c'est plus du sql ou java et je debute.
0
Bon voila ce que j'ai fait avec ce que tu m'as donné mais y encore le random et la fonction decalage que je ne comprend pas. quand a ce que j'ai fait je ne sais absoluement pas si c'est bon ou pas.

main()
{
$liste[78] := {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78};
$taille_liste := 78;
$resultat[78];
$indice;
$temp;
for($indice=0; $indice<79; $indice++)
{
$temp := //là je ne sais pas faire le random
$resultat[$indice] :=$liste[$temp];
fonction decalage()//là je ne connais pas cette fonction
}
fonction decalage()
{
$i;
for($i=$temp; $i<$taille_liste; $i++)
{
$liste[$i]:=$liste[$i+1];
}
$taille_liste := $taille_liste - 1;
}
0
apres quelques recherches voici ce que j'ai rajouté:

function main()
{
$liste[78] = {1,2,3,4,.........,78};
$taille_liste = 78;
$resultat[78];
$indice;
$temp;
for($indice=0; $indice<=78; $indice++)
{
$temp = rand(1,$taille_liste);
$resultat[$indice] =$liste[$temp];
function decalage();
}
function decalage()
{

for($i=$temp; $i<$taille_liste; $i++)
{
$liste[$i]=$liste[$i+1];
}
$taille_liste = $taille_liste - 1;
}
0
B@|-|@N Messages postés 386 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 7 décembre 2007 62
7 déc. 2005 à 17:14
Yo.

Pourrais-tu réexpliquer clairement ce que tu souhaites stp ? Ca m'aiderait à t'aider ^_^.

En fait tu veux faire apparaître des images dans un tableau de façon aléatoire ?

Bahan
0
Je souhaite faire un tableau sur une page html où apparaitré 78 images de carte de jeu dans un ordre aléatoire sans doublons et masquées afin que le joueur en selectionne 13 sans savoir lequelles il choisit. Elles apparaitrées uniquement lors du clic sur celle-ci.
Les 13 cartes choisies serront recuperées sur la page suivante avec leur explication en fonction du signe du zodiac choisi par le joueur auparavant , car il s'agit en fait d'un jeu de tarot divinatoire. Voila...
Merci pour ton aide B@|-|@N.
0
B@|-|@N Messages postés 386 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 7 décembre 2007 62
8 déc. 2005 à 12:04
Bon je regarde ça. Mais je vais avoir besoin de mon Gros Bouquin Php ^_^. Je vais regarder quand je rentrerai chez moi ce soir (désolé de ne pas avoir avancé hier j'ai eu quelques soucis, mais bon là, je regarde c'est promis).

Bahan
0
B@|-|@N Messages postés 386 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 7 décembre 2007 62
9 déc. 2005 à 09:13
Désolé, j'ai des merdes avec ma livebox, je n'arrive pas à accéder au net de chez moi.
Donc je ne pourrais t'aider que dimanche soir, le temps que je trouve ce qui ne va pas.

Bon week end quand même.

Bahan
0
A bon toi aussi......lol
je risque de ne pas etre là lundi mardi et mercredi donc ne t'inquiete pas si je ne repond pas ce n'est pas que j'ai laché l'affaire bien au contraire.
0
de retour
0