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 :

Chat en ligne (tchate, pas l'animal!) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 58
    Points
    58
    Par défaut Chat en ligne (tchate, pas l'animal!)
    Bonsoir bonsoir!

    Voilà, je pose mon idée:

    Je voulais intégrer un chat sur mon site. Le visiteur arrive sur une page, qui l'invite à entrer son pseudo. Changement de page, zone de texte avec bouton 'envoyer'. Le but est que le visiteur reste loggé grace aux variables de session. En dessous de la zone de texte, un div dans lequel s'affichent les dix derniers messages, le div se refresh toutes les dix secondes.

    Etant novice, j'ai deja tenté de créer un simple chat, mais rien que là ça coince. Tout va bien au début, mon formulaire s'affiche, mais aucune donnée ne va vers la BDD, et la redirection ne se fait pas. Je vous donne le code actuel, excusez le mélange php/html qui doit piquer les yeux, gardez à l'esprit que c'est un simple brouillon.

    Page minichat.php

    Code php : 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8" />
            <title>Mini-chat</title>
        </head>
        <style>
        form
        {
            text-align:center;
        }
        </style>
        <body>
      <form action="minichat_post.php" method="post">
            <p>
            <label for="pseudo">Pseudo</label> : <input type="text" name="pseudo_user" id="pseudo_user" /><br />
            <label for="message">Message</label> :  <input type="text" name="message_texte" id="message_texte" /><br />
     
            <input type="submit" value="Envoyer" />
        </p>
        </form>
     
    <?php 
    try
    {
    	    $bdd = new PDO('mysql:host=localhost;dbname=mini_chat;charset=utf8', 'root', 'root');
    	}
    	catch(Exception $e)
    	{
    		        die('Erreur : '.$e->getMessage());
    		}
     
     
     
    // Récupération des 10 derniers messages
    $reponse = $bdd->query('SELECT pseudo_user, message_texte FROM user, message ORDER BY ID DESC LIMIT 0, 10');
     
    // Affichage de chaque message 
    while ($donnees = $reponse->fetch())
    {
        echo '<p><strong>' . htmlspecialchars($donnees['pseudo_user']) . '</strong> : ' . htmlspecialchars($donnees['message_user']) . '</p>';
    }
     
    $reponse->closeCursor();
     
    ?>
        </body>
    </html>

    Page minichat_post.php

    Code php : 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    <?php
     
    //on récupère les champs dans des variables
     
    if(isset($_POST['pseudo_user']))      $pseudo_user=$_POST['pseudo_user'];
    else      $pseudo_user="";
     
    if(isset($_POST['message_texte']))      $pseudo_user=$_POST['message_texte'];
    else      $message_texte="";
     
    //on teste si les champs sont vides
     
    if(empty($pseudo_user) OR empty($message_texte))
    {
    	echo '<font color="red">Attention, vous devez entrer quelque chose!</font>';
    }
     
    else
    {					//connexion à la bdd
    	try
    	{
    		$bdd = new PDO('mysql:host=localhost;dbname=mini_chat;charset=utf8', 'root', 'root');
    	}
    	catch(Exception $e)
    	{
    		die('Erreur : '.$e->getMessage());
    	}
     
    SELECT *					//jointure
    	FROM `user`
    	INNER JOIN `message`
    	ON `user`.`id_user` = `message`.`id_user`
     
    	//requete préparée pour envoyer les données à la bdd
     
    $req = $bdd->prepare("INSERT INTO message (message_texte) VALUES('$message_texte')");
     
    $req->execute(array($message_texte['message_texte']));
     
    $id_message = $bdd->lastInsertId();
     
    $req = $bdd->prepare("INSERT INTO user (pseudo_user, id_user) VALUES('$pseudo_user', '$id_user')");
     
    $req->execute(array($pseudo_user['pseudo_user'], $id_user['id_user']));
     
    // Redirection du visiteur vers la page du minichat
    header('Location: minichat.php');
    ?>

    J'ai commenté le code pour expliquer ce que j'ai tenté de faire...

    Merci d'avance?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Dans minichat.php il manque la jointure entre les deux tables. On retrouve la jointure manquante dans la requête qui se ballade toute nue ligne 30 de minichat_post.php.

    Dans minichat_post.php les lignes 6 - 10 ne servent à rien : A quoi cela sert de définir des valeurs par défaut étant donné que tu ne fais pas de traitement si ces variables ne sont pas renseignées ?

    C'est quoi ce $message_texte['message_texte'] ligne 39 ?

    Une requête préparée s'écrit comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $req = $bdd->prepare("INSERT INTO message (message_texte) VALUES (:message_texte)");
     $req->execute(array(':message_texte'=>$message_texte));
    On est un peu surpris par contre que l'id de l'utilisateur ayant écrit le message soit absent de la table message. On ne sait pas qui écrit quoi dans ta chat ?

    Egalement à chaque fois que l'utilisateur ecrit un message tu le réinscrit dans la table "user" ?

    Pour finir, quand tu developpes, active tes erreurs PDO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $bdd = new PDO('mysql:host=localhost;dbname=mini_chat;charset=utf8', 'root', 'root');
     $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    et met ton code de connexion dans un fichier dédié que tu inclus quand tu en as besoin.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 58
    Points
    58
    Par défaut
    Merci de tes conseils, je vais rectifier ce qui cloche. La jointure doit être faite avant le select Obligatoirement?
    Il y a un champs id_user dans la table message, en Foreign Key, pour la jointure entre les tables!

    Et le but a la base était d'utiliser une variable de session utilisateur pour garder le visiteur loggé. Il doit y avoir deux table, une contenant les users et une autre contenant les messages, et qu'elles soient jointes, mais je ne sais pas comment faire pour attribuer tel message posté à tel utilisateur :/

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par sabotage Voir le message
    ...On ne sait pas qui écrit quoi dans ta chat ?...
    Ce sont les grottes de Lascaux (de la squaw ??), ou.... j'ai vraiment l'esprit mal tourné ?

    Réponse sur... la chat...

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Citation Envoyé par LuluHow Voir le message
    Merci de tes conseils, je vais rectifier ce qui cloche. La jointure doit être faite avant le select Obligatoirement?
    Il y a un champs id_user dans la table message, en Foreign Key, pour la jointure entre les tables!
    La structure de ta base de donnée ne force pas la jointure : elle doit être précisée dans la requête.

    Citation Envoyé par LuluHow Voir le message
    Et le but a la base était d'utiliser une variable de session utilisateur pour garder le visiteur loggé. Il doit y avoir deux table, une contenant les users et une autre contenant les messages, et qu'elles soient jointes, mais je ne sais pas comment faire pour attribuer tel message posté à tel utilisateur :/
    Dans ton insertion du message, il faut renseigner le id_user.

    Ce sont les grottes de Lascaux
    Je ne te suivrais pas sur ce terrain glissant.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 58
    Points
    58
    Par défaut
    En gros, si je fais une session_start(); en début de code.

    -Je déclare $_SESSION['user'] = $_POST['pseudo'] (faut-il que je crée une $_SESSION['id_user']?)
    - Je demande le pseudo du visiteur. (La variable $_POST est donc attribuée à $_SESSION['user'], que j'insère dans la table user.
    -Il est redirigé sur la page qui contient la zone de texte du chat.
    -Il tape le message et clique sur envoyer.
    -J'insère le message dans la base de données. (les deux tables contiennent le champs id_user en commun, si il est en AI sur la table user, comment le renseigner dans la table message?)

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut mettre l'id de l'user créé dans la session et evidemment ne pas refaire une insertion du user à chaque message.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 43
    Points : 58
    Points
    58
    Par défaut
    C'est tout bon tout bon!!!!

    Je poste mes codes au cas où ça pourrait aider quelqu'un. Il ne reste en gros plus qu'a faire la jointure entre les tables pour les afficher, mais le résultat est là.

    Accueil.php
    Code html : 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
     
    <?php
    session_start();
    ?>
     
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8" />
            <title>Mini-chat</title>
        </head>
        <style>
        form
        {
            text-align:center;
        }
        </style>
        <body>
      <form action="minichat.php" method="post">
            <p>
            <label for="pseudo">Pseudo</label> : <input type="text" name="pseudo_user" id="pseudo_user" /><br />
     
            <input type="submit" value="Envoyer" />
        </p>
        </form>
        </body>
        </html>

    minichat.php
    Code php : 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 
     
    session_start();
     
    $_SESSION['pseudo_user'] = $_POST['pseudo_user'];
     
    include 'connect.php';
     
    $req = $bdd->prepare("INSERT INTO user (pseudo_user) VALUES (:pseudo_user)");
    $req->execute(array(
    		':pseudo_user'=>$_SESSION['pseudo_user']));
     
    $last_id = $bdd->lastInsertId();
     
    $_SESSION['id_user'] = $last_id;
     
    header('Location: post.php');
     
     
    ?>

    post.php
    Code html : 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
     
    <?php
    session_start();
    ?>
     
     
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8" />
            <title>Mini-chat</title>
        </head>
        <style>
        form
        {
            text-align:center;
        }
        </style>
        <body>
      <form action="post_traitement.php" method="post">
            <p>
            <textarea name="message_texte" rows="10" cols="50">Saisir un texte ici.</textarea> <br />
     
            <input type="submit" value="Envoyer" />
        </p>
        </form>
     
        </body>
        </html>

    post_traitement.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
    session_start();
     
    include 'connect.php';
     
    $req = $bdd->prepare("INSERT INTO message (message_texte, id_user) VALUES (:message_texte, :id_user)");
    $req->execute(array(
    		':message_texte'=>$_POST['message_texte'],
    		':id_user'=>$_SESSION['id_user']));
     
    echo $_POST['message_texte'];
     
    ?>

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

Discussions similaires

  1. [SQL2K] recopier une ligne, mais pas complètement
    Par Monstros Velu dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/10/2006, 12h54
  2. Nouveau système de CHAT en ligne
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 17
    Dernier message: 15/01/2006, 18h58
  3. explorer 6: pas d'animation
    Par jm.th dans le forum IE
    Réponses: 24
    Dernier message: 11/11/2005, 13h39
  4. [Jscript] utilisateur en ligne ou pas
    Par virgul dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 23/08/2005, 16h52
  5. [SWT]jeu n'affiche pas l'animation
    Par miel_pops dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 20/05/2004, 19h20

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