[RESOLU] Données utilisateur vers base de données. + autres questions

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 00:16

Bonjour, bonsoir!

Je me présente, je m'appel Steven et j'ai commencé la programmation il y a tout juste un mois.
Je me suis débrouillé tout seul jusqu'ici pour créer mon site, l'heberger sur le net et ajouter de nouvelles choses dessus au fur et à mesure que j'apprend à bien programmer :)
Il faut donc savoir que mon site est composé d'un index, d'une page de contenu html pure(texte, images), d'une page de contact, d'une chatbox, d'une page d'édition de profil et d'une page de désinscription. ET Que mon site REQUIERT une inscription avant de pouvoir le visiter librement. Il redirige donc touts les utilisateurs "anonymes" vers la page d'inscription automatiquement (choix personnel de ma part, même si je sais que c'est pas la meilleure chose à faire. Ne vous en faite pas je suis au courant.)
Je me heurte actuellement à deux problèmes intéressants dont je peine à trouver la solution, que ce soit par pure reflexion logique ou par des recherches en ligne:

1) Je veux que ma chatbox fasse un echo du nom de l'utilisateur quand il poste son message. Chose que j'ai fais dans mon code, mais le problème c'est que ma BDD refuse de récuperer ce echo pour le mettre dans ma table "chat" colonne "pseudo" de la base de données de ma chatbox... Le echo par contre marche très bien, puisque j'arrive à le faire apparaitre dans le "formulaire" de ma chatbox au dessus du message à entrer.
EDIT1: le echo du pseudo utilisateur marche mais apparait aussi dans la fenetre de chat, il remplace le pseudo de touts les utilisateurs dans l'historique du chat... Je n'avais pas remarqué et c'est pas cool du coup... :/
EDIT2: Correction de la seconde page de code

Code : Tout sélectionner

<?php session_start(); $bdd = new PDO('INFORMATIONS CONFIDENTIELLES'); if(isset($_SESSION['id'])) { $requser = $bdd->prepare("SELECT * FROM membres WHERE id = ?"); $requser->execute(array($_SESSION['id'])); $user = $requser->fetch(); if(isset($_POST['message']) AND !empty($_POST['message'])){ $pseudo = ($_POST[$user['pseudo']]); $message = htmlspecialchars($_POST['message']); $messagelength = strlen($message); if($messagelength <= 176) { $insertmsg = $bdd->prepare('INSERT INTO chat(pseudo, message) VALUES(?, ?)'); $insertmsg->execute(array($pseudo, $message)); } else { $error = "Votre message est trop long ! (176 caractères maximum.)"; } } else { $error = "Veuillez insérer votre message !"; } ?> <html> <head> <link rel="stylesheet" href="Style/chatbox.css"> <link rel="stylesheet" media="screen and (max-width:1024px)" href="Style.css"> <title>Chatbox</title> <meta charset="utf-8"> </head> <body> <navbar> <ul> <li><a href="Confidentiel.php">Accueil</a></li> <li><a href="Confidentiel.php">En savoir plus</a></li> <li><a href="Confidentiel.php">Me contacter</a></li> <li><a href="Confidentiel.php">Mon profil</a></li> <li class="current"><a href="Confidentiel.php">Chatbox</li> <li><a href="Confidentiel.php">English version</a></li> </ul> </navbar> <h1>Chatbox</h1> <section> <div class="chat"> <form method="POST" action=""> <p style="color:orange">Votre pseudo: <?= $user['pseudo']; ?></p> <p>Votre message:</p> <textarea type="text" name="message" placeholder="Message" rows="5" cols="50" ></textarea> <p><input type="submit" name="Envoyer"></p> <div class="error"> <?php if(isset($error)) { echo ''.$error.""; } ?> </div> </form> </div> <div class="chatbox"> <?php $allmsg = $bdd->query('SELECT * FROM chat ORDER BY id DESC LIMIT 0,5'); while($msg = $allmsg->fetch()) { ?> <p style="color:orange"><?php echo $msg['pseudo']; ?> :</p> <p style="color:white"><?php echo $msg['message']; ?></p> <?php } ?> </div> </section> </body> <footer> <div class="container"> <a href="Confidentiel.php">Mentions légales</a> </div> </footer> </html> <?php } else { header("Location: connexion.php"); } ?>
2) Mon second problème est que j'arrive parfaitement à recuperer l'id session de mes utilisateurs sur toutes mes pages lorsqu'il sont connectés. Mais le problème c'est que si il clique sur ma chatbox et qu'il retourne sur leur profil, ils se retrouvent de nouveau déconnectés et ce malgrès un session_start();
Voici le code de ma page de profil:

Code : Tout sélectionner

<?php session_start(); $bdd = new PDO('CONFIDENTIEL'); if(isset($_GET['id']) AND $_GET['id'] > 0) { $getid = intval($_GET['id']); $requser = $bdd->prepare('SELECT * FROM membres WHERE id = ?'); $requser->execute(array($getid)); $userinfo = $requser->fetch(); ?> <html> <head> <link rel="stylesheet" href="Style/inscriptionstyle.css"> <link rel="stylesheet" media="screen and (max-width:1024px)" href="Style/inscriptionstyle.css"> <title>Profil</title> <meta charset="utf-8"> </head> <body> <navbar> <ul> <li><a href="CONFIDENTIEL">Accueil</a></li> <li><a href="CONFIDENTIEL">En savoir plus</a></li> <li><a href="CONFIDENTIEL">Me contacter</a></li> <li class="current"><a href="CONFIDENTIEL">Mon profil</a></li> <li><a href="CONFIDENTIEL">Chatbox</a></li> <li><a href="CONFIDENTIEL">English version</a></li> </ul> </navbar> <h1>Profil de <?php echo $userinfo['pseudo']; ?></h1> <div class="profil"> <?php if(!empty($userinfo['avatar'])) { ?> <img src="membres/avatars/<?php echo $userinfo['avatar']; ?> "width=250" /> <?php } ?> <p>Votre pseudo est: <?php echo $userinfo['pseudo']; ?></p> <p>Votre adresse e-mail est: <?php echo $userinfo['mail']; ?></p> <?php if(isset($_SESSION['id']) AND $userinfo['id'] == $_SESSION['id']) { ?> <p><a href="editionprofil.php">Editer mon profil</a></p> <p><a href="deconnexion.php">Se déconnecter</a></p> <p><a href="desinscription.php">Supprimer mon compte</a></p> <?php } ?> </div> </body> <footer> <div class="container"> <a href="CONFIDENTIEL">Mentions légales</a> </div> </footer> </html> <?php } else { header('Location: connexion.php'); } ?>
Voila, désolé pour le pavé ! ^^'
Si vous avez des pistes sur la marche à suivre ou qui peuvent m'aider à me débloquer, je suis preneur ! :)
En tout cas merci de m'avoir lu jusqu'au bout ! :)
Modifié en dernier par Stevenhonor le 22 févr. 2020, 02:19, modifié 2 fois.

Mammouth du PHP | 2703 Messages

22 févr. 2020, 00:37

c'est deux fois le même code.

$pseudo = ($_POST[$user['pseudo']]);
entre <form> et </form> :
<p style="color:orange">Votre pseudo: <?= $user['pseudo']; ?></p>
donc pas de champ de formulaire pseudo. vu qu'il faut être connecté, il n'y a pas besoin du champ pseudo dans le formulaire. il faut juste lors de l'insert récupérer le pseudo depuis $user.

$message = htmlspecialchars($_POST['message']);
s'il n'y a pas de contrôle sur le contenu du pseudo, il faut aussi protéger l'affichage du pseudo dans la page.

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 02:37

Oups! Pardon! J'ai éditer mon premier message et ai rajouter le code de la page de profil.

Le champ "pseudo:" dans le formulaire de ma chatbox n'est là que pour rappeler à l'utilisateur quel est son pseudo actuel.
Le problème c'est que là, le code n'est pas fonctionnel. Ma table Chatbox ne récupere aucune données, donc aucun message ne se poste et les pseudos des auteurs des messages déjà postés sont les mêmes que celui de l'utilisateur actuellement connecté.

Après oui, il est vrai que je pourrais simplifier le formulaire html en supprimant les balises <p> qui font un echo du pseudo de l'utilisateur pour n'avoir que le text area du message à poster.
Mais j'ai l'impression que le soucis principal vient du fait que j'ai deux tables différentes qui sont appelés dans mon PHP aussi...
Parce que les comptes utilisateurs sont sauvegardés dans une table "membres" et les messages+pseudo des utilisateurs de la chatbox sont posté dans la table "chat"
Voila ce a quoi ressemble la chatbox actuellement avec le code de mon premier post: https://ibb.co/r4nS800
Et dans le cadre de droite on voit donc que le pseudo de l'utilisateur actuellement connecté est repris 3fois et remplace les pseudos des autres membres qui ont postés

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 02:46

Bonsoir, si tu essaies de bien comprendre ce que dit or 1, c'est que pour enregistrer le message tu fais un $pseudo = ($_POST[$user['pseudo']]); alors même qu'il n'y a pas d'input name="pseudo" dans le formulaire.

Y a juste un p avec un echo <p style="color:orange">Votre pseudo: <?= $user['pseudo']; ?></p>

Et comme juste au dessus de l'enregistrement du message tu récupères le user $user = $requser->fetch(); tu n'as pas besoin d'un input pseudo, il te suffit juste d'utiliser la variable $user. $pseudo = $user['pseudo'];

Déjà rien qu'en faisant ça, ça devrait mieux fonctionner.

PS : en fait ici $pseudo = ($_POST[$user['pseudo']]); il semble que tu te sois emmêlé les pinceaux car tu as bien mis $user['pseudo'] mais dans $_POST. En fait il faut juste mettre $user['pseudo'], tu as zappé d'enlever $_POST.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 03:01

Je viens d'essayer deux chose:

Code : Tout sélectionner

$user.$pseudo = $user->pseudo;
me met les messages d'erreur suivants:
Notice: Trying to get property 'pseudo' of non-object in /storage/ssd1/073/12297073/public_html/chatbox.php on line 12
Notice: Array to string conversion in /storage/ssd1/073/12297073/public_html/chatbox.php on line 12

Et ce code:

Code : Tout sélectionner

$pseudo = $user->pseudo;
N'apporte aucune nouveautées.

EDIT le 22/02/2020 a 02:08:

Ok j'ai réussis ! en mettant un

Code : Tout sélectionner

$pseudo = $user['pseudo'];
En effet, Saian c'était une erreur de ma part. J'avais oublier d'enlever le $_POST après avoir modifier mon form et mon php. Erreur de débutant :/

Mais j'ai toujours un probleme avec php qui convertit les pseudo des utilisateurs de la chatbox en celui de l'utilisateur sur lequel je suis connecté.

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 03:23

Mais j'ai toujours un probleme avec php qui convertit les pseudo des utilisateurs de la chatbox en celui de l'utilisateur sur lequel je suis connecté.
Y a pas de raison, dans le code on voit juste un insert et un select sur la table chat. Ça ne va pas modifier les autres lignes, seul un update peut le faire.

Je ne vois pas de problème, je note juste que tu sélectionnes toujours les 5 derniers messages.
SELECT * FROM chat ORDER BY id DESC LIMIT 0,5
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 03:29

Je selectionne les 5 derniers message par rapport à la taille de ma boite, de la taille du texte à l'interieur, padding, etc...

je pense vraiment qu'il y a en fait un problème avec cette ligne là dans la boite d'affichage de l'historique des message:

Code : Tout sélectionner

<p style="color:orange"><?php echo $user['pseudo']; ?> :</p>
Qu'est ce que tu en pense ?

EDIT: je précise que les pseudo et les messages s'enregistrent bien dans ma table chat avec le pseudo de l'utilisateur qui poste le message et le message posté par ce même utilisateur.
C'est juste les echo des messages sur la page html qui font n'importe quoi :')
Modifié en dernier par Stevenhonor le 22 févr. 2020, 03:36, modifié 1 fois.

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 03:34

je pense vraiment qu'il y a en fait un problème avec cette ligne là dans la boite d'affichage de l'historique des message:
 <p style="color:orange"><?php echo $user['pseudo']; ?> :</p> 
Qu'est ce que tu en pense ?
Ben ça c'est au dessus du formulaire, c'est la variable $user.

La chat box elle est plus bas avec une nouvelle requête et des nouvelles variables, aucun problème ou alors je suis frappé de cécité. ^^
      <div class="chatbox">
        <?php
        $allmsg = $bdd->query('SELECT * FROM chat ORDER BY id DESC LIMIT 0,5');
        while($msg = $allmsg->fetch())
        {
        ?>
        <p style="color:orange"><?php echo $msg['pseudo']; ?> :</p>
        <p style="color:white"><?php echo $msg['message']; ?></p>
        <?php
        }
        ?>
      </div>

EDIT

Si tu as 2 onglets ouverts et que tu te connectes sur les deux onglets pour faire tes testes, le problème et que la session va être la même dans les 2 onglets. Et donc tu obtiendras le nom du dernier user connecté.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 03:42

Bon, je suis un gros débutant.

En relisant mon form et ma div chatbox je me suis rendu compte que dans l'historique des messages je fesais appel à la variable $user plutot que la variable $msg.... Je vais allez me pendre. J'ai surement du mettre ça en faisant tous un tas de test vite fais et j'ai oublier de remettre la bonne variable... C'est inadmissible ce genre d'erreurs hahaha.... #-o #-o

Du coup j'ai une chatbox 100% fonctionnel via mon espace membres ! :)
Mais j'aimerais maintenant empecher les utilisateurs de rentrer des mots qui font par exemples plus de 15 charactères, tu aurais une petite idée de la varible à employer ? J'ai chercher ça pendant toute mon apres midi hier et je n'ai rien trouver la dessus pour le format PDO

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 03:53

La il faut que tu utilises un regex ou plusieurs regex avec la fonction preg_replace et/ou des str_replace pour modifier le message avant de l'enregistrer ou à la volée lors de l'affichage.

L'idée donc c'est de travailler avec la variable $message préalablement alimentée, avec le texte non transformé car si tu as des balises html dedans ça va devenir compliqué. ^^

Par exemple pour supprimer les mots de 15 lettres ou plus tu peux faire ça si je me suis pas planté quelque part :
$message = preg_replace('`\w{15,}`', '***', $message);// les *** c'est pour signifier la censure ^^
Tu peux utiliser des sites comme https://regexr.com/ pour tester tes expressions régulières.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 03:57

Si j'utilise ta fonction je n'ai plus aucun message qui s'affiche à l'envoi, peu importe le nombre de lettres, mots ou même de lettres dans un mots ! ^^

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 03:59

Pourtant je l'ai testé ^^
https://regexr.com/4us42
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 04:02

j'ai copier collé ta fonction et toujours rien. Je n'ai plus d'entrée qui s'ajoute dans la bdd pour la colonne 'message' ^^'
EDIT: Je crois qu'il faut que j'aille me coucher, j'arrive à tous faire foirer en copiant et collant une fonction qui marche parfaitement....
Le problème venais du fait que je l'avais coller sur mon $message = htmlspecialchars($_POST['message']); ...... ^^'''''''''''

Grace à toi j'ai une chatbox 100% fonctionnel! T'es formidable ! =D>
Modifié en dernier par Stevenhonor le 22 févr. 2020, 04:08, modifié 1 fois.

Avatar du membre
Mammouth du PHP | 1609 Messages

22 févr. 2020, 04:05

Je viens de tester le php et c'est bon <:)
$message = 'Mot de motdeplusdequinzelettres plus de motdeplusdequinzelettres quinze lettres';
$message = preg_replace('`\w{15,}`', '***', $message);// les *** c'est pour signifier la censure ^^
echo $message;// Mot de *** plus de *** quinze lettres

EDIT

lol d'accord #-o
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 44 Messages

22 févr. 2020, 04:09

Comme expliqué dans l'edit de mon message juste avant:
je suis un homme fatigué qui fais beaucoup d'erreur ce soir :')