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 :

Select count par rapport à une date [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Points : 110
    Points
    110
    Par défaut Select count par rapport à une date
    bonjour ,

    je désire calculer le nombre de personne en ligne , j'ai un champs "time" dans ma db , il obtien une valeur a la connection , et a chaque passage sur n'importe qu'elle page du site ( update ) .

    voici comment je procede :

    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
    21
    <?php $req = "SELECT time ".
    "FROM utilisateurs ";
    $ret = mysql_query ($req) or die (mysql_error ());
     $kak = time();
    if ( $col = mysql_fetch_array($ret) )
     
    {
     
           $mogon = ($kak-($col['time']));
          $hote = 'localhost';
    $base = 'x';
    $user = 'x';
    $pass = 'x';
    $cnx = mysql_connect ($hote, $user, $pass) or die (mysql_error ());
    $ret = mysql_select_db ($base) or die (mysql_error ());
     $retour = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM utilisateurs WHERE time = ($mogon < 600) ")  or die(mysql_error());
     while ( $donnees = mysql_fetch_array ($retour) )  {  echo ($donnees['nbre_entrees']);  }
     
     
     
    }  ?>
    je veux donc qu'il calcule le nombre de ligne dont le temps est inferieur a 600 secondes , ainsi je sais le nombre de personne en "ligne".

    je suppose que ma syntaxe est fause , ou bien que l'on peut pas proceder ainsi

    il me donne : 86
    quand je fais : ($mogon > 600) alors que theoriquement lors de l'essai , seul 1 personne etaient <600 il y a 87 personne sur le site


    il me donne : 0
    quand je fais : ($mogon < 600) alors que en db il y a bien des valeurs plus petite que 600


    il me donne : 86
    quand je fais : ($mogon > 999999600 )


    il me donne : 0
    quand je fais : ($mogon < 999999600 ) alors qu'il y a beaucoup de valeur de de moin que 999999600 en db

    que faire?

    merci

  2. #2
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    SELECT COUNT(*) AS nbre_entrees FROM utilisateurs WHERE time = ($mogon < 600)



    Tu compares ton champs time, de type datetime ou timestamp j'imagine, à l'expression de ($mogon < 600)...

    Il n'y à rien qui te choque en cela ?
    ($mogon < 600) renvoie true ou false

    Bon je dit sa mais je n'ai peut être rien compris

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Points : 110
    Points
    110
    Par défaut
    le champs time est un champs de type varchar , puisque je lui donne une valeur par time() qui est une suite de caractere

  4. #4
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    hmmm varchar... Personnellement j'y collerais plutot un timestamp.
    Avec un update qui utilise la fonction UNIX_TIMESTAMP de mysql.

    Parceque bon varchar ce n'est pas le genre de champs auquel on applique une opération de type "plus petit que".

    Sinon je reprend ton souhait :
    je veux donc qu'il calcule le nombre de ligne dont le temps est inferieur a 600 secondes , ainsi je sais le nombre de personne en "ligne".
    Or comme je le disais précedemment, la résultante de l'opération ($mogon < 600) est true ou false.
    Donc la contrainte time = ($mogon < 600) n'à pas de sens, cela reviens à demander si time = true ou time = false.

    Donc ta requete devrait plutot ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql = "
    SELECT COUNT(*) AS nbre_entrees 
    FROM utilisateurs 
    WHERE (time - UNIX_TIMESTAMP()) < 600
    ";
    Et ton script à cela :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    <?php 
     
    /* On se connect à la base de donnée 1 fois, pour l'execution du script */
    $hote = 'localhost'; 
    $base = 'x'; 
    $user = 'x'; 
    $pass = 'x'; 
    $cnx = mysql_connect ($hote, $user, $pass) or die (mysql_error ()); 
    $ret = mysql_select_db ($base) or die (mysql_error ()); 
     
     
    /* La requete */
    $NbUsers = 0;
    $sql = "
    SELECT COUNT(*) AS nbre_entrees 
    FROM utilisateurs 
    WHERE (time - UNIX_TIMESTAMP()) < 600
    ";
     
    $query = mysql_query ($req) or die (mysql_error ()); 
     
    if($query != false)
    {
    $NbUsers = mysql_fetch_array($query , MYSQL_ASSOC);
    $NbUsers = $NbUsers["nbre_entrees"];
    }
     
     ?>
    voila, si je n'ai pas fait de connerie ce devrait fonctionner tout seul,
    bye

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Points : 110
    Points
    110
    Par défaut
    ok merci , mais lorsque j'insere la valeur avec UNIX_TIMESTAMP il me dit ceci :

    Fatal error: Call to undefined function: unix_timestamp() in c:\weblocal\v.1\login.php on line 32

  6. #6
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    ??? Quelle est ta version de mysql ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Points : 110
    Points
    110
    Par défaut
    comment puis je le voir? je ne sais pas

  8. #8
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Hmm après reflexion et un petit peu de lecture de la documentation voici une requete qui devrait le faire un peu plus :

    SELECT * , TIME_TO_SEC( CURRENT_TIMESTAMP( ) ) , TIME_TO_SEC( `time` ) , TIME_TO_SEC( CURRENT_TIMESTAMP( ) ) - TIME_TO_SEC( `time` )
    FROM utilisateurs
    ou

    SELECT COUNT(*)
    FROM utilisateurs
    WHERE TIME_TO_SEC(CURRENT_TIMESTAMP())-TIME_TO_SEC(`time`) < 600

    Par contre ton champs VARCHAR il mets la zone, je ne trouve pas comment transformer le timestamp varchar en type date. Je te suggère de te le transformer en datetime plutot. Se sera beaucoup plus pratique pour le manipuler avec les fonctions Mysql.


    Pour connaitre la version tu peux executer cette requete dans phpmyadmin :
    SELECT VERSION( )

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Points : 110
    Points
    110
    Par défaut
    pour la version : 4.1.9-max

    maintenant je dois mettre la donnée avec quel function en db?si le champs est en datetime

  10. #10
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    avec CURRENT_TIMESTAMP()

    Tu peux jeter un oeil à cette page pour en savoir plus sur les fonctions Mysql :
    http://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Points : 110
    Points
    110
    Par défaut
    merci pour la doc

    mais c'est pareil : Fatal error: Call to undefined function: current_timestamp()

  12. #12
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Euh je n'ai pas tout lu mais c'est à utiliser dans une requête SQL et pas comme une fonction.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Points : 110
    Points
    110
    Par défaut
    oui mais sauf si je me trompe il faut inserer une donnée en db avant , et je doit apparement utilisé cette fonction , et aussi l'utilisé dans la requete meme c'est bien ca?

  14. #14
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Citation Envoyé par ruty
    oui mais sauf si je me trompe il faut inserer une donnée en db avant
    Pas forcement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $query = "SELECT CURRENT_TIMESTAMP()";
    $results = mysql_query($query);
    list($current_timestamp)   
     
    echo $current_timestamp;

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Points : 110
    Points
    110
    Par défaut
    ok je ne savais pas merci de me l'apprendre

    ca "fonctionne" mais il me reste tjs un probleme

    a chaque refech sur le site je update le champs time avec CURRENT_TIMESTAMP() , mais je controle ainsi :

    if( (TIME_TO_SEC(CURRENT_TIMESTAMP())-($col['time']))>900 )

    ainsi si il est plus de 900s il est rediriger sur login mais si il est moins , il va re-updater et mettre la vrai valeur , mais j'ai ceci :

    Fatal error: Call to undefined function: time_to_sec() on line 201

    ligne 201= if( (TIME_TO_SEC(CURRENT_TIMESTAMP())-($col['time']))>900 )

  16. #16
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    C'est normal, ce sont des fonciton MYSQL. Qui ne sont utilisable qu'avec des requetes sur la base de donnée, et pas directement dans ton code PHP.

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Points : 110
    Points
    110
    Par défaut
    d'accord mais comment verifier alors que le temps actuel et le temps en db est plus grand que 900s ?

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 188
    Points : 110
    Points
    110
    Par défaut
    voila j'ai reussi par moi meme , cela fonctionne

    merci a vous tous


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Dates] Décompte par rapport à une date
    Par isa150183 dans le forum Langage
    Réponses: 1
    Dernier message: 25/10/2008, 15h18
  2. [ASIQ] Comment tester par rapport à une date avec l'heure
    Par Soulkeum dans le forum Adaptive Server IQ
    Réponses: 1
    Dernier message: 08/02/2008, 18h06
  3. Réponses: 2
    Dernier message: 21/03/2007, 16h06
  4. Réponses: 7
    Dernier message: 31/07/2006, 13h50
  5. Réponses: 7
    Dernier message: 05/04/2006, 11h22

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