Problème tchat php

Par Nagraria, il y a 10 ans


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

Carouge10, il y a 10 ans

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, il y a 10 ans

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.

Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

C'est fait

Carouge10, il y a 10 ans

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, il y a 10 ans

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

Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

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) }
Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

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

Carouge10, il y a 10 ans

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, il y a 10 ans

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

Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

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

Nagraria, il y a 10 ans

Non, pas de changement

Carouge10, il y a 10 ans

Non car null est une valeur.

$sql = 'INSERT INTO chat (Sender, Message) VALUES ("'.$sender.'", "'.$message.'")';
Nagraria, il y a 10 ans

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

Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

ok, pas de changement malheuresement

Carouge10, il y a 10 ans

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, il y a 10 ans

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

Carouge10, il y a 10 ans

oui et de $sql

Nagraria, il y a 10 ans

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

Nagraria, il y a 10 ans

Ils renvoient tous deux NULL

Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

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

Carouge10, il y a 10 ans

oui, revoir avec les " et '

Nagraria, il y a 10 ans

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

Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

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

Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

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

Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

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);
Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

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

Carouge10, il y a 10 ans

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, il y a 10 ans

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

Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

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

Carouge10, il y a 10 ans

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

Nagraria, il y a 10 ans

Ah oui merci, c'est changé

Nagraria, il y a 10 ans

Vraiment personne n'a d'idée ?

Lartak, il y a 10 ans

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, il y a 10 ans

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

oxflow, il y a 10 ans

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.

Nagraria, il y a 10 ans

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