| | wbdzgnr | Posté le 03/12/2006 @ 12:49 | Petit astucien
18 Messages
| Bonjour a tous!
J'ai une table com qui recupere les pseudo, message et id_jeux avec bien entendu un champ id.
En local le champ id_jeux prend bien la valeur du jeux en question mais sur le web, c'est la valeur par defaut qui reste a savoir "0".
je ne pense pas que cela vienne de ma page commentaire.php étant donnée qu'en local tout va bien mais bon on n'est jamais trop prudent :
[code]<?php if (isset($_POST['pseudo']) AND isset($_POST['message'])) // Si les variables existent { if ($_POST['pseudo'] != NULL AND $_POST['message'] != NULL) // Si on a quelque chose à enregistrer { // D'abord, on se connecte à MySQL mysql_connect("****", "****", "****"); mysql_select_db("****"); // On utilise la fonction PHP htmlentities pour éviter d'enregistrer du code HTML dans la table $message = htmlentities ($_POST['message']); $pseudo = htmlentities ($_POST['pseudo']); $id = $_GET["id"]; // Ensuite on enregistre le message mysql_query("INSERT INTO com VALUES('', '$pseudo', '$message', '$id')");
// On se déconnecte de MySQL mysql_close(); } }
// Que l'on ait enregistré des données ou pas... // On affiche le formulaire puis les 10 derniers messages
// Tout d'abord le formulaire : ?>
<p>Laissez vos commentaires sur ce jeux!</p>
<form method="post" action="commentaire.php?id=<? echo $id; ?>" > <p> <h4>Pseudo : <br /><br /><input type="text" name="pseudo" style="background:#211D1C; border-color:#211D1C;color:#ffFFFF" /><br><br> Message :</h4><br /> <textarea name="message" rows="8" cols="30"style="background:#211D1C; border-color:#211D1C;color:#ffFFFF" ></textarea><br /> <input type="submit" value="Envoyer" style="border-color:#666666;color:#000000;font-size:10;" /> </p></form>
<?php
// Maintenant on doit récupérer les 10 dernières entrées de la table // On se connecte d'abord à MySQL :
mysql_connect("*****", "*****", "****"); mysql_select_db("*****");
// On utilise la requête suivante pour récupérer les 10 derniers messages : $reponse = mysql_query("SELECT * FROM com WHERE id_jeux = '$id' ORDER BY ID DESC LIMIT 0,10");
// On se déconnecte de MySQL mysql_close();
// Puis on fait une boucle pour afficher tous les résultats : while ($donnees = mysql_fetch_array($reponse) ) { ?>
<p><strong><?php echo $donnees['pseudo']; ?></strong> : <?php echo $donnees['message']; ?></p>
<?php } // Fin de la boucle, le script est terminé ! ?>[/code]
voici ma table com :
[code] CREATE TABLE com ( id INT NOT NULL AUTO_INCREMENT, pseudo VARCHAR(255) NOT NULL, message VARCHAR(255) NOT NULL, id_jeux INT NOT NULL, PRIMARY KEY(id) ) TYPE=MyISAM;[/code]
Je ne comprend vraiment pas pourquoi cela ne fonctionne pas sur le web alors que j'exporte ma table qui fonctionne treès bien en local.
| | |
| |
| Publicité |
|
| | Malcolm | Posté le 03/12/2006 à 14:51 | Astucien
7194 Messages
| comment récupères-tu la variable ...? il y a 2 manières de procéder, une propre, et une... pas propre  la propre est de dire : $id_jeu = $_GET['id_jeu']; en début du script. (Après, il faut sécuriser ça). la pas propre est d'avoir une URL blabla.php?id_jeu=50 et d'utiliser directement $id_jeu (qui vaut 50 sous entendu). Pas propre parce que ça manque de sécurité... en fait, il existe une directive d'Apache qui s'appelle "register globals" (dans php.ini) qui peut avoir pour valeurs "on" ou "off". Si c'est On, alirs ?id_jeu=50 te donnera accès dans ta page à $id_jeu = 50; et off ... bin il faut passer par un $_GET[id_jeu'] pour la récupérer. Je pense qu'en local (tu es sous easyPHP ?) tu dois l'avoir à On et à Off sur le web. Pour ça que ça marche une fois sur 2. Autre chose, il se peut que dans ton urlm, la variable ne soit pas définie. donc mon code plus haut devient : if (isset($_GET['id_jeu'])) { $id_jeu = $_GET['id_jeu']; } else { $id_jeu = 0; }
Ainsi tu es sûr d'avoir une valeur dans ta variable tt le temps. Maintenant pour la sécurité, pour être certain qu'on ne modifie pas ton url avec ?id_jeu=Hacked By PafLeChien, tu castes (transtypage) la récupération de la variable : $id_jeu = sprintf("%d",$_GET['id_jeu']);
ainsi, PHP retournera avec sprintf %d la valeur numérique de id_jeu de l'URL, et si un gugusse s'amuse à marquer n'importe quoi (lettres) ça retourne zéro. Tu es sûr au final d'avoir un chiffre dans id_jeu. Dernier truc : mysql_query("INSERT INTO com VALUES('', '$pseudo', '$message', '$id')");
il vaut mieu, AMHA séparer la requête de son exécution. donc $req_insertcom = "INSERT INTO ...." puis mysql_query($req_insertcom); Et enfin, fais attention au danger de l'injection SQL... | | | | | wbdzgnr | Posté le 03/12/2006 à 15:10 | Petit astucien
18 Messages
| Salut tout d'abord merci! J'utilise esayphp et je récupère ma variable de facon "pas propre" :p Effectivement j'ai mit on dans phpini, y a til un moyen de faire pareil pour le web? Sinon avec tout ce que tu m'a gentillement dit, je vais essayer d'aller réglé ce problème! Jte remercie encore c'est sympa de ta part, je vous tient au courant | | | | | Malcolm | Posté le 03/12/2006 à 15:20 | Astucien
7194 Messages
| sur l'hébergeur, oui, il y a moyen ... La seule contrainte est d'avoir accès au fichier php.ini (de mémoire /etc/apache/php.ini je crois) mais celà n'est valable que sur un serveur dédié (voire un virtuel) mais pas sur un mutualisé. je te conseille de travailler "en propre", parce que si le register globals est passé à Off, c'est pas pour rien ... | | | | | wbdzgnr | Posté le 03/12/2006 à 15:42 | Petit astucien
18 Messages
| | | | | | wbdzgnr | Posté le 03/12/2006 à 18:38 | Petit astucien
18 Messages
| le id_jeux reste à zéro ce qui fait qu'on voit tous les commentaires sur chaque jeux! | | | | | Malcolm | Posté le 03/12/2006 à 20:44 | Astucien
7194 Messages
| je ne comprends pas trop ce que tu veux faire... mais si j'ai bien suivi, dans l'idée, c'est de permettre via un formulaire (login, message) de mettre un commentaire sur le jeu n, où n est le n° de l'id dans la base ... moi je ferais ceci : page ajout_commentaire.php <?php if (!isset($_POST['submit'])) // formulaire non validé, on l'affiche { ?> <form id="ajout_commentaire" method="post" action="?id_jeu=<?php echo $id_jeu; ?>"> <p><label for="pseudo">Pseudo :</label><input type="text" id="pseudo" name="pseudo" /></p> <p><label for="message">Message :</label><textarea id="message" name="message" cols="50" rows="8"></textarea></p> <p><input type="submit" name="submit" value="Enregistrer mon commentaire" /></p> </form> <?php } else { // formulaire validé, on le traite $pseudo = (isset($_POST['pseudo'])) ? htmlentities(addslashes(sprintf("%s",$_POST['pseudo']))) : ''; $pseudo = (isset($_POST['message'])) ? htmlentities(addslashes(sprintf("%s",$_POST['message']))) : ''; $id_jeu = (isset($_GET['id_jeu'])) ? abs(sprintf("%d",$_GET['id_jeu'])) : 0;
if ($id_jeu == 0) { echo "<p>Non, pas par ici.</p>"; } else { // on teste si les variables sont pleines ou non if (($pseudo != '') && ($message != '')) { // préparation de la requête SQL $req_ajoutmessage = sprintf("INSERT INTO com VALUES ('','%s','%s','%d');",$pseudo,$message,$id_jeu);
// connexion mysql $host_cnx ="localhost"; $db_cnx = "ma_base_de_donnees"; $user_cnx = "utilisateur_sql"; $pwd_cnx = "mdp_mysql"; $conn = mysql_connect($host_cnx, $user_cnx, $pwd_cnx) or die(mysql_error()); mysql_select_db($db_cnx, $conn) or die(mysql_error());
// Exécution de l'ajout du message if (mysql_query($req_ajoutmessage)) { echo "<p>Message bien enregistré !</p>"; } else { echo "<p>Message non enregistré, veuillez réessayer SVP !</p>"; } mysql_close(); } else { // le pseudo, le message ou les 2 variables sont vides echo "<p>Vous n'avez pas correctement rempli le formulaire...</p>"; } }; // fin du if ($id_jeu == 0) }; // fin du if (!isset($_POST['submit'])) ?>
et une petite page pour lister les 10 derniers commentaires (éventuellement "include" ...) page derniers_commentaires.php $id_jeu = (isset($_GET['id_jeu'])) ? abs(sprintf("%d",$_GET['id_jeu'])) : 0;
// connexion mysql $host_cnx ="localhost"; $db_cnx = "ma_base_de_donnees"; $user_cnx = "utilisateur_sql"; $pwd_cnx = "mdp_mysql"; $conn = mysql_connect($host_cnx, $user_cnx, $pwd_cnx) or die(mysql_error()); mysql_select_db($db_cnx, $conn) or die(mysql_error());
// Requête de récupération $req_derniersmsg = sprintf("SELECT pseudo, message FROM com WHERE id_jeu='%d' LIMIT 0,10;",$id_jeu); $derniersmsg = mysql_query($req_derniersmsg) or die(mysql_error());
while ($commentaire = mysql_fetch_array($derniersmsg)) { echo "".$commentaire['pseudo']." a écrit : ".$commentaire['message']." "; }
mysql_close(); ?>
Quelques remarques en vrac : - mettre les identifiants de connexion dans un fichier à part serait mieux. Tu fais un include (ou require) de ce fichier par là suite... - éviter les SELECT *, si demain tu ajoutes 15 champs dans ta table, ça fait bcp d'infos à rapatrier alors que tu n'en utilises que 2 - je suis parti ici sur un doctype xHTML strict, mais tu peux tout à fait l'adapter à un HTML (en fermant les input par > et non />) - pour l'id_jeu, si tu inclues la 2nde page après qu'il ait été récupéré par la première, tu peux l'omettre - tu seras ss doute amené à modifier le traitement du formulaire contre le spam d'URL ... bien qu'elles ne soient pas exécutées, le formulaire, lui, peut être envoyé. - tu devras aussi remettre tes couleurs... - j'espère ne pas avoir fait de faute de frappe dans ce script, logiquement non. Modifié par Malcolm le 03/12/2006 21:12 | | | | | wbdzgnr | Posté le 03/12/2006 à 22:14 | Petit astucien
18 Messages
| Franchement, je te dit un grand merci, c'est Super sympa de passer du temps a m'aider. Néanmoins il reste quand même un problème : Toujours comme avant, en local cela fonctionne presque parfaitement ( le pseudo ne s'affiche pas mais c'est le message qui s'affiche a la place du pseudo, le message lui s'affiche bien) Sur le web, lorsque je rempli le formulaire le message qui s'affichent est : Vous n'avez pas correctement rempli le formulaire... je vais donc voir dans ma BDD et rien ne s'est inséré car ce message s'affiche lorsque qu'on ne rempli pas le formulaire et pourtant je le rempli! j'ai en fait mi le formulaire ainsi que l'affiche des message sur la même page, je ne pense pas avoir fait d'erreur étant donné que cela fonctionne encore une fois en local. jeux.php : if (!isset($_POST['submit'])) // formulaire non validé, on l'affiche { ?> Pseudo : Message : } else { // formulaire validé, on le traite $pseudo = (isset($_POST['pseudo'])) ? htmlentities(addslashes(sprintf("%s",$_POST['pseudo']))) : ''; $pseudo = (isset($_POST['message'])) ? htmlentities(addslashes(sprintf("%s",$_POST['message']))) : ''; $id_jeu = (isset($_GET['id'])) ? abs(sprintf("%d",$_GET['id'])) : 0; if ($id_jeu == 0) { echo " Non, pas par ici. "; } else { // on teste si les variables sont pleines ou non if (($pseudo != '') && ($message != '')) { // préparation de la requête SQL $req_ajoutmessage = sprintf("INSERT INTO com VALUES ('','%s','%s','%d');",$pseudo,$message,$id_jeu); // connexion mysql $host_cnx ="****"; $db_cnx = "****"; $user_cnx = "****"; $pwd_cnx = "****"; $conn = mysql_connect($host_cnx, $user_cnx, $pwd_cnx) or die(mysql_error()); mysql_select_db($db_cnx, $conn) or die(mysql_error()); // Exécution de l'ajout du message if (mysql_query($req_ajoutmessage)) { echo " Message bien enregistré ! "; } else { echo " Message non enregistré, veuillez réessayer SVP ! "; } mysql_close(); } else { // le pseudo, le message ou les 2 variables sont vides echo " Vous n'avez pas correctement rempli le formulaire... "; } }; // fin du if ($id_jeu == 0) }; // fin du if (!isset($_POST['submit'])) ?> // connexion mysql $host_cnx ="****"; $db_cnx = "****"; $user_cnx = "****"; $pwd_cnx = "****"; $conn = mysql_connect($host_cnx, $user_cnx, $pwd_cnx) or die(mysql_error()); mysql_select_db($db_cnx, $conn) or die(mysql_error()); // Requête de récupération $req_derniersmsg = sprintf("SELECT pseudo, message FROM com WHERE id_jeux='%d' LIMIT 0,10;",$id_jeu); $derniersmsg = mysql_query($req_derniersmsg) or die(mysql_error()); while ($commentaire = mysql_fetch_array($derniersmsg)) { echo " ".$commentaire['pseudo']." a écrit : ".$commentaire['message']." "; } mysql_close(); ?> NB : l'id que je reçoit sur jeux.php est de type : j'ai donc mi : $id_jeu = (isset($_GET['id'])) ? abs(sprintf("%d",$_GET['id'])) : 0; au lieu de : $id_jeu = (isset($_GET['id_jeu'])) ? abs(sprintf("%d",$_GET['id_jeu'])) : 0; Modifié par wbdzgnr le 03/12/2006 22:16 | | | | | Malcolm | Posté le 03/12/2006 à 22:31 | Astucien
7194 Messages
| bien vu, pour l'id du jeu, ça dépend du paramètre que tu passes par URL. en fait j'ai regardé, c'est tout c*n  tu as à un moment : // formulaire validé, on le traite juste en dessous, je récupère 2x le pseudo ... il faut lire : // formulaire validé, on le traite $pseudo = (isset($_POST['pseudo'])) ? htmlentities(addslashes(sprintf("%s",$_POST['pseudo']))) : ''; $message = (isset($_POST['message'])) ? htmlentities(addslashes(sprintf("%s",$_POST['message']))) : ''; $id_jeu = (isset($_GET['id_jeu'])) ? abs(sprintf("%d",$_GET['id_jeu'])) : 0;
| | | | | wbdzgnr | Posté le 03/12/2006 à 22:39 | Petit astucien
18 Messages
| Looooool j'avais même pas fais attention a ca!! jcroyais que ca venait des : ('','%s','%s','%d') etc car je n'ai jamais utilisé ca avant aujourd'hui :p Sérieusement t'as trop assuré, je te remercie vraiment car j'ai galéré dessus des jours et des jours! et toi t'arrive et hop en 10 minutes tu m'a résolu mon problème! Encore un grand merci et bonne soirée!! | | | | | Malcolm | Posté le 03/12/2006 à 23:26 | Astucien
7194 Messages
| non, non, le %s et le %d justement sont des opérateurs de transtypage. La fonction sprintf retourne une chaine de caractères (string print function) avec dans cette chaine des marqueurs spéciaux. On trouve ainsi le %s qui veut dire "des lettres", le %d qui veut dire "décimal" (3.1415 en %d sera affiché 3), le %f qui veut dire float (flottant) et là le pi sera affiché 3.1415, le %h qui est l'hexadécimal ... tu peux aussi faire %3.3d qui te donnera un décimal avec une partie entière et une partie décimale de 3 chiffres pour cet exemple. Enfin, sprintf prend en arguments la chaine qui sera retournée contenant ces fameux marqueurs, et, dans l'ordre d'apparition dans la chaine, les variables ... Ainsi, si tu écris : $nom = "Malcolm"; // lettres $age = 0; // entier (int) sprintf("Ici %s qui parle, j'ai %d ans",$nom, $age); => affiche Ici Malcolm qui parle, j'ai 0 ans. sprintf("Ici %s qui parle, j'ai %d ans", $age, $nom); => affiche Ici 0 qui parle, j'ai 0 ans car "Malcolm" en %d devient 0. | | | | | wbdzgnr | Posté le 04/12/2006 à 01:22 | Petit astucien
18 Messages
| ah ok! Maintenant jcomprend mieux! je comprend comme ca, mais ce truc la "%d" etc jpourrai pas le refaire tout seul, du moins pas tout de suite ;) Bonne nuit et merci encore ;) | | | |
| | Haut de la page |
| | Inscrivez-vous ! |
- Posez vos questions
- Résolvez vos problèmes
- Aidez les autres
- Participez et créez vos discussions
- Dialoguez en privé avec d'autres membres
- Suivez vos sujets préférés
- Affichez les signatures des membres
|
|