Vous n'êtes pas identifié(e).
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.
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
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
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
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.
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
Saluton,
Ton code écrase le contenu de $_SESSION['id'] à chaque item de ta boucle while.
Remplace ta ligne 14 par
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
Bonjour,
SELECT *, id
Pas bien !
http://phpdebutant.org/article152.php
Dernière modification par jerome76 (04-06-2012 06:54:28)
Hors ligne
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
Dernière modification par kiwiz (04-06-2012 10:42:12)
Hors ligne
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 :
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
Bonjour
$_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
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
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
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
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
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
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
Ç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
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
Merci beaucoup pour toute l'aide apporté, tout marche parfaitement maintenant
Hors ligne