IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Afficher prochain enregistrement


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 54
    Points : 18
    Points
    18
    Par défaut Afficher prochain enregistrement
    Bonjour,

    Je viens vous demander conseil car j'ai un souci avec mon code.
    J'ai des donnée dans ma base classée par date, ce que je veux c'est que par rapport à la date du jour, ca m'affiche l'évenement d'après.
    J'ai plus aou moins réussi mais voilà que je peux pas associé ORDER BY ASC avec LIMIT par contre avec desc pas de souci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
          <?php 
    $str_articles_nf = "SELECT dateArticles_nf,idArticles_nf,Heure,titreArticles_nf,TypeMatch,Lieu,DATE_FORMAT(dateArticles_nf, '%d-%m-%Y') as datefr FROM articles_nf ORDER BY dateArticles_nf limit 1";
                            echo "<table width='100%' heigth='100%' border='0' cellspacing='0' cellpadding='0'>";
    					$result_articles_nf =mysql_query ($str_articles_nf);
    					while ($articles_nf =mysql_fetch_object($result_articles_nf))
    					{
    						$today=time ();
    						$dateMatch="$articles_nf->dateArticles_nf";
    						$dateM=strtotime($dateMatch);
    				if ($today <= $dateM){
     
    						echo "<tr align='center'>";
    						echo "<td class='servette'>".$articles_nf->datefr."&nbsp;,".$articles_nf->Heure."<br>".$articles_nf->titreArticles_nf."<br>".$articles_nf->TypeMatch."<br>".$articles_nf->Lieu."<br><br></td></tr>";}
     
    					}
    					echo "</table>"; ?>
    Je sais que c'est tirer par les cheveux mais pourrais je dans ce cas limiter a un affichage autrement que par la condition LIMIT?
    J'ai pensé a WHERE avec beetwen mais je vois pas comment placé la date du jour dedans.
    Merci d'avance pour votre aide.

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2010
    Messages
    77
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2010
    Messages : 77
    Points : 92
    Points
    92
    Par défaut
    Ben tu enleve ton limit et dans ton parcours des resultats tu traite que le premier enregistrement !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
         <?php 
    $nbr_a_afficher = 0;
    $str_articles_nf = "SELECT dateArticles_nf,idArticles_nf,Heure,titreArticles_nf,TypeMatch,Lieu,DATE_FORMAT(dateArticles_nf, '%d-%m-%Y') as datefr FROM articles_nf ORDER BY dateArticles_nf ";
                            echo "<table width='100%' heigth='100%' border='0' cellspacing='0' cellpadding='0'>";
    					$result_articles_nf =mysql_query ($str_articles_nf);
    					while ($articles_nf =mysql_fetch_object($result_articles_nf))
    					{
    if($nbre_a_afficher==1)break;
    $nbre_a_afficher++;
    						$today=time ();
    						$dateMatch="$articles_nf->dateArticles_nf";
    						$dateM=strtotime($dateMatch);
    				if ($today <= $dateM){
     
    						echo "<tr align='center'>";
    						echo "<td class='servette'>".$articles_nf->datefr."&nbsp;,".$articles_nf->Heure."<br>".$articles_nf->titreArticles_nf."<br>".$articles_nf->TypeMatch."<br>".$articles_nf->Lieu."<br><br></td></tr>";}
     
    					}
    					echo "</table>"; ?>

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 97
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par fredd_75 Voir le message
    Ben tu enleve ton limit et dans ton parcours des resultats tu traite que le premier enregistrement !!!
    Non, non, non !!! C'est absolument contre performant de récupérer tout le contenu d'une table pour n'utiliser qu'une ligne.
    Si dans une table j'ai un million de tuples, il me parait assez invraisemblable de récupérer la totalité pour n'en exploiter qu'une ligne.

    @sfc2000: l'énoncé de ton problème est assez flou, mais je vais essayer de comprendre...

    1/ Dans ta requête, tu n'as pas de clause WHERE qui limite le nombre de résultat.
    Si tu veux uniquement les articles dont dateArticles_nf est inférieur à la date du jour, tu peux déjà mettre un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $str_articles_nf = "SELECT
    	dateArticles_nf,
    	idArticles_nf,
    	Heure,
    	titreArticles_nf,
    	TypeMatch,
    	Lieu,
    	DATE_FORMAT(dateArticles_nf, '%d-%m-%Y') as datefr
    FROM articles_nf
    WHERE dateArticles_nf <= ".date("d/m/Y",time())."
    ORDER BY dateArticles_nf DESC
    LIMIT 1"
    2/ ASC et DESC fonctionnent tous les deux avec LIMIT
    cf : http://dev.mysql.com/doc/refman/5.1/en/select.html

    Si tu développe un peu plus les points qui te bloquent et que tu donnes un/des exemple(s), ça pourrait aider à comprendre et à mieux répondre.
    Mon tit blog: blog.uliniux.org
    Dans la vie, on peut faire autre chose que travailler: Suivez le guide

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    merci pour votre réponse.

    Oui asc ou desc fonctionne avec limit mais il doit y avoir quelque chose qui coince dans mon script car ca ne marche pas.

    J'ai essayé votre code, il m'affiche uniquement la date vierge au format US.

    Y aurait il un problème avec ma transformation de date? serais ce ca qui bloque tout?

    Ce que je cherche a faire, ex :

    Il y a eu un match de foot hier, dans mon calendrier il y en a 1 demain puis un autre dans 10 jours.

    Sur ma page d'accueil doit s afficher le match de demain et pas celui de hier ni celui dans 10 jours.
    Et comme je suis feignant je voudrais que ca se fasse automatiquement.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Pas d'idée

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 97
    Points : 119
    Points
    119
    Par défaut
    Peux-tu nous remonter les erreurs que tu rencontres.
    Mon tit blog: blog.uliniux.org
    Dans la vie, on peut faire autre chose que travailler: Suivez le guide

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     <?php 
    $str_articles_nf = "SELECT dateArticles_nf,idArticles_nf,Heure,titreArticles_nf,TypeMatch,Lieu,DATE_FORMAT(dateArticles_nf, '%d-%m-%Y') as datefr FROM articles_nf ORDER BY dateArticles_nf ASC limit 1";
                            echo "<table width='100%' heigth='100%' border='0' cellspacing='0' cellpadding='0'>";
    					$result_articles_nf =mysql_query ($str_articles_nf);
    					while ($articles_nf =mysql_fetch_object($result_articles_nf))
    					{
    						$today=time ();
    						$dateMatch="$articles_nf->dateArticles_nf";
    						$dateM=strtotime($dateMatch);
    				if ($today <= $dateM){
     
    						echo "<tr align='center'>";
    						echo "<td class='servette'>".$articles_nf->datefr."&nbsp;,".$articles_nf->Heure."<br>".$articles_nf->titreArticles_nf."<br>".$articles_nf->TypeMatch."<br>".$articles_nf->Lieu."<br><br></td></tr>";}
     
    					}
    					echo "</table>"; ?>
    Voilà avec se code, ca me n'affiche rien mais si je remplace le ASC par DESC j'ai mon dernier enregistrement qui se marque. En fait si je marque ASC sans le LIMIT c'est bon (mais ca m'affiche tous les enregistrement après la date du jour) mais dès que je mets ASC avec LIMIT, j'ai plus rien.
    Le problème c'est que je veux l'enregistrement qui est après la date actuelle.
    J'ai donc récupérer la date du jour puis la date de mes enregistrement dans ma base et utiliser un if.

  8. #8
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Dans ta requête initiale, est ce que tu as essayé de spécifier le ASC explicitement? Normalement, on n'a pas besoin de le dire, mais dans ce cas, c'est peut-être ce qui fait tout planter parce qu'il croit que la clause du order by est "limit 1". Donc, en bout de ligne, on obtient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $str_articles_nf = "SELECT dateArticles_nf,idArticles_nf,Heure,titreArticles_nf,TypeMatch,Lieu,DATE_FORMAT(dateArticles_nf, '%d-%m-%Y') as datefr FROM articles_nf ORDER BY dateArticles_nf ASC limit 1";

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Non ca me marque rien non plus j'y avais pensé mais sans résultat.

    Et est ce que je pourrais utiliser un 2ème if ?
    Pour faire, si la date du jour est plus petit que la date de l'enregistrement et la date du jour +5 jours est plus grand que la date de l' enregistrement
    echo blablabla
    Ce qui me ressortirais que l'enregistrement entre la date du jours et 7 jours après.
    Je sais que c'est pas très bon car ma requete se fais quand meme mais bon...

    Ou alors un between mais j'ai pas reussi, j'ai du mal le faire

  10. #10
    Membre actif
    Inscrit en
    Mai 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 177
    Points : 210
    Points
    210
    Par défaut
    Dans ta requête initiale, est ce que tu as pensé à rajouter la clause "or die" à ton mysql_query, ça va te donner un message d'erreur si ta requête plante... ce qui pourrait aider à diagnostiquer le problème:

    $result_articles_nf =mysql_query ($str_articles_nf) or die(mysql_error());

  11. #11
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Il faudrait confirmer le type de donnée de "dateArticles_nf".
    Faudrait qu'il soit du type DATE ou DATETIME, et que bien sûr qu'il y ait des dates d'enregistrées.

    Théoriquement, ceci devrait être correcte :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT les_champs FROM articles_nf WHERE dateArticles_nf > CURDATE() ORDER BY dateArticles_nf ASC LIMIT 1
    Les divers manipulations sur les date coté MySQL : date et time
    Vu que ça devrait retourner qu'1 seule ligne, il ne sera pas nécessaire de faire une boucle.

    mais dès que je mets ASC avec LIMIT, j'ai plus rien
    Quand il y a un doute comme ça, vérifie la requête dans PhpMyAdmin, car si le code Php déconne, tu risque de faire de mauvaises déductions.
    En tout cas, un ASC ou DESC de même que LIMIT ne sont pas des instruction qui exclus des lignes, c'est juste l'ordre qui change.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci Merci Merci RunCodePhp et les autres, ca marche du tonnerre.

    Salutations et encore merci

    PS: comment mettre résolu?

  13. #13
    Membre confirmé
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Points : 597
    Points
    597
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    @rfufu :
    Dans ta requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $str_articles_nf = "SELECT
        dateArticles_nf,
        idArticles_nf,
        Heure,
        titreArticles_nf,
        TypeMatch,
        Lieu,
        DATE_FORMAT(dateArticles_nf, '%d-%m-%Y') as datefr
    FROM articles_nf
    WHERE dateArticles_nf <= ".date("d/m/Y",time())."
    ORDER BY dateArticles_nf DESC
    LIMIT 1"
    Ce qu'il faut savoir c'est que si la fonction date_format() sert à mettre en forme la sortie de dateArticles_nf, la mise en forme du champ date dans la clause where n'a aucune raison d'être car dateArticles_nf est toujours stocké dans la table au format par défaut du champ associé. En l'occurence si le champ est un timestamp ou datetime (le mieux si il n'y pas besoin d'insertion auto sur sa valeur) une clause where correcte serait de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE dateArticles_nf <= now() ORDER BY ...
    Normalement ca devrait aller mieux^^.

    Bonne continuation

    EDIT : Désolé RunPHP j'avais pas lu ton post et CURDATE est un equivalent à now(). Donc mon post n'a pas lieu d'être.

Discussions similaires

  1. [MySQL] Comment afficher le prochain enregistrement
    Par legrandse dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 03/09/2014, 14h55
  2. Réponses: 2
    Dernier message: 13/05/2008, 21h57
  3. Afficher un enregistrement selon un critère saisie.
    Par pegase23 dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 10h54
  4. [MySQL] Afficher un enregistrement de façon aléatoire
    Par guy2004 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/02/2005, 19h36
  5. Afficher les enregistrements si le count() vaut 0
    Par j14z dans le forum Requêtes
    Réponses: 7
    Dernier message: 06/04/2004, 09h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo