> Tous les forumsForum des Webmasters

 En local cela fonctionne mais pas sur le web.Sujet résolu
Statut du sujet : RESOLU Imprimer
 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.
 Afficher le profil de wbdzgnrEnvoyer un message privé à wbdzgnr
 
 
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...

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 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

Afficher le profil de wbdzgnrEnvoyer un message privé à wbdzgnr
 Revenir en haut de la page
 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 ...

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 wbdzgnr  Posté le 03/12/2006 à 15:42  
Petit astucien

18 Messages
Afficher le profil de wbdzgnrEnvoyer un message privé à wbdzgnr
 Revenir en haut de la page
 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!
Afficher le profil de wbdzgnrEnvoyer un message privé à wbdzgnr
 Revenir en haut de la page
 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
Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 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
Afficher le profil de wbdzgnrEnvoyer un message privé à wbdzgnr
 Revenir en haut de la page
 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;

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 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!!

Afficher le profil de wbdzgnrEnvoyer un message privé à wbdzgnr
 Revenir en haut de la page
 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.

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 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 ;)

Afficher le profil de wbdzgnrEnvoyer un message privé à wbdzgnr
 Revenir en haut de la page
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

TOUT EST GRATUIT !

Je crée mon compte




Les sujets pertinents liés
Pb accès serveur web ! :-(
Comment tester en local avec Firefox ?
Plagiat : suis-je trop pointilleuse ?
formulaire php, de l'aide s'il vous plait...
Problème Joomla
Comment héberger moi même mon site
Site Web planté
un menu commun
Base de données
debutant avec easyphp, aimerais comprendre logique
hebergement en .fr et referencement
transferer son site sur internet
URL Rewriting et Hebergeur...
XHTML
Javascript : photos défilant en carrousel
erreur ftp pendt le transfert de mes fichiers !
Aide aux débutants, erreurs dans les sites web
 
Vous avez besoin d'aide ?
Des centaines d'experts sont à votre disposition sur les forums PC Astuces pour vous aider gratuitement, 24h/24, 7j/7.

Les derniers sujets résolus !



 > Tous les forumsForum des Webmasters

 
Forum PC Astuces© 1997-2008 WebastucesAller en haut de la page