PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 31-05-2012 22:08:19

kiwiz
Membre
Inscription : 31-05-2012
Messages : 7

Empêcher la répétition d'un élément tirer aléatoirement

Je sais afficher avec un ordre aléatoire un texte depuis ma base de données , cependant je n'arrive pas à trouver un moyen d’empêcher la répétition d'un même texte.
A travers un systeme de session, le visiteur clique sur suivant et les textes défilent aléatoirement sans se répéter.

<?php
session_start();
$_SESSION['pseudo'];

try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=mysql51-57.perso;dbname=', '', '', $pdo_options);

$reponse = $bdd->query('SELECT * FROM textesaleatoire ORDER BY rand() LIMIT 1,1');
while ($donnees = $reponse->fetch())
{
?>
       

<table width="100%" border="1" class="arrondiombre">
                <tr>
                <td><?php echo $donnees['textes']; ?></td>
                </tr>
</table>
               

<?php
}  
$reponse->closeCursor();
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
?>

Hors ligne

#2 31-05-2012 23:07:53

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Empêcher la répétition d'un élément tirer aléatoirement

Bonsoir,

Quelques remarques si vous me le permettez
1) "$reponse->closeCursor();" est inutile ici
2) Cela vous sert-il d'effectuer un tri aléatoire sur toutes les lignes de votre table pour n'en retourner qu'une seule, pour ensuite refaire la même chose pour en avoir une autre?

Mon avis est non sans compter que c'est justement cette méthode lourde et très coûteuse en termes de ressources qui ne vous garanti pas l'unicité des lignes retournées. Pourquoi? tout simplement parce que la requête qui est éxécutée n'a aucun moyen de savoir si elle doit exclure des lignes dans ses résultats.

Admettons X le nombre de lignes maximum pouvant être consultées (ce nombre ne doit représenter qu'une partie de la totalité des lignes contenues dans votre table), voici ce qu'il serait plus judicieux de faire


-- Ici X=20
SELECT textes FROM textesaleatoires ORDER BY RAND() LIMIT 20;
 

Il vous suffit de charger les 20 lignes retournées en cache PHP et de naviguer dans les textes choisis aléatoirement dans la base de données.

++

Dernière modification par Jc (31-05-2012 23:08:21)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 03-06-2012 23:55:04

kiwiz
Membre
Inscription : 31-05-2012
Messages : 7

Re : Empêcher la répétition d'un élément tirer aléatoirement

Bonsoir, désolé de sollicité ton aide à nouveau,
Aurais tu une idée de ce qui ne vas pas dans mon code?
Les id s'affichent mais finissent par retomber.


<?php
session_start();

try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
 $bdd = new PDO('mysql:host=mysql51-57.perso;dbname=', '', '', $pdo_options);
 $reponse = $bdd->query('SELECT *, id FROM textealeatoire WHERE id != "'.$_SESSION['id'].'" ORDER BY rand() LIMIT 1,1');

if (isset($_SESSION['id'])) {
        $_SESSION['id'] = array();
    }
    while ($donnees = $reponse->fetch()) {
 $_SESSION['id'] = $donnees['id'];
 echo $donnees['id'];
    }
    $reponse->closeCursor();
 }
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
 ?>

Hors ligne

#4 04-06-2012 05:58:19

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Empêcher la répétition d'un élément tirer aléatoirement

Saluton,
Ton code écrase le contenu de $_SESSION['id'] à chaque item de ta boucle while.
Remplace ta ligne 14 par

$_SESSION['id'][] = $donnees['id'];
 

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#5 04-06-2012 06:50:28

jerome76
Membre
Inscription : 22-05-2012
Messages : 7

Re : Empêcher la répétition d'un élément tirer aléatoirement

Bonjour,

8. $reponse = $bdd->query('SELECT *, id FROM textealeatoire WHERE id != "'.$_SESSION['id'].'" ORDER BY rand() LIMIT 1,1');

SELECT *, id

Pas bien !

http://phpdebutant.org/article152.php

Dernière modification par jerome76 (04-06-2012 06:54:28)

Hors ligne

#6 04-06-2012 10:38:17

kiwiz
Membre
Inscription : 31-05-2012
Messages : 7

Re : Empêcher la répétition d'un élément tirer aléatoirement

L'id finit encore par être écrasé, auriez-vous une idée?
Je ne vois même pas ou le problème se situerai.
Merci pour votre aide smile

<?php
session_start();
try
{
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
 $bdd = new PDO('mysql:host=mysql51-57.perso;dbname=', '', '', $pdo_options);
 $reponse = $bdd->query('SELECT id FROM textealeatoire WHERE id != "'.$_SESSION['id'].'" ORDER BY rand() LIMIT 1,1');
 
if (isset($_SESSION['id'])) {
        $_SESSION['id'] = array();
    }
    while ($donnees = $reponse->fetch()) {
 $_SESSION['id'][] = $donnees['id'];
 echo $donnees['id'];
    }
    $reponse->closeCursor();
 }
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
 ?>

Dernière modification par kiwiz (04-06-2012 10:42:12)

Hors ligne

#7 04-06-2012 11:37:56

jerome76
Membre
Inscription : 22-05-2012
Messages : 7

Re : Empêcher la répétition d'un élément tirer aléatoirement

Je me rend compte que je ne connaissais pas le try/catch ainsi que pdo. Va falloir que je me mette à jour...

Sinon je ferai comme ça :


<?php

session_start();

try {

  $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;

  $bdd = new PDO('mysql:host=mysql51-57.perso;dbname=', '', '', $pdo_options);

  $reponse = $bdd->query('SELECT id FROM textealeatoire WHERE id != "'.$_SESSION['id'].'" ORDER BY rand() LIMIT 1,1');

  if (isset($_SESSION['id']))

    $_SESSION['id'] = array();

  $i = 0; //Valeur de la clé

  while ($donnees = $reponse->fetch()) {

    $_SESSION['id'][$i++] = $donnees['id'];

    echo $donnees['id'];

  }
  $reponse->closeCursor();

}

catch(Exception $e) {

  die('Erreur : '.$e->getMessage());
}
?>

 

Hors ligne

#8 04-06-2012 15:17:15

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Empêcher la répétition d'un élément tirer aléatoirement

Bonjour

jerome76 a écrit :

$_SESSION['id'][$i++]=$donnees['id'];

Je doute que cette écriture puisse fonctionner, et quand bien même cela serait le cas, je la déconseille vivement.
La bonne écriture est celle utilisée par MK. Je pense que tu as bien plus à faire pour te mettre à jour jerome;)

@kiwiz
Ensuite il est normal que vos données soient écrasées car vous stockez les ids retournées dans la même  variable que l'id initiale.
Donc si vous voulez préserver la valeur initiale de votre id
il vous faut faire un truc du genre


...
$id=$_SESSION['id'];
$_SESSION['id']=array();
$_SESSION['id'][]=$id;
...
while ... {
 $_SESSION['id'][]=$donnees['id'];
}
 

L'id initial se récupèrera donc dans $_SESSION['id'][0]
Sinon à part cela, je ne vois pas trop l'intérêt d'un tel code.

++

Dernière modification par Jc (04-06-2012 15:19:20)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#9 04-06-2012 18:52:29

kiwiz
Membre
Inscription : 31-05-2012
Messages : 7

Re : Empêcher la répétition d'un élément tirer aléatoirement

L'id apparaît bien mais ne se stock toujours pas. Et l'erreur : " Notice: Array to string conversion in /home/.../.../test.php on line 8 " est apparu

<?php
session_start();
 
try
{
 $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
 $bdd = new PDO('mysql:host=mysql51-57.perso;dbname=', '', '', $pdo_options);
 $reponse = $bdd->query('SELECT id FROM textealeatoire WHERE id NOT IN ("' . implode(',', $_SESSION['id']) . '") ORDER BY rand() LIMIT 1,1');

 
if (!isset($_SESSION['id'])) {
$id=$_SESSION['id'];
$_SESSION['id']=array();
$_SESSION['id'][]=$id;
    }
    while ($donnees = $reponse->fetch()) {
 $_SESSION['id'][] = $donnees['id'];
 echo $donnees['id'];
    }
    $reponse->closeCursor();
 }
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
 ?>

Hors ligne

#10 04-06-2012 22:57:11

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Empêcher la répétition d'un élément tirer aléatoirement

Si à chaque modification vous changez le contexte de traitement on ne va pas s'en sortir.

Initialement que faisait votre routine?
-> 1) On avait l'id de session dans la variable de session $_SESSION['id'] : il n'y a donc aucun tableau c'est comme si vous aviez $id=session_id(); (je mets cela pour préciser le type de la variable).
-> 2) Vous recherchiez toutes les entrées de la table qui ont une id <> de $_SESSION['id']
-> 3) Vous stockiez les ids retournés et différents de $id dans une variable de type array.
-> 4) Vous avez remplacé la valeur initiale votre $_SESSION['id'] par cette nouvelle variable de type array() précédente (c'est pour cela que l'id initial était écrasé).
-> 5) Je vous ai proposé pour ne pas l'ecraser de le rajouter comme première valeur de votre array().

Donc dans tous les cas, au niveau de votre requête, $_SESSION['id'] n'est en aucun cas un tableau, et il est normal d'avoir une erreur en voulant tout d'un coup??? faire un implode dessus.

L'intérêt de tout ceci est du coup encore plus obscur... mais bon.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#11 07-06-2012 15:25:22

kiwiz
Membre
Inscription : 31-05-2012
Messages : 7

Re : Empêcher la répétition d'un élément tirer aléatoirement

La finalité serait de pouvoir afficher a un visiteur des bannières et citations tirés aléatoirement, et qui n'apparaitrait qu'une fois uniquement.
Je le fais avec l'id car c'est plus simple pour comprendre et retenir quand c'est un nombre qui tombe.

Hors ligne

#12 07-06-2012 16:54:04

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Empêcher la répétition d'un élément tirer aléatoirement

Bonjour,

Petite question : "qui n'apparaîtrait qu'une fois" : par visite et pour tout le monde ou qu'une fois par utilisateur identifié?


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#13 08-06-2012 10:04:33

kiwiz
Membre
Inscription : 31-05-2012
Messages : 7

Re : Empêcher la répétition d'un élément tirer aléatoirement

Ça serait pour tous les internautes et à chaque nouvelle visite.
Sans avoir besoin de s'inscrire.
Avec le système de session ça permettrait de réinitialiser à chaque visite.

Hors ligne

#14 08-06-2012 17:04:01

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Empêcher la répétition d'un élément tirer aléatoirement

Bonjour,

Alors la requête

SELECT textes FROM textesaleatoires ORDER BY RAND() LIMIT X; avec X=un nombre adapté, est suffisante pour résoudre votre problème.

Cordialement,

Jc.

Dernière modification par Jc (08-06-2012 17:04:21)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#15 09-06-2012 09:12:46

kiwiz
Membre
Inscription : 31-05-2012
Messages : 7

Re : Empêcher la répétition d'un élément tirer aléatoirement

Merci beaucoup pour toute l'aide apporté, tout marche parfaitement maintenant smile

Hors ligne

Pied de page des forums