Bonjour,
Voila, je suis sur la creation d'un jeu et la je refais les technologies.
J'ai deux page, une avec du HTML et une deuxieme qui est l'achat.
Sur la première je fais une JOINTURE de 2 tables.
Ensuite je fais un while et je met mes infos dedans (prix, niveau, temps).
J'ai un formulaire avec des boutons hidden dedans pour signifier les $_POST
Si je fais des var_dump ou meme si j'affiche l'id il me met bien le bon ID par rapport à la technologie demandé.
Ensuite quand je valide, il veut m'update le dernier ID. Meme si je recupère le $_POST['id_cache'] il prend pas en compte.
Voici les codes:
<?php
require_once '../design/header.php';
require_once '../controleur/function.php';
$q=$bdd->prepare('SELECT tec.id, tec.nom, tec.image, tec.description, tj.prix_gold, tj.prix_titane, tj.prix_cristal, tj.prix_orinia, tj.prix_orinium, tj.prix_organique,tj.nombre_chercheur,tj.temps,tj.niveau,tj.id_technologie,tj.id_membre FROM technologie AS tec LEFT JOIN technologie_joueur AS tj ON tec.id=tj.id_technologie WHERE tj.id_membre = ? ORDER BY tec.id ASC');
$q->execute(array($idmembre));
while($r=$q->fetch()) {
$ct=$bdd->prepare('SELECT * FROM technologie_joueur WHERE id_membre= ? AND id_technologie = ?');
$ct->execute(array($id_membre,$r['id']));
$c_t=$ct->fetch();
var_dump($r['id']);
$temps = htmlentities($r['temps']);
?>
<!-- Partie à mettre dans le while -->
<div class="global">
<div class="inner_tech">
<div class="left">
<img src="<?php echo htmlentities($r['image']); ?>" alt="" />
<div class="d"><?php echo convertTime($temps); ?></div>
<?php
if(!empty($evolution_temps['technologie']))
{
if ($evolution_temps['temps'] > time())
{
$restant = ($evolution_temps['temps']-time());
echo "<script>compteARebours(".$restant.",'".$evolution_temps['nom']."','technologie.php');</script>";
echo '<div id="rebours_'.htmlentities($evolution_temps['nom']).'"><i>Chargement du compte à rebours...</i></div>';
}
else
{
echo '<i>Construction terminée</i><br /><br />';
/*
$suppr=$bdd->prepare('DELETE FROM construction_techno WHERE joueur = ?');
$suppr->execute(array($idmembre));
*/
header('Refresh:0');
}
}
else
{
echo ' ';
}
?>
</div>
<div class="right">
<div class="ri1">
<div class="r1"><?php echo htmlentities($r['nom']); ?></div>
<div class="r2">Niveau actuel : <?php echo htmlentities($r['niveau']); ?> id : <?php echo htmlentities($r['id']); ?></div>
</div>
<div class="ri2">
<div class="rc1">
<ul>
<li>Titane :</li>
<li>Or :</li>
<li>Cristal :</li>
<li>Orinia :</li>
<li>Orinium :</li>
<li>Organique :</li>
<li>Chercheurs :</li>
</ul>
</div>
<div class="rc2">
<ul>
<li><?php echo htmlentities($r['prix_gold']); ?></li>
<li><?php echo htmlentities($r['prix_titane']); ?></li>
<li><?php echo htmlentities($r['prix_cristal']); ?></li>
<li><?php echo htmlentities($r['prix_orinia']); ?></li>
<li><?php echo htmlentities($r['prix_orinium']); ?></li>
<li><?php echo htmlentities($r['prix_organique']); ?></li>
<li><?php echo htmlentities($r['nombre_chercheur']); ?></li>
</ul>
</div>
</div>
<div class="ri3">
<form name="niveau_sup" action="../modele/achat_technologie.php" method="post">
<input type="hidden" name="id_cache" value="<?php echo htmlentities($r['id']) ?>">
<input type="hidden" name="nom" value="<?php echo htmlentities($r['nom']) ?>">
<input type="hidden" name="nombre_chercheur" value="<?php echo htmlentities($r['nombre_chercheur']) ?>">
<input type="hidden" name="niveau" value="<?php echo htmlentities($r['niveau']) ?>">
<input type="hidden" name="prix_gold" value="<?php echo htmlentities($r['prix_gold']) ?>">
<input type="hidden" name="prix_titane" value="<?php echo htmlentities($r['prix_titane']) ?>">
<input type="hidden" name="prix_cristal" value="<?php echo htmlentities($r['prix_cristal']) ?>">
<input type="hidden" name="prix_orinia" value="<?php echo htmlentities($r['prix_orinia']) ?>">
<input type="hidden" name="prix_orinium" value="<?php echo htmlentities($r['prix_orinium']) ?>">
<input type="hidden" name="prix_organique" value="<?php echo htmlentities($r['prix_organique']) ?>">
<input type="hidden" name="temps" value="<?php echo htmlentities($r['temps']) ?>">
<?php
if($c['construction'] <= 1)
{
?>
<input type="submit" class="upgrade" value="">
<?php
}
else
{
echo " Technologie en cours de développement.";
}
?>
<form>
</div>
<div class="desc">
<?php echo htmlentities($r['description']); ?>
</div>
</div>
</div>
</div>
<!-- Fin du while -->
<?php } ?>
<?php require_once '../design/footer.php'; ?>
Et la page de traitement:
<?php
if($_POST)
{
require_once 'connexion_bdd.php';
if(!empty($_POST['id_cache']) || !empty($_POST['nom']) || !empty($_POST['nombre_chercheur']) || !empty($_POST['niveau']) || !empty($_POST['prix_gold']) || !empty($_POST['prix_titane']) || !empty($_POST['prix_cristal']) || !empty($_POST['prix_orinia']) || !empty($_POST['prix_orinium']) || !empty($_POST['prix_organique']) || !empty($_POST['temps']))
{
$id_planete_utilise=htmlentities($_SESSION['planete_utilise']);
$idmembre=$_SESSION['id'];
$req_ress=$bdd->prepare("SELECT * FROM ressource WHERE id_planete = ? "); /*récupère la liste des ressources du joueur */
$req_ress->execute(array($id_planete_utilise));
$ressource=$req_ress->fetch();
$pop=$bdd->prepare('SELECT * FROM population WHERE id_planete = ? '); /*Permet d'afficher infos des troupes distribué */
$pop->execute(array($id_planete_utilise));
$population=$pop->fetch();
// REDEFINIR VARIABLE //
$id_technologie=strip_tags($_POST['id_cache']);
$niveau_technologie=strip_tags($_POST['niveau']);
$temps=strip_tags($_POST['temps']);
$delai=(time()+$temps);
$prix_gold=strip_tags($_POST['prix_gold']);
$prix_titane=strip_tags($_POST['prix_titane']);
$prix_cristal=strip_tags($_POST['prix_cristal']);
$prix_orinia=strip_tags($_POST['prix_orinia']);
$prix_orinium=strip_tags($_POST['prix_orinium']);
$prix_organique=strip_tags($_POST['prix_organique']);
$nombre_chercheur=strip_tags($_POST['nombre_chercheur']);
$goldstock=htmlentities($ressource['gold']);
$titanestock=htmlentities($ressource['titane']);
$cristalstock=htmlentities($ressource['cristal']);
$oriniastock=htmlentities($ressource['orinia']);
$oriniumstock=htmlentities($ressource['orinium']);
$organiquestock=htmlentities($ressource['organique']);
$chercheur_preforme=htmlentities($population['chercheur']);
if ($chercheur_preforme >= $nombre_chercheur) // Permet de vérifier qu'il possède assez de chercheur. Sinon erreur.
{
if (($goldstock >= $prix_gold) AND ($titanestock >= $prix_titane) AND ($cristalstock >= $prix_cristal) AND
($oriniastock >= $prix_orinia) AND ($oriniumstock >= $prix_orinium) AND ($organiquestock >= $prix_organique))
{
$stock_chercheur_preforme=$chercheur_preforme-$nombre_chercheur; // CALCUL NOUVEAU CHERCHEURS
$req_deduction_chercheur_preforme=$bdd->prepare("UPDATE population SET chercheur = ? WHERE id_planete = ?");
$req_deduction_chercheur_preforme->execute(array($stock_chercheur_preforme,$id_planete_utilise));
// DEFINIR LES RESSOURCES
$prix_achat_gold = $goldstock-$prix_gold;
$prix_achat_titane = $titanestock-$prix_titane;
$prix_achat_cristal = $cristalstock-$prix_cristal;
$prix_achat_orinia = $oriniastock-$prix_orinia;
$prix_achat_orinium = $oriniumstock-$prix_orinium;
$prix_achat_organique = $organiquestock-$prix_organique;
// UPDATE DES RESSOURCES
$req_achat_gold = $bdd->prepare('UPDATE ressource SET gold = ?, titane = ?, cristal = ?, orinia = ?, orinium = ?, organique = ? WHERE id_planete = ? AND id_membre = ? ');
$req_achat_gold->execute(array($prix_achat_gold, $prix_achat_titane, $prix_achat_cristal, $prix_achat_orinia, $prix_achat_orinium, $prix_achat_organique, $id_planete_utilise, $idmembre));
// SYSTEME DE POINTS
$point_organique=$prix_organique/1000;
$point_orinium=$prix_orinium/1000;
$point_orinia=$prix_orinia/1000;
$point_cristal=$prix_cristal/1000;
$point_gold=$prix_gold/1000;
$point_titane=$prix_titane/1000;
/* COEFFICIANT MULTIPLICATEUR */
$aug_temps=1.6;
$coeff=1.3;
$req_multip=$bdd->prepare('UPDATE technologie_joueur SET prix_gold = prix_gold*:prixgold, prix_titane = prix_titane*:prixtitane, prix_cristal = prix_cristal*:prixcristal, prix_orinia = prix_orinia*:prixorinia, prix_orinium = prix_orinium*:prixorinium, prix_organique = prix_organique*:prixorganique, nombre_chercheur = nombre_chercheur*:nombrechercheur, temps = temps*:temps, construction = 1 WHERE id_membre = :idmembre AND id_technologie = :id');
$req_multip->execute(array(':prixgold' => $coeff, ':prixtitane' => $coeff,':prixcristal' => $coeff,':prixorinia' => $coeff, ':prixorinium' => $coeff, ':prixorganique' => $coeff, ':nombrechercheur' => $coeff, ':temps' => $aug_temps, ':idmembre' => $idmembre, ':id' => $id_technologie ));
// DEFINI UN BATIMENT EN CONSTRUCTION
$req_up_construc=$bdd->prepare('INSERT INTO construction_techno (joueur, technologie, time) VALUES (:joueur, :technologie, :time)');
$req_up_construc->execute(array('joueur' => $idmembre, 'technologie' => $id_technologie, 'time'=> $delai));
echo "<font color='green'> Technologie en développement .</font>";
header('Location: ../vue/technologie.php');
}
else
{
echo "<font color='red'> Vous n'avez pas les ressources nécéssaire.</font>";
}
}
else
{
echo "<font color='red'>Vous n'avez pas assez de chercheurs.</font>";
}
}
else
{
echo "<font color='red'>Tous les champs ne sont pas remplis</font>";
}
?>
Si quelqu'un à une idée ;)
Merci
Je pense que le souci se situe ici.
{
echo " Technologie en cours de développement.";
}
?>
<form>
Ce ne serait pas </form>
que tu voulais mettre ? Ca expliquerait pourquoi il prend le mauvais ID puisque tes formulaires ne sont jamais fermes.
Tu ne peux pas faire deux requêtes imbriquées sur la même connexion
le mieux serait de récupérer le résultat de la première requête dans un tableau à l'aide d'un fetchAll
et de fermer ton curseur (closeCursor) avant d'attaquer la seconde requête
EDIT: j'ai posté sans avoir vu que tu avais écris Huggy ^^
Pour information, j'ai effectué plusieurs VAR_DUMP
Le premier pour verifié dans la première page l'ID il me ressort toujours le bon et sur ma page aussi j'ai mis un echo avec l'id et tout est ok.
Par contre quand sur ma deuxieme page je fais un var_dump au ($_POST) il me ressort directement le dernier ID.
Exemple id=3 si j'ai 3 technologies...
Tu ne peux pas faire deux requêtes imbriquées sur la même connexionaroundle mieux serait de récupérer le résultat de la première requête dans un tableau à l'aide d'un fetchAllaroundet de fermer ton curseur (closeCursor) avant d'attaquer la seconde requête
Donc enfaite le formulaire avec l'action c'est pas bon? faudrait que je récupère le post dans la meme page?