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 :

Fonction allergique à une requête MySQL [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 47
    Par défaut Fonction allergique à une requête MySQL
    Bonjour à tous.

    J'ai réalisé un chat PHP+MySQL auquel je rajoute actuellement une couche AJAX pour qu'il tourne en temps réel. Pour cela j'utilise Sajax ( http://www.modernmethod.com/sajax/ ).
    Bon jusqu'à maintenant j'ai réussi à "dompter la bête".
    J'arrive à réactualisé toutes les 2 secondes des valeurs de test. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    require("Sajax.php");
     
    function show_now() {
     
    $testmess="message";
    $testpseud="pseudo";
    $testtemps="123456";
    return'<p class=chatp> '.$testtemps.' <strong> '.$testpseud.' </strong>
    :<br /> '.$testmess.' </p>';
    }
    Et le code Javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function show_me(date_server) {
                  document.getElementById("chatdiv").innerHTML = date_server;
          }
     
          function get_date() {
     
                  //put the return of php's show_now func
                  //to the javascript show_me func as a parameter
                  x_show_now(show_me);
     
                  //do it every 1 second
                  setTimeout("get_date()", 2000);
          }
    Ca ça marche très bien. (bon les noms de valeurs (get_date, etc.) sont un peu bizarres mais c'est un code repris et comme je n'avais pas vraiment à y toucher j'avais la flemme de les changer ).

    Maintenant, en lieu et places des valeurs de test, je voudrais afficher des valeurs issues de ma base MySQL (puisque les conversations du chat sont stockées dedans).
    Et là problème.
    Voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reponse = mysql_query("SELECT * FROM chat_prive WHERE conv_from = $am_from && conv_to = $am_to || conv_from = $am_to && conv_to = $am_from ORDER BY conv_id DESC LIMIT 0,50") or die(mysql_error());
    Dans la version non-AJAX de mon chat elle fonctionne très bien donc le problème ne vient pas de là.
    Si je place ma requête avant la fonction, elle ne retourne aucune valeur. Et si je la place dans la fonction, la fonction ne s'exécute plus.
    A noter que j'ai bien pris soin auparavant d'initialiser toutes les valeurs demandées par la requête, donc ce n'est pas non plus le problème.

    Voici la totalité du code pour les curieux (enfin seulement la partie qui pose problème) :
    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
    29
    30
    31
    32
    33
    <?php
    require("Sajax.php");
    session_start();
     
    include("includes/identifiants.php");
    mysql_connect($adresse, $nom, $motdepasse);
    mysql_select_db($database);
     
    $membre = (int) $_GET['m'];
    $ami = $_GET['a'];
     
    if ($ami == 1) {
    $am_from = $_SESSION['id'];
    $am_to = $membre;
    }
    else if ($ami == 2) {
    $am_from = $membre;
    $am_to = $_SESSION['id'];
    }
    else if ($ami != 1 && $ami != 2 || !isset($ami)) {
    echo '<a href ="./index.php">Index du forum</a><br />Une erreur est survenue.';
    exit();
    }
     
    function show_now() {
    $reponse = mysql_query("SELECT * FROM chat_prive WHERE conv_from = $am_from && conv_to = $am_to || conv_from = $am_to && conv_to = $am_from ORDER BY conv_id DESC LIMIT 0,50") or die(mysql_error());
     
    $testmess="message";
    $testpseud="pseudo";
    $testtemps="123456";
    return'<p class=chatp> '.$testtemps.' <strong> '.$testpseud.' </strong>
    :<br /> '.$testmess.' </p>';
    }
    Voilà donc j'aimerais bien savoir comment intégrer ma requête MySQL pour qu'elle soit utilisée dans la fonction.
    Merci d'avance pour vos réponses.

  2. #2
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Il faut que tu récupères tes champs quelque part avec un mysql_fetch_assoc ou mysql_fetch_array.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 47
    Par défaut
    J'ai vu que j'avais un problème avec les variables définies au départ, il fallait les inclure dans la fonction pour qu'elles fonctionnent localement. Donc ça c'est bon ça marche.

    Sauf que...

    Dans la version non-AJAX j'utilisais le code suivant pour afficher la conversation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $reponse = mysql_query("SELECT * FROM chat_prive WHERE conv_from = $am_from && conv_to = $am_to || conv_from = $am_to && conv_to = $am_from ORDER BY conv_id DESC LIMIT 0,50");
     
    while ($donnees = mysql_fetch_array($reponse) )
    {
    $temps = date("(d/m/y H:i) ", $donnees['conv_date']);
    $mess = ' '.code($donnees['conv_texte']).' ';
    $mess = stripslashes($mess);
     
    echo'<p class=chatp> '.$temps.' <strong> '.$donnees['conv_pseudo'].' </strong>
    :<br /> '.$mess.' </p>';
    }
    (le code($donnees['conv_texte']) c'est une fonction pour du bbcode).

    J'ai remplacé le "echo" par "return" puisqu'il s'agit d'une fonction, et visiblement maintenant il n'effectue le "while" qu'une seule fois, c'est-à-dire qu'il ne me retourne que le dernier texte.
    Je peux me tromper, mais je pense que c'est parce que "return" ne peut retourner qu'une seule valeur, et donc les autres textes retournés sont écrasés par le dernier "return" effectué.
    Mais dans ce cas, comment faire pour que les valeurs soient cumulées et que tous mes textes soient affichés (comme le faisait "echo") ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 27
    Par défaut
    Lu,

    return retourne donc une valeur mais mais fin à l'execution de ta fonction. Il faudrait que tu passes par un tableau intermédiaire pour récupérer tes données et ensuite les afficher.

    Tu peux aussi mettre tes résultat dans une variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $return = '';
    while(...) {
    $return .= 'ton code';
    }
     
    return $return; // String;
    Pour le tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while(...) {
    $return[] = 'ton code';
    }
     
    return $return; // Array;
    Bon courage ^^

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 47
    Par défaut
    C'est bon j'ai la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $truc='';
    while ($donnees = mysql_fetch_array($reponse) )
    {
    $temps = date("(d/m/y H:i) ", $donnees['conv_date']);
    $mess = ' '.code($donnees['conv_texte']).' ';
    $mess = stripslashes($mess);
     
    $truc.='<p class=chatp> '.$temps.' <strong> '.$donnees['conv_pseudo'].' </strong>
    :<br /> '.$mess.' </p>';
    }
    return $truc;
    J'avais un dernier problème avec mes accents à cause du passage à l'AJAX, mais c'est bon c'est résolu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $mess = stripslashes(utf8_encode($mess));

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/02/2011, 09h18
  2. Probleme avec une requête MySQL
    Par Alexlesilex dans le forum Requêtes
    Réponses: 8
    Dernier message: 04/05/2006, 17h48
  3. Intégrer un tableau dans une requête mysql
    Par GarGamel55 dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/02/2006, 19h16
  4. Réponses: 7
    Dernier message: 10/09/2005, 16h49
  5. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11

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