Insertion impossible en BDD

Résolu/Fermé
Eylun - 1 mars 2014 à 13:58
 Eylun - 2 mars 2014 à 21:07
Bonjour,

Ayant eu satisfaction la dernière fois, je me permets de revenir vers vous pour un soucis quelque peu dérangeant.

J'ai un système de message privé sur mon site. Avant que je le sécurise, tout se passait très bien. A présent, impossible d'envoyer le moindre MP.

Mes identifiants de connexion à la base de données, que ça soit en local ou sur le serveur, sont justes.

Mes variables, de même. Ainsi que mes nom de champ de la table qui recense mes messages privés.

Etant amateur dans ce domaine, j'avoue que je suis complètement perdue depuis avec ce problème. J'ai tenté plusieurs façons de faire, sans succès.

Bref.

Tout d'abord, voici le formulaire :


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<form method="post" action="script_mp.php#message_envoye">
<b>Destinataire :</b>
<select name="destinataire">
<?php
//Chercher tous les pseudos de la table membre
$req_membres = $bdd->query("SELECT pseudo FROM membres");
//Afficher via une boucle !
while($membres_destinataires = $req_membres->fetch())
{
echo "<option value='".$membres_destinataires['pseudo']."'>".$membres_destinataires['pseudo']."</option>";
}
?>
</select>
<br />
<b>Titre :</b>
<input type="text" name="objet_mp" />
<br />
<b>Message :</b>
<br />
<textarea name="contenu_mp" cols="80" rows="20"></textarea>
<br />
<b>Ajouter un cadeau :</b>
<select name="cadeau">
<option value="aucun">Aucun</option>
<?php
//Pareil que plus haut, sauf qu'on utilise la table inventaires_joueurs
$objets_sur_soi = "oui";
$req_inventaire = $bdd->prepare("SELECT nom_objet,num_inventaire FROM inventaires_joueurs WHERE pseudo=:pseudo AND sur_soi=:objets_sur_soi");
$req_inventaire->bindParam(":pseudo",$pseudo,PDO::PARAM_STR);
$req_inventaire->bindParam(":objets_sur_soi",$objets_sur_soi,PDO::PARAM_STR);
$req_inventaire->execute();

while($inventaire = $req_inventaire->fetch())
{
echo "<option value='".$inventaire['num_inventaire']."'>".$inventaire['nom_objet']."</option>";
}
?>
</select>
<br />
<b>Ajouter des opales :</b>
<input type="text" name="opales" value="0" /><i>Seulement en chiffre !</i>
<br />
<input type="submit" value="Envoyer !" />
</form>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Les "opales" sont l'équivalent de l'argent sur mon mmo en ligne. Le "cadeau" liste tous les objets que la personne possède dans son inventaire. Sinon, seulement "aucun" s'affiche.

Comme vous le voyez, afin d'éviter un F5 qui renverrait ces deux données et provoquerait donc des erreurs, je traite le MP sur une autre page.

Pour le moment, ayant tenté de corriger le soucis, je n'ai pas encore mis la redirection sur le script. J'ai aussi l'intention d'effacer mes variables mises en "echo" pour vérifier si elles étaient remplies comme il le faut (et c'est le cas !).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

session_start();
date_default_timezone_set('Europe/Paris');
if(!isset($_SESSION['num_membre']))
{
header('location: index.php');
}
else
{
include ("connexion_bdd.php");

//Traitement du formulaire. L'envoi ne se fait que si les champs obligatoires sont remplis.
if(!empty($_POST['destinataire']))
{
if(!empty($_POST['objet_mp']))
{
if(!empty($_POST['contenu_mp']))
{
$emetteur = $_SESSION['pseudo'];
$ava_emetteur = $_SESSION['avatar'];
$argent_actuel = $_SESSION['argent'];

//On déclare les variables dont on aura besoin pour remplir la table
$destinataire = $_POST['destinataire'];
$date_envoi = date('Y-m-d H:i:s');
$objet_mp = htmlspecialchars($_POST['objet_mp']);
$message = htmlspecialchars($_POST['contenu_mp']);
$cadeau = $_POST['cadeau']; //Prendra le numéro de l'inventaire en valeur !! ou "aucun".
$opales = htmlspecialchars($_POST['opales']); //0 ou autre chose.

$lu_par_emetteur = "oui";
$lu_par_destinataire = "non";
$supprime_par_emetteur = "non";
$supprime_par_destinataire = "non";

//Traitement du bbcode s'il y a
include("script_bbcode.php");

echo "Emetteur :</b>".$emetteur."
<br /><b>Avatar Emetteur :</b>".$ava_emetteur."
<br /><b>Destinataire :</b>".$destinataire."
<br /><b>date envoi :</b>".$date_envoi."
<br /><b>Objet mp :</b>".$objet_mp."
<br /><b>Message :</b>".$message."
<br /><b>cadeau :</b>".$cadeau."
<br /><b>Opales :</b>".$opales."
<br /><b>Lu par émetteur :</b>".$lu_par_emetteur."
<br /><b>Lu par destinataire :</b>".$lu_par_destinataire."
<br /><b>Supprimé par émetteur :</b>".$supprime_par_emetteur."
<br /><b>Supprimé par destinataire :</b>".$supprime_par_destinataire."";
echo "<br /><br /><b>Argent actuel :</b>".$argent_actuel."";

//On définit la soustraction à faire
$opales_enleves = $argent_actuel - $opales;

//Mais cela peut seulement s'envoyer si le résultat n'est pas négatif !
if ($opales_enleves < 0)
{
echo "<b><font color='red'>Vous n'avez pas assez d'opales !</font></b>";
//Et dans ce cas, les opales ne sont pas retirés du compte non-plus.
}
else
{
//Sinon, on envoit les opales et on déduit de la variable argent.
$argent = $bdd->prepare("UPDATE membres SET argent=:opales_enleves WHERE pseudo=:emetteur");
$argent->bindParam(":opales_enleves",$opales_enleves,PDO::PARAM_STR);
$argent->bindParam(":emetteur",$emetteur,PDO::PARAM_STR);
$argent->execute();

//On met à jour la valeur de session
$_SESSION['argent'] = $opales_enleves;

if($cadeau != "aucun")
{
//Récupérer le numéro d'objet associé à l'objet qui a été envoyé
$req_num_objet_envoye = $bdd->prepare("SELECT num_objet FROM inventaires_joueurs WHERE num_inventaire=:cadeau");
$req_num_objet_envoye->bindParam(":cadeau",$cadeau,PDO::PARAM_STR);
$req_num_objet_envoye->execute();
$resultat_num_objet_envoye = $req_num_objet_envoye->fetch();
$num_objet_envoye = $resultat_num_objet_envoye['num_objet'];

//On envoit aussi le message, donc insertion en bdd
$envoyer = $bdd->prepare("INSERT INTO messages_prives
(emetteur,avatar_emetteur,destinataire,date_envoi,objet_mp,contenu_mp,cadeau_mp,opales,mp_lu_par_emetteur,mp_lu_par_destinataire,supprime_par_emetteur,supprime_par_destinataire)
VALUES (:emetteur,:ava_emetteur,:destinataire,:date_envoi,:objet_mp,:message,:num_objet_envoye,:opales,:lu_par_emetteur,:lu_par_destinataire,:supprime_par_emetteur,:supprime_par_destinataire)");
$envoyer->bindParam(":emetteur",$emetteur,PDO::PARAM_STR);
$envoyer->bindParam(":ava_emetteur",$ava_emetteur,PDO::PARAM_STR);
$envoyer->bindParam(":destinataire",$destinataire,PDO::PARAM_STR);
$envoyer->bindParam(":date_envoi",$date_envoi,PDO::PARAM_STR);
$envoyer->bindParam(":objet_mp",$objet_mp,PDO::PARAM_STR);
$envoyer->bindParam(":message",$message,PDO::PARAM_STR);
$envoyer->bindParam(":num_objet_envoye",$num_objet_envoye,PDO::PARAM_STR);
$envoyer->bindParam(":opales",$opales,PDO::PARAM_STR);
$envoyer->bindParam(":lu_par_emetteur",$lu_par_emetteur,PDO::PARAM_STR);
$envoyer->bindParam(":lu_par_destinataire",$lu_par_destinataire,PDO::PARAM_STR);
$envoyer->bindParam(":supprime_par_emetteur",$supprime_par_emetteur,PDO::PARAM_STR);
$envoyer->bindParam(":supprime_par_destinataire",$supprime_par_desinataire,PDO::PARAM_STR);
$envoyer->execute();

//Supprimer l'objet de l'inventaire du joueur !
$plus = $bdd->prepare("DELETE FROM inventaires_joueurs WHERE num_inventaire=:cadeau AND pseudo=:emetteur");
$plus->bindParam(":cadeau",$cadeau,PDO::PARAM_STR);
$plus->bindParam(":emetteur",$emetteur,PDO::PARAM_STR);
$plus->execute();

//Ancre
echo "<a name='message_envoye'></a>";
//Et on confirme aussi
echo "<b><font color='red'>Votre message a bien été envoyé ! Celui-ci a été transféré dans votre coffre !</font></b>";
}
else
{
//On insère tout simplement le MP en BDD
$envoyer = $bdd->prepare("INSERT INTO messages_prives
(emetteur,avatar_emetteur,destinataire,date_envoi,objet_mp,contenu_mp,cadeau_mp,opales,mp_lu_par_emetteur,mp_lu_par_destinataire,supprime_par_emetteur,supprime_par_destinataire)
VALUES (:emetteur,:ava_emetteur,:destinataire,:date_envoi,:objet_mp,:message,:cadeau,:opales,:lu_par_emetteur,:lu_par_destinataire,:supprime_par_emetteur,:supprime_par_destinataire)");
$envoyer->bindParam(":emetteur",$emetteur,PDO::PARAM_STR);
$envoyer->bindParam(":ava_emetteur",$ava_emetteur,PDO::PARAM_STR);
$envoyer->bindParam(":destinataire",$destinataire,PDO::PARAM_STR);
$envoyer->bindParam(":date_envoi",$date_envoi,PDO::PARAM_STR);
$envoyer->bindParam(":objet_mp",$objet_mp,PDO::PARAM_STR);
$envoyer->bindParam(":message",$message,PDO::PARAM_STR);
$envoyer->bindParam(":cadeau",$cadeau,PDO::PARAM_STR);
$envoyer->bindParam(":opales",$opales,PDO::PARAM_STR);
$envoyer->bindParam(":lu_par_emetteur",$lu_par_emetteur,PDO::PARAM_STR);
$envoyer->bindParam(":lu_par_destinataire",$lu_par_destinataire,PDO::PARAM_STR);
$envoyer->bindParam(":supprime_par_emetteur",$supprime_par_emetteur,PDO::PARAM_STR);
$envoyer->bindParam(":supprime_par_destinataire",$supprime_par_desinataire,PDO::PARAM_STR);
$envoyer->execute();

//Et on confirme aussi
echo "<b><font color='red'>Votre message a bien été envoyé !</font></b>";
//Ancre
echo "<a name='message_envoye'></a>";
}
}
}
else
{
echo "<b><font color='red'>Vous n'avez pas entré de message !</font></b>";
//Ancre
echo "<a name='message_envoye'></a>";
}
}
else
{
echo "<b><font color='red'>Vous n'avez pas entré de titre !</font></b>";
//Ancre
echo "<a name='message_envoye'></a>";
}
}
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A la base, j'avais mis destinataire, objet_mp, message et tout dans un seul if, mais ça ne fonctionnait pas non-plus. Ni en ajoutant la vérification des valeurs cadeau et opales.

J'avoue que je ne parviens pas du tout à voir mon erreur. Surtout que comme je vous l'ai dit, toutes mes variables censées s'enregistrer s'affichent nickelles. J'utilise Chrome.

Bref, un grand merci d'avance à la personne qui saura me faire voir mon éventuelle erreur !
A voir également:

2 réponses

Je me doute que l'erreur doit paraître idiote pour les confirmés que vous êtes, mais il y a un début à tout. D'autant plus que je continue de chercher de mon côté, sans grand succès.

Un grand merci d'avance à la personne qui saura me faire voir mon erreur, que je ne parviens pas à voir.
0
Bon, ben finalement, ce n'était qu'illusion, dès qu'on poste un truc qui semble simplissime, on est relégué(e) au rang d'incapable.

Il serait grand temps que les pros de l'informatique aient plus d'ouverture d'esprit. J'ai posté en espérant une réponse, mon sujet est tombé à l'eau...j'aurai espéré que la mentalité d'ici était mieux.

Je suis novice, et j'ai continué à chercher de mon côté, et finalement, voici la solution pour ceux qui, comme moi, sont novices et rencontreraient le problème :

Pour ce genre de cas où il faut envoyer des items et/ou transférer de l'argent virtuel à un autre joueur, il faut traiter au cas par cas, sans oublier de mettre à jour les variables de session si jamais il y en a (et c'était mon cas avec la variable de l'argent).

Comme quoi, même en étant novice, on finit aussi par trouver.

Cordialement.
0