Parcourir un tableau MySQL pour des events

Petit nouveau ! | 4 Messages

08 janv. 2012, 15:20

Bonjour à tous,

Je suis tout nouveau sur le forum donc je vous dis déjà Bien le Bonjour à tous :), j'ai un petit problème au niveau du Php et MySQL tout basique ( du moins je crois ) que beaucoup de gens ici seront m'indiquer le bon chemin.

Alors voila j'aimerai faire une page Evènement avec regroupant sur cette page là le dernier évènement en date avec des flèches sur les coté pour pouvoir passer d'une évènement a l'autre. Jusque la ça va pour tester je créer une base de donnée ou je met 5 évènement comme ça. Le problème est pour parcourir cette table. Je sais afficher le dernier évènement en date ça pas de soucis le problème vient que je ne vois pas comment faire pour que quand je clique sur la flèche l'évènement suivant ou précédant d'affiche.

J'ai bien pensé en me disant bah je vais jouer avec l'id de ma table dans le sens ou quand je clique id = id + 1 pour les suivants et id = id - 1 pour les précédents mais je nage un peu dans la semoule car j'ai appris le PHP tout seul donc bon c'est un peu tendus. Je me suis dit aussi en passant des données par l'url donc un truc style ?id=i et i = id = id + 1 donc la ça m'affichait juste un avant ou un après mais après ça se limitait a ça.

Alors voilà, désolé de vous embêter peut-être ce dimanche avec mes problèmes de débutant mais je nage totalement la.

Merci à tous.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 janv. 2012, 15:35

salut,

tu y est presque.
le truc c'est de faire le calcul sur l'id avec mysql et surtout de ne pas faire un +1 car, je suppose que ton id est en "auto increment" et dans ce cas il est possible d'avoir des "trous" entre les id (cas d'une suppression d'un event par exmple).

donc tu passe dans l'url l'id actuel ET le sens (précédent ou suivant).
par exemple le lien sera ?id=412&sens=s ou ?id=412&sens=p

sur ta page d'affichage tu test si $_GET['id'] et $_GET['sens'] existe.
si oui en fonction de sens tu utilise < ou > dans une requete select => select les,champs,qui,vont,bien from tablEvts where id < $_GET['id'] limit 1; (la c'est le cas précédent).

Pour faire bien pense à tester si $_GET['id'] est bien un chiffre => is_numeric
suivant ta méthode de connexion au serveur mysql, utilise mysql_fetch_array ou PDO::quote

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

08 janv. 2012, 17:34

Bonjour moogli,

Tout d'abord merci pour ta réponse rapide et désolé pour la lenteur de la mienne, mais j'ai essayé de faire ce que tu m'as dit et je m'embrouille un peu. Voir totalement, comme je dis je suis totalement débutant dans le PHP et MySQL donc ça vient totalement de moi ^^. J'ai ma table Event avec id, nom, et desc jusque la ok. Ensuite je vais dans mon php je me connecte a ma base de donnée ok ensuite je fais un $reponse = $bdd->query('SELECT * FROM event'); pour aller chercher tous mes champs dans ma table event, ensuite je fais un $event = $reponse->fetch(); pour aller chercher ce qui se trouve dans ma variable $reponse mais je pense que déjà la ça foire :s car il va chercher uniquement le premier de ma table et quand je fais un while pour aller tout chercher je ne sais pas trop quoi faire, dans ma tête et en français c'est clair mais pour le dire en php et mysql je galère pas mal, j'ai essayé via un href de passer l'id dans l'url ça marche quand je met n'importe quoi mais a partir du moment ou je me dit je dois passer l'id 2 pour dire que je veux l'event suivant je suis tout perdu :(

Je sais pas si j'arrive bien à me faire comprendre :s

Merci de ton aide en tous cas.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

09 janv. 2012, 08:15

Prend ton temps répondre c'est pour toi ;)

Alors premiere chose, si tu utilise un while, donc une boucle, c'est pour afficher plusieurs ligne (avec ta requête cela affiche toute la table ;) ).
Pour plus d'infos sur SQL je te conseil http://sqlpro.developpez.com

Si j'ai bien tu souhaite afficher un seul événement (le dernier). Il va donc falloir utiliser un prédicat (une condition "where").

Il faut définir ce dernier événement. (en gros comment tu le sélectionne, en fonction de la date, de son ordre d'entrée etc etc).

Tu n'indique pas de date dans ta table, est ce que c'est un oublie ?
J'en profite pour t'indique que desc est un mot réservé et qu'il est donc préférable de ne pas l'utiliser en nom de champs (tout comme date d'ailleurs ;) ).

En me basant sur une table comme ceci
Create table evts(
id int not null auto_increment primary key,
nom varchar(50) not null,
Description text not null,
DateEvt date not null
)engine=myisam;
Pour l'exemple on affiche l'evennement du jour (bon je considère qu'il n'y en a qu'un mais ce n'est qu'un exemple y a moyen d'en avoir plusieurs bien entendu ;) )
<?php
// je te laisse faire la connexion au sgbd en utilisant pdo
$ret = $bdd->query('select id, nom, description from evts where dateEvt =now() ordre  by dateEvt limit 1');
// le limit permet de n'avoir qu'un seul retour
// affichage
$data = $ret->fetch(PDO::FETCH_OBJETC);
echo 'événement '.$data->nom .'<br/>';
echo '<a href="?id='.$data->id.'&sens=p">événement précédent</a>';
// je te laisse faire pour suivant en fonction de mon 1er message ;)
?>
Le fait de commencer le lien par ? Indique que je reste sur la même page (histoire de pas faire 40 pages pour la même chose).

À partir de la, lorsque l'on clique sur le lien on arrive sur la même page avec deux infos dans l'url que l'on peux utiliser simplement pour faire une nouvelle requête.
qu'elle différencent avec la première requête ?

On. À ajouter une condition dans le prédicat indiquant si le triple à prendre est situé avant ou après celui qui est dans l'url.
<?php
If (isset($_GET['id']) && isset($_GET['sens'])){
// on créer la requête 
If ($_GET['sens'] == 's')
$sql = 'select id, nom, description from evts where id < '.$_GET['id'].' order by dateEvt limit 1';
else
$sql = 'select id, nom, description from evts where dateEvt =now() ordre  by dateEvt limit 1';

// la c'est le même traitement qu'au dessus mais dans le query on met la variable $sql plutôt qu'une chaîne de caractères 
?>
Donc en fonction de ce qu'il y a dans l'url on choisis la requête à effectuer et on affiche le retour toujours de la même manière.

Il te reste à faire :
- le sens "suivant"
- protéger ta requête. (voir pdo::quote dans la doc)
- trouver les bons critères pour afficher le 1er événement comme tu le souhaite
- gèrer la possibilité d'avoir plusieurs événement le même jour (voir le type datetime de mysql)

Amusé toi bien :mrgreen:

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

12 janv. 2012, 13:40

Un Grand merci à toi moogli pour ta réponse complète,

Je testerai tout ça demain et je te tiendrai informé de mon avançée ^^ même si la je pense que j'y arriverai maintenant que ça me parait beaucoup plus clair.

Encore un énorme merci moogli,

:P

Petit nouveau ! | 4 Messages

31 janv. 2012, 19:22

Tout d'abord énorme merci a moogli, qui grâce à lui, j'ai pu apprendre énormement en MySQL, surtout les aux niveaux du $_GET, des données dans les URL, et beaucoup d'autres choses.

Maintenant j'ai réussi a faire ce que je voulais. Sauf qu'au lieu de mettre un sens=p et un sens=a j'ai mis :

$prec = $data['ID'] - 1;
$next = $data['ID'] + 1;
echo '<a href="?ID='.$prec.'">événement précédent</a><br/>';
echo '<a href="?ID='.$next.'">événement suivant</a><br/>';

comme ça bah il prend l'ID et il met direct un plus et un moins dans une variable que j'appel lorsque je veux faire un plus et un moins ^p^.

Encore merci .. :D