Bonjour à tous !

Alors voilà, j'ai un problème avec mon code php, j'essaie de faire un simple de tchat en php (je suis pas encore très bon en php), mais je rencontre des problêmes ...
J'ai fait un fichier avec les fonctions pour traiter, enregister/afficher les messages, une page où l'on inscrit le message et le pseudo , et une page de connection à la base de données. Je suis bloqué depuis au moins un mois, je n'arrive vraiment pas à savoir d'où ca peut venir ...
Voici le code de la connection à la db :

<?php
    session_start();
    $dbhost = 'localhost';
    $dbuser = 'root';
    $dbpswd = 'roka304@';
    $dbname = 'roka';

    $con = mysqli_connect($dbhost,$dbuser,$dbpswd,$dbname);
    if(mysqli_connect_errno()){
        die("Erreur lors de la connection à la base de données");
    }

Voici celui des fonctions :

<?php

    function get_msg(){
        $sql = "SELECT 'Sender', 'Message' FROM chat";
        $run = mysqli_query($con, $sql);
        $messages = array(); 

        while($message = mysqli_fetch_assoc($run)){
            $messages[] = array(
                'sender'=>$message['Sender'],
                'message'=>$message['Message']
                );

        }

        return $messages;

    }

    function send_msg($sender, $message){
        if(!empty($sender) && !empty($message)){
            $sender = mysqli_real_escape_string($con, $sender);
            $message = mysqli_real_escape_string($con, $message);
            $sql = "INSERT INTO chat VALUES(null,'{$sender}','$message')";

            if($run = mysqli_query($con, $sql)){
                    return true;

            }else{
                return false;
            }

        }else{
            return false;
        }       
    }

Et voici la page où l'on inscrit le pseudo et le message :

<?php

    if(isLogged() == 1){    
        if(isset($_POST['submit'])){
            if(send_msg($_POST['sender'], $_POST['message'])){
                echo "Message sent";

            }else{
                echo "Message failed ...";
            }
        }   
    }else header('Location:index.php?page=login');

?>

<h2>Espace de tchat</h2>
<br /><br />
<div id="messages">
    <?php

        $messages = get_msg();
        foreach($messages as $message){
            echo '<strong>'.$message['sender'].'</strong>Sent<br />';
            echo $message['message'].'<br /><br />';

        }

    ?>
</div>

<form method="post" action="index.php?page=tchat" class="form_tchat">

    <label for="name">Votre nom d'utilisateur :</label><br />
    <input type="text" name="sender" placeholder="(minimum 4 caractères)" style="text-align:center" maxlength="30" /><br /><br />

    <label for="name">Votre message :</label><br />
    <input type="text" name="message" style="text-align:center" maxlength="300" /><br /><br />

    <input type="submit" name="submit" value="Envoyer" />
</form>

Voilà, peut etre y verrez-vous une erreur ou un problème, merci de votre aide, j'espère avoir été assez précis !
Ah oui, j'ai oublié, le session start c'est pour l'autre partie de mon site, qui utilise les sessions. La page de tchat est incluse sur une page index, où est incluse la page contenant la connection a la db.

47 réponses


Nagraria
Auteur
Réponse acceptée

Hello, Problème résolu :)
J'avais oublié de définir les variables de connection en global (global $con;) dans ma fonction, tout marche nickel.
Merci de votre aide

Bonjour,

Avez-vous un message d'erreur ?
Je vois qu'il y a du mysql et du mysqli donc cela ne vas pas . Il vous faut soit rester qu'en mysqli ou passer à PDO.

Nagraria
Auteur

Merci de votre réponse avant tout !
Le mysql et mysqli, c'est ma faute j'ai mis a l'origine le mysqli, mais voyant que ca ne marchait pas, j'ai essayé avec mysql, sans plus de succès et j'ai oublié de remettre mysqli dans le post. Le seul message d'erreur que j'ai est celui prévu dans mon code, disant : "message failed". J'ai inspecté l'élement et regardé avec firebug, aucune erreur.

Corriger votre code avec mysqli que j'y vois plus clair car la c'est un beau mélange. merci

Nagraria
Auteur

C'est fait

ok.
Avez-vous procédé par étape pour vérifier le lieux de l'erreur ?
Le mysqli_query de la fonction get_msg va forcément retourner une erreur car il ne connait pas $con

Nagraria
Auteur

J'ai fait beaucoup de test oui, je n'ai pas trouvé la source.
Si je pense qu'il la connait (j'ai oublié de préciser) la page tchat est incluse sur une page index, où est incluse la page de connection a la DB, j'aurais du préciser

Faites un var_dump($con); et dites moi ce que cela affiche ?

Nagraria
Auteur

Voila ce que m'a retourné var_dump($con); , sur la page tchat.php :

object(mysqli)#1 (19) { ["affected_rows"]=> int(0) ["client_info"]=> string(6) "5.5.44" ["client_version"]=> int(50544) ["connect_errno"]=> int(0) ["connect_error"]=> NULL ["errno"]=> int(0) ["error"]=> string(0) "" ["error_list"]=> array(0) { } ["field_count"]=> int(0) ["host_info"]=> string(25) "Localhost via UNIX socket" ["info"]=> NULL ["insert_id"]=> int(0) ["server_info"]=> string(15) "5.5.44-0+deb8u1" ["server_version"]=> int(50544) ["stat"]=> string(135) "Uptime: 91494 Threads: 1 Questions: 1619 Slow queries: 0 Opens: 70 Flush tables: 1 Open tables: 60 Queries per second avg: 0.017" ["sqlstate"]=> string(5) "00000" ["protocol_version"]=> int(10) ["thread_id"]=> int(382) ["warning_count"]=> int(0) } 

D'accord, en relisant votre code et votre problème, c'est l'insertion d'un message qui plante ?

Nagraria
Auteur

Oui, après je ne sais pas où est exactement l'erreur

Pour insert, une méthode est de cette structure :

INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...)

Qu'elle est la structure de la table chat ?

Nagraria
Auteur

Ah merci, j'ai mis cela $sql = "INSERT INTO chat(id, Sender, Message) VALUES(null,'{$sender}','$message')";, l'erreur persiste malheureusement

l'id est en auto-increment je suppose ?
Si oui, alors il ne faut pas le mettre.

Nagraria
Auteur

Oui, le fait de mettre nul revient au meme non ? J'essaye ...

Nagraria
Auteur

Non, pas de changement

Non car null est une valeur.

$sql = 'INSERT INTO chat (Sender, Message) VALUES ("'.$sender.'", "'.$message.'")';
Nagraria
Auteur

Nous n'avons pas sélectionné l'ID, mais on le remplis quand meme ?

oui, c'est mysql qui va s'en occupper.

Nagraria
Auteur

ok, pas de changement malheuresement

Testons la valeur de run dans la condition et vérifions que $sql soit correctement écrit avec les doubles guillemets
Rien de tel que des var_dump pour vérifier au fur et à mesure

Nagraria
Auteur

Donc si j'ai bien compris, var_dump($run) ?

oui et de $sql

Nagraria
Auteur

Pardon, je n'avais pas vu, j'essaye ca

Nagraria
Auteur

Ils renvoient tous deux NULL

$sql ne devrait pas être nul mais "insert ..."

Nagraria
Auteur

Ah oui ? Il y a donc un problème a ce niveau ?

oui, revoir avec les " et '

Nagraria
Auteur

Dans le INSERT ? Ce n'est pas la bonne forme ?

le var_dump($sql) devrait afficher la requête en entière et non null

Nagraria
Auteur

Ah d'accord, mais savez vous à cause de quoi il affiche NULL ?

surement du au " et ', esseyer de le tourner autrement

Nagraria
Auteur

Vous parlez bien des guillemets et apostrophes de $sql ? Si c'est le cas j'ai déjà essayé ...

puis-je voir le bout de code avec le var_dump($sql);

Nagraria
Auteur

Oui biensur :

<?php

    function get_msg(){
        $sql = "SELECT 'Sender', 'Message' FROM chat";
        $run = mysql_query($sql);
        $messages = array(); 

        while($message = mysql_fetch_assoc($run)){
            $messages[] = array(
                'sender'=>$message['Sender'],
                'message'=>$message['Message']
                );

        }

        return $messages;

    }

    function send_msg($sender, $message){
        if(!empty($sender) && !empty($message)){
            $sender = mysql_real_escape_string($sender);
            $message = mysqli_real_escape_string($message);
            $sql = "INSERT INTO chat (Msg_ID,Sender, Message) VALUES ('','.$sender.', '.$message.' ";

            if($run = mysql_query($sql)){
                    return true;

            }else{
                return false;
            }

        }else{
            return false;
        }       
    }
var_dump($run);
var_dump($sql);

logique que c'est null, il ne sont pas dans la fonction (^_^)

Nagraria
Auteur

ah :) Je les met au début par exemple ?

Non sinon il ne voudrons rien.
en plus il manque une ) à $sql

 $sql = "INSERT INTO chat (Sender, Message) VALUES ('$sender', '$message') ";
var_dump($sql);
$run = mysql_query($sql);
var_dump($run);
            if($run){
Nagraria
Auteur

Voila ce qu'il me renvoie maintenant : string(51) "INSERT INTO chat (Sender, Message) VALUES ('', '') "

donc $sender et $message sont vides
et je vois un mysql pour $sender

Nagraria
Auteur

Un mysql ? J'ai remplacé celui du run par un mysqli, si vous parlez de celui ci.

$sender = mysql_real....
vérifier que $sender et $message ne sont pas vide avec le mysqli_real....

Nagraria
Auteur

Ah oui merci, c'est changé

Nagraria
Auteur

Vraiment personne n'a d'idée ?

Bonsoir.
Si tu nous montrait où tu en est avec ton code en nous présentant ton code avec toutes les corrections que tu à fais depuis le début, ça pourrait nous permettre de t'aider.

Nagraria
Auteur

Ouaip ok, voilà la dernière version :

<?php

    function get_msg(){
        $sql = 'SELECT Sender, Message FROM chat';
        $run = mysqli_query($sql);
        $messages = array(); 

        while($message = mysqli_fetch_assoc($con, $run)){
            $messages[] = array(
                'sender'=>$message['Sender'],
                'message'=>$message['Message']
                );

        }
        return $messages;
}

    function send_msg($sender, $message){
        if(!empty($sender) && !empty($message)){
            $sender = mysqli_real_escape_string($con, $sender);
            $message = mysqli_real_escape_string($con, $message);
            $sql = 'INSERT INTO chat (Sender, Message) VALUES ($sender,$message)';

            if($run = mysqli_query($con, $sql)){
                    return true;

            }else{
                 return false;
            }
        }else{
             return false;      
        }
}
?>

et le tchat.php :


<?php

    if(isLogged() == 1){    
        if(isset($_POST['submit'])){
            if(!empty($_POST)){
                if(send_msg($_POST['sender'], $_POST['message'])){
                    $error = "Message envoyé";

                }else $error = "Message failed ...";
            }
        }
    }else redirect();

?>

<h2>Espace de tchat</h2>
<br /><br />
<div id="messages">
    <?php

        $messages = get_msg();
        foreach($messages as $message){
            echo '<strong>'.$message['sender'].'</strong>Sent<br />';
            echo $message['message'].'<br /><br />';

        }

    ?>
</div>
<?= $error; ?>
<form method="post" action="" class="form_tchat">

    <label for="name">Votre nom d'utilisateur :</label><br />
    <input type="text" name="sender" placeholder="(minimum 4 caractères)" style="text-align:center" maxlength="30" /><br /><br />

    <label for="name">Votre message :</label><br />
    <input type="text" name="message" style="text-align:center" maxlength="300" /><br /><br />

    <input type="submit" name="submit" value="Envoyer" />
</form>

J'ai également mis le code sur github pour que vous compreniez comment fonctionnes mon site : https://gist.github.com/R04A/f73c71a7375b7c7bfbb4

L'erreur ne viendrait pas des simples quotes dans la fonction send_msg() ?
L'utilisation des doubles quotes permettent d'afficher directement le contenu de la variable, alors que les simples quotes vont interpréter textuellement la chaîne $variable et l'écrire tel quel.