Une boîte noire (php, hasard,... Ajax ?)

Une boîte noire (php, hasard,... Ajax ?) - PHP - Programmation

Marsh Posté le 30-04-2008 à 00:20:30    

Salut à tous !
Avant tout, sachez l'espoir immense que je place en ce message : il faut absolument que je parvienne à boucler ce que j'essaye de faire le plus vite possible (voir ci-dessous)...  
 
Voici l'affaire : je suis en train de monter un site qui ressemble, en gros, à ce qu'on peut trouver à cette adresse : www.caerbannog.fr/chaoscartes.php
Comme vous pouvez le voir, cette page a pour but de faire défiler au hasard des "cartes de visite" comprenant diverses informations : dans cet exemple, nom, prénom, date de naissance (une nouvelle carte surgit lorsqu'on rafraîchit la page). Vous remarquerez aussi qu'en cliquant sur chaque question (écrite en blanc), on est mené vers une nouvelle page, dédiée spécifiquement à faire défiler au hasard soit le nom, soit le prénom, soit la date de naissance.
 
Bon. Depuis longtemps, trop longtemps maintenant, je perds mon temps à essayer de résoudre le cahier des charges suivant :
 
1. Que dans la page chaosprenom.php, par exemple, lorsqu'on clique sur le prénom qui s'affiche, on soit transporté vers la "carte de visite" complète correspondant à ce prénom (idem pour le nom, etc) ;
 
2. Que dans la page principale, ici chaoscartes.php, je puisse créer des "passerelles" entre les cartes elles-mêmes : par exemple, en cliquant sur le prénom "Maurice", je sois mené vers une autre carte où le prénom serait "Maurice".
 
3. Et que tout ça soit possible SANS QUE L'URL EN SOIT MODIFIÉE : en effet, le concept repose sur l'idée d'une "boîte noire", à l'intérieur de laquelle on naviguerait sans points de repère ; je ne veux donc pas de solution qui me mette un point d'interrogation après le .php et tout le reste.
 
 
CODE UTILISÉ POUR GÉNÉRER LE HASARD :

Code :
  1. $connection = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Unable to connect to MySQL server." . mysql_error());
  2. $db = mysql_select_db($dbname, $connection) or die ("Unable to select database: " . mysql_error());
  3. $randtable = "test";
  4. $xvals = "off";
  5. $xarr = array("1", "2", "3" );
  6. $idvar = "id";
  7. $randsql_result = mysql_query("SELECT * FROM $randtable",$connection) or die ('Database Query Failed.');
  8.   if(mysql_num_rows($randsql_result) == 0) {
  9.   print "There are no entries in the database!"; exit; }
  10.   $i = 0;
  11.   while($row = mysql_fetch_row($randsql_result)) {
  12.   if($xvals == "on" ) {
  13.   if(!in_array("$row[0]", $xarr) && $row[0] != "" ) {
  14.   $rand[$i] = $row[0];
  15.   $i++;
  16.   }
  17.   } elseif($row[0] != "" ) {
  18.   $rand[$i] = $row[0];
  19.   $i++;
  20.   }
  21.   }
  22.   mysql_free_result($randsql_result);
  23.   if(count($rand) == "0" ) { print "There are no entries in the array!"; exit; }
  24.   $randnum = array_rand($rand);
  25.   $rst = mysql_query("SELECT * FROM $randtable WHERE $idvar = '$rand[$randnum]' LIMIT 1", $connection) or die('Could not retrieve random entry from databse');
  26.   $q = mysql_fetch_array($rst);
  27. echo $q [..........]


 
 
SOLUTIONS QU'ON M'A PROPOSÉES :
- quelqu'un m'a suggéré de passer par des sessions, qui me permettraient de stocker des ID, et tout ce genre de choses. Je n'ai jamais utilisé ça, donc je ne comprends pas bien si ce serait approprié, et si c'est le cas, comment le mettre en place.
- sinon, on a aussi fait allusion à l'utilisation de code Ajax, mais idem, je ne m'y connais pas, et malgré tous les tutoriaux que j'ai parcourus en ligne je ne me sens pas beaucoup plus éclairé...
 
 
Bref : À L'AIDE ! :D  
 
Merci d'avance.

Reply

Marsh Posté le 30-04-2008 à 00:20:30   

Reply

Marsh Posté le 30-04-2008 à 00:45:04    

avec les sessions, l'idée serait par exemple d'avoir  
 
dans chaosprenom : $_SESSION['page'] = 'prenom'
dans chaoscarte : $_SESSION['page'] = 'carte'
 
les liens de chaque page pointent vers la même page où tu traites suivant la valeur de $_SESSION['page'] (qui est conservée de page en page pourvu qu'il y ait un session_start) :
 

Code :
  1. if($_SESSION['page'] == 'prenom')
  2. {
  3.    afficher_carte_de_visite();
  4. }
  5. else
  6. {
  7.    afficher_meme_prenom();
  8. }


 


---------------
oui oui
Reply

Marsh Posté le 30-04-2008 à 13:30:44    

Merci pour ta réponse.
 
... J'essaye de piger, mais j'ai encore du mal. Tu connaîtrais pas un tutoriel quelque part qui puisse m'éclaircir un peu les idées sur les sessions dans ce genre de cas ?

Reply

Marsh Posté le 30-04-2008 à 14:48:07    

tu mets

Code :
  1. <?php session_start();

au début de tes pages (avant tout autre chose - il ne faut pas même un espace avant ton <?php)

 

Ensuite chaque fois que tu écris une variable comme $_SESSION['nom_de_la_variable'], tu pourras la retrouver sur une autre page commençant elle aussi par session_start();

 

Donc dans tes pages "chaos", tu déclares une variable de session avec un certain nom et une certaine valeur (dans mon exemple : $_SESSION['page'] = quelque chose).

 

Et dans la page "boite noire", tu peux récupérer ces variables (en mettant session_start() au début).
En fonction de la valeur de cette variable, tu sauras dans quel type de page chaos elle a été déclarée et tu pourras agir en fonction (voir le if/else de mon post)


Message édité par art_dupond le 30-04-2008 à 14:48:26

---------------
oui oui
Reply

Marsh Posté le 02-05-2008 à 11:01:36    

Sinon en transmettant les variables avec $_POST plutôt que des $_GET, le problème des url est également reglé.

Reply

Marsh Posté le 10-05-2008 à 18:26:09    

Merci pour votre aide, j'espère que vous êtes toujours là ! Je m'arrache les cheveux avec ce truc.
Je crois que je commence à comprendre le fonctionnement des sessions, mais ma totale inaptitude en matière de coding me demande des efforts qui mobilisent beaucoup de temps cérébral, les processeurs sont sur le point de fondre.
Mais je tiens le coup :sweat:  
 
Donc pour cette histoire de sessions, quelqu'un d'autre m'a conseillé la méthode ci-dessous :
 

Citation :

Alors .. tu pourrais utiliser les sessions. Dès qu'un visiteur vient sur ta page tu en crées une.
Tu génères tes cartes au hasard et tu stockes l'ID de la dernière carte que tu as affiché (valeur de $rand[$randnum]) dans la session.
Dans tes URLs, au lieu de mettre les ID (et donc garder une trace des cartes), tu ajoutes un lien pour la consultation d'une carte. Ce lien
est le même que celui qui récupère une carte au hasard avec une variable supplémentaire "o" qui vaut "1".
Exemple : <a href="...../browse.php">carte suivante</a> et <a href="...../browse.php?o=1">consulter cette carte</a>
 
Puis de modifier ton code (cf. code en rouge).
 
 
 
$connection = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Unable to connect to MySQL server." . mysql_error());  
$db = mysql_select_db($dbname, $connection) or die ("Unable to select database: " . mysql_error());  
$randtable = "test";
$xvals = "off";
$xarr = array("1", "2", "3" );
$idvar = "id";
 
$idVal = "";  
$openCard = isset($_GET["o"]) && $_GET["o"] == "1";  
 if ($openCard) {
    if (isset(_$SESSION['lastCardID']) {
       $idVal = $_SESSION['lastCardID'];
    }
  }
 
if ($idVal != "" ) {

 
$randsql_result = mysql_query("SELECT * FROM $randtable",$connection) or die ('Database Query Failed.');
   if(mysql_num_rows($randsql_result) == 0) {
   print "There are no entries in the database!"; exit; }
 
   $i = 0;
   while($row = mysql_fetch_row($randsql_result)) {  
   if($xvals == "on" ) {
   if(!in_array("$row[0]", $xarr) && $row[0] != "" ) {
   $rand[$i] = $row[0];
   $i++;
   }
   } elseif($row[0] != "" ) {
   $rand[$i] = $row[0];
   $i++;
   }
   }
   mysql_free_result($randsql_result);
   
   if(count($rand) == "0" ) { print "There are no entries in the array!"; exit; }
   $randnum = array_rand($rand);
} else {
   $idVal = $rand[$randnum];
   $_SESSION['lastCardID'] = $idVal; // ici on garde la trace de la dernière carte mais dans la session ...
}

 
   
   $rst = mysql_query("SELECT * FROM $randtable WHERE $idvar = '$idVal' LIMIT 1", $connection) or die('Could not retrieve random entry from databse');
   $q = mysql_fetch_array($rst);
 
echo $q [..........]


 
Seulement quand je fais ces modifs (sachant que j'ai bien mis un session_start au début), j'obtiens... ça ! Pourtant ça n'a pas l'air d'être un problème d'accolade, quelqu'un comprend quelque chose ?
 
Merci d'avance -
Dorian

Reply

Marsh Posté le 10-05-2008 à 19:20:31    

Pour sélectionner une entrée au hasard dans ta table, tu peux plus simplement faire  
 

Code :
  1. SELECT * FROM $randtable ORDER BY RAND() LIMIT 1;


 
 
sinon faudrait que tu postes ton code pour l'erreur ;)
 
 
ps: si tu n'utilises pas les sessions, ça ne sert à rien de mettre session_start(). Et du coup, il y a un paramètre dans ton url, ce que tu ne voulais pas à la base


---------------
oui oui
Reply

Marsh Posté le 10-05-2008 à 19:29:58    

Je crois que je vais continuer d'essayer avec les sessions, en fait :)
ça a l'air d'être la solution la plus simple - en tous cas pour l'objectif n°1 ; je vois pas encore comment je peux les utiliser pour le n°2...
 
Voici le code en déshabillé intégral (ou presque) :
 

Code :
  1. <?php
  2. session_start();
  3. ?>
  4. <html>
  5. <head>
  6. <title>Chaos</title>
  7. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  8. </head>
  9. <style type="text/css">
  10. body { font-family: "Courier New", Courier, mono; width:900px; height:540px; }
  11. .questions { background-color:black; color:white; text-align:left; font-size:12px; line-height: 1; }
  12. .nimportequoi { background-color:black; color:#ffff98; text-align:left; font-size:12px; line-height: 1; }
  13. </style>
  14. <body bgcolor="#000000" link="black" vlink="black" alink="black">
  15.  <a title="?!" href="javascript:history.go(0)" target="_top"><img src="Caerbannog/images/you.gif" alt="" height="75" border="0"></a>
  16.  <?php
  17.  $dbhost = "********";
  18.  $dbname = "********";
  19.  $dbuser = "*********";
  20.  $dbpass = "*********";
  21.  $connection = mysql_connect($dbhost, $dbuser, $dbpass) or die ("Unable to connect to MySQL server." . mysql_error());
  22.  $db = mysql_select_db($dbname, $connection) or die ("Unable to select database: " . mysql_error());
  23.  $randtable = "test";
  24.  $xvals = "off";
  25.  $xarr = array("1", "2", "3", "4", "5", "6", "7", "38" );
  26.  $idvar = "id";
  27.  $idVal = "";
  28.  $openCard = isset($_GET["o"]) && $_GET["o"] == "1";
  29.  if ($openCard) {
  30.   if (isset($_SESSION['lastCardID']) {
  31.    $idVal = $_SESSION['lastCardID'];
  32.   }
  33.  if ($idVal != "" ) {
  34.    $randsql_result = mysql_query("SELECT * FROM $randtable",$connection) or die ('Database Query Failed.  Please check the $randtable variable under Further MySQL Info, and make sure you have the correct table name.');
  35.   if(mysql_num_rows($randsql_result) == 0) {
  36.   print "There are no entries in the database!<br>Please insert entries so a random one can be picked!"; exit; }
  37.   $i = 0;
  38.   while($row = mysql_fetch_row($randsql_result)) {
  39.   if($xvals == "on" ) {
  40.   if(!in_array("$row[0]", $xarr) && $row[0] != "" ) {
  41.   $rand[$i] = $row[0];
  42.   $i++;
  43.   }
  44.   } elseif($row[0] != "" ) {
  45.   $rand[$i] = $row[0];
  46.   $i++;
  47.   }
  48.   }
  49.   mysql_free_result($randsql_result);
  50.   if(count($rand) == "0" ) { print "There are no entries in the array!"; exit; }
  51.   $randnum = array_rand($rand);
  52. } else {
  53.  $idVal = $rand[$randnum];
  54.  $_SESSION['lastCardID'] = $idVal;
  55. }
  56.   $rst = mysql_query("SELECT * FROM $randtable WHERE $idvar = '$idVal' LIMIT 1", $connection) or die('Could not retrieve random entry from databse.  Please check the $idvar variable under IMPORTANT TABLE INFO to make sure the id field is correct');
  57.   $q = mysql_fetch_array($rst);
  58. ?>
  59.  
  60.  <div id="Layer1" style=' color: black; font-size: 12px; font-family: "Courier New", Courier, mono; visibility: visible; display: block; position: absolute; z-index: 1; top: 95px; left: 505px; width: 457px; height: 416px;'>
  61.  <?php
  62.   if (($q[id] == "1" ) || ($q[id] == "2" ) || ($q[id] == "3" ) || ($q[id] == "4" ) || ($q[id] == "5" ) || ($q[id] == "6" ) || ($q[id] == "7" ) || ($q[id] == "38" )  || ($q[id] == "41" ) || ($q[id] == "42" )) {
  63.  print "<a href=\"chaosnom.php\"><p class=\"questions\">- Nom ?<p></a><p class=\"nimportequoi\">- $q[nom]<br><br><p>";
  64.  print "<a href=\"chaosprenom.php\"><p class=\"questions\">- Prénom ?<p></a><p class=\"nimportequoi\">- $q[prenom]<br><br><p>";
  65.  print "<a href=\"chaosnaiss.php\"><p class=\"questions\">- Date de naissance ?<p></a><p class=\"nimportequoi\">- $q[naissance]<br><br><p>";
  66.  }
  67. ?>
  68. <p>  </div>
  69. <p>
  70. <p>
  71. </body>
  72. </html>

Reply

Marsh Posté le 10-05-2008 à 20:12:48    

je crois qu'il manque une } à la ligne 49


---------------
oui oui
Reply

Marsh Posté le 10-05-2008 à 20:19:37    

Nope, ça ne doit pas être ça : modifié, aucun changement.
Détail révélateur (?) : mon logiciel de coding bipe quand j'insère cette accolade, justement...
 
Ne serait-ce pas plutôt une autre erreur ailleurs, qui se transfère sur l'accolade ?

Reply

Marsh Posté le 10-05-2008 à 20:19:37   

Reply

Marsh Posté le 10-05-2008 à 20:55:48    

en tout cas pas le même nombre de { (14) que de } (13)


Message édité par art_dupond le 10-05-2008 à 20:56:02

---------------
oui oui
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed