JeuWeb - Crée ton jeu par navigateur
[Résolu] Problème avec requête Update - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu] Problème avec requête Update (/showthread.php?tid=1122)

Pages : 1 2


[Résolu] Problème avec requête Update - fenix - 03-11-2007

bonjour a tous me revoila. j'ai voulu creer un mode permetant da vendre des objet d'amlioration mais j'ai un problème que je n'arrive pas a resoudre j'ai fait le meme systeme que pour les autres marchand mais la sa bug Sad

Code PHP :
<?php 
function marche3($id) { // Update user profile with new item & stats.

if (isset($_POST["cancel"])) { header("Location: index.php"); die(); }

global
$userrow;

$marchequery = doquery("SELECT * FROM {{table}} WHERE id='$id' LIMIT 1", "marche");
$marcherow = mysql_fetch_array($marchequery);

if (
$userrow["gold"] < $marcherow["prix"]) { display("<img src=\"././images/shop.gif\"/><br>Vous n'avez pas assez de gils pour acheter cet objet.<br /><br />Vous pouvez <a href=\"index.php\">retourner à la ville</a>, <a href=\"index.php?do=marche\">au magasin</a>, ou utiliser les boutons directionnel de gauche pour continuer à explorer le monde.", "Acheter objets"); die(); }

if (
$marcherow["type"] == "exp") { //experience++

// New stats.
$newgold = $userrow["gold"] - $marcherow["prix"];
$newexp = $userrow["experience"] + $marcherow["attribute"]


// Final update.
$updatequery = doquery("UPDATE {{table}} SET gold='$newgold', experience='$newexp' WHERE id='".$userrow["id"]."'", "users");


} elseif (
$marcherow["type"] == "mp") { // Armor

// New stats.
$newgold = $userrow["gold"] - $marcherow["prix"];
$newmp = $userrow["maxmp"] + $marcherow["attribute"]


// Final update.
$updatequery = doquery("UPDATE {{table}} SET gold='$newgold', maxmp='$newmp' WHERE id='".$userrow["id"]."'", "users");

} elseif (
$marcherow["type"] == "hp") { // Shield

// New stats.
$newgold = $userrow["gold"] - $marcherow["prix"];
$newhp = $userrow["maxhp"] + $marcherow["attribute"]


// Final update.
$updatequery = doquery("UPDATE {{table}} SET gold='$newgold', maxhp='$newhp' WHERE id='".$userrow["id"]."'", "users");

} elseif (
$marcherow["type"] == "tp") { // Armor

// New stats.
$newgold = $userrow["gold"] - $marcherow["prix"];
$newtp = $userrow["maxtp"] + $marcherow["attribute"]


// Final update.
$updatequery = doquery("UPDATE {{table}} SET gold='$newgold', maxmp='$newtp' WHERE id='".$userrow["id"]."'", "users");


}

display("<img src=\"././images/shop.gif\"/><br>Merci d'avoir acheté cet objet.<br /><br />Vous pouvez maintenant <a href=\"index.php\">retourner à la ville</a>, <a href=\"index.php?do=marche\">au magasin</a>, ou utiliser les boutons directionnel de gauche pour continuer à explorer le monde.", "Acheter objets");

}

et plus precisement la ligne qui marche pas
Code PHP :
<?php 
// Final update.
$updatequery = doquery("UPDATE {{table}} SET gold='$newgold', experience='$newexp' WHERE id='".$userrow["id"]."'", "users");



RE: probleme avec updatequery - Sephi-Chan - 03-11-2007

Vous êtes pénibles à demander de l'aide en nous fournissant la moitié des infos utiles ! Faîtes un effort bordel ! Quel est le type d'erreur ? PHP ? SQL ? Quel est le message ? Etc.

En attendant d'en savoir plus, je me permet une critique de cette ligne :
Code PHP :
<?php 
$updatequery
= doquery("UPDATE {{table}} SET gold='$newgold', experience='$newexp' WHERE id='".$userrow["id"]."'", "users");
Outre que le fait que cette fonction est pourrie (j'ai expliqué pourquoi dans ta précédente demande d'aide (qui rappelons-le avait un titre inadapté)), tu pourrais au moins l'utiliser de manière homogène.

Sois tu concatène, sois tu le fais pas, mais ça ne sert à rien de le faire pour une variable et pas l'autre.

Deuxième chose, on encercle la variable de guillements simples ' quand le champ de la base de donnée est fait pour les chaînes de caractères. Donc si le champ est de type INT (ou SMALLINT, TINYINT, etc.), tu n'encadres pas ta variable.

De même, si tu encadres la chaîne de ta requête avec des guillemets doubles, ne concatène pas. Les guillemets doubles interprètent d'elles même les variables. Pour qu'une variable array soit comprise par les guillemets doubles, tu la protège en l'encadrant d'accolade (en l'enaccoladant, donc).

Exemple de requête cohérente :
Code PHP :
<?php 
$updatequery
= doquery("UPDATE {{table}} SET gold = $newgold, experience = $newexp WHERE id = {$userrow['id']};", "users");

Mais une fois encore je te conseille d'abandonner ta fonction doquery(), ou de l'améliorer.

Je rappelle les bienfaits de sprintf() pour ton utilisation (c'est à dire quand on ne passe pas par une variable intermédiaire (ce qui est pourtant pratique pour le debug) :

Code PHP :
<?php 
$updatequery
= mysql_query(
sprintf("UPDATE '%s' SET gold = %d, experience = %d WHERE id = %d;", "users", $newgold, $newexp, $userrow['id'])
);


Sephi-Chan


RE: probleme avec updatequery - Plume - 03-11-2007

Sephi, tu devrais faire un lien dans ta sign' afin de ne pas avoir tout le temps à répéter ça ^^

Et t'as enlevé le lien vers ton blog ? :/


RE: probleme avec updatequery - Sephi-Chan - 03-11-2007

Ben pourtant la case signature est bien cochée... :/


RE: probleme avec updatequery - fenix - 03-11-2007

bon alors voila pour être très precis


tout d'abord
les bases de donne utilisier

Code :
CREATE TABLE `rpg_marche` (
  `id` int(6) NOT NULL default '0',
  `name` varchar(255) NOT NULL default 'Aucun',
  `prix` varchar(255) NOT NULL default '',
  `description` varchar(255) NOT NULL default 'Aucun',
  `type` varchar(255) NOT NULL default 'Aucun',
  `attribute` varchar(20) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Contenu de la table `rpg_marche`
--

INSERT INTO `rpg_marche` (`id`, `name`, `prix`, `description`, `type`, `attribute`) VALUES (1, 'Expérience', '1000', 'Permet l''''achat d''''expérience pour augmenter votre niveaux', 'exp', '1'),
(2, 'MAX-HP', '1000', 'Permet d''''augmente vos MAXHP de 1 point', 'hp', '1'),
(3, 'MAX-MP', '2000', 'Permet d''''augmente vos MAXMP de 1 point', 'mp', '1'),
(4, 'MAX-TP', '1500', 'Permet d''''augmente vos MAXTP de 1 point', 'tp', '1');

ensuite la totalite des fonctions concerner
Code PHP :
<?php 
function marche() { // Displays a list of available items for purchase.

global $userrow, $numqueries;

$townquery = doquery("SELECT name,itemslistm FROM {{table}} WHERE latitude='".$userrow["latitude"]."' AND longitude='".$userrow["longitude"]."' LIMIT 1", "towns");
$townrow = mysql_fetch_array($townquery);

$itemslist = explode(",",$townrow["itemslistm"]);
$querystring = "";
foreach(
$itemslist as $a=>$b) {
$querystring .= "id='$b' OR ";
}
$querystring = rtrim($querystring, " OR ");

$marchequery = doquery("SELECT * FROM {{table}} WHERE $querystring ORDER BY id", "marche");
$page = "<img src=\"././images/shop.gif\"/><br>EN achetant mes produit vous augmenterez vos stats plus rapidement.<br /><br />Cliquez sur le nom d'un objet pour l'acheter.<br /><br />Les objets suivants sont disponibles dans cette ville:<br /><br />\n";
$page .= "<table width=\"80%\">\n";
while (
$marcherow = mysql_fetch_array($marchequery)) {
$page .= "<tr><td width=\"4%\">";
if (
$itemsrow["type"] == "exp") { $page .= "<img src=\"images/icon_weapon.gif\" alt=\"arme\" /></td>"; }
if (
$itemsrow["type"] == "mp") { $page .= "<img src=\"images/icon_armor.gif\" alt=\"armure\" /></td>"; }
if (
$itemsrow["type"] == "hp") { $page .= "<img src=\"images/icon_shield.gif\" alt=\"protection\" /></td>"; }
if (
$itemsrow["type"] == "tp") { $page .= "<img src=\"images/icon_shield.gif\" alt=\"protection\" /></td>"; }
$page .= "<td width=\"32%\"><b><a href=\"index.php?do=marche2:".$marcherow["id"]."\">".$marcherow["name"]."</a>$specialdot</b></td><td width=\"32%\">Prix: <b>".$marcherow["prix"]." gils</b></td></tr><tr><br><td colspan=4><b>Description:&nbsp; </b>".$marcherow["description"]."</td></tr>\n"; }

$page .= "</table><br />\n";
$page .= "Si vous avez changé d'avis, vous pouvez également <a href=\"index.php\">retourner à la ville</a>.\n";
$title = "Acheter des objets";

display($page, $title);

}

function
marche2($id) { // Confirm user's intent to purchase item.

global $userrow, $numqueries;

$marchequery = doquery("SELECT * FROM {{table}} WHERE id='$id' LIMIT 1", "marche");
$marcherow = mysql_fetch_array($marchequery);

if (
$userrow["gold"] < $marcherow["prix"]) { display("<img src=\"././images/shop.gif\"/><br>Vous n'avez pas assez de gils pour acheter cet objet.<br /><br />Vous pouvez <a href=\"index.php\">retourner à la ville</a>, <a href=\"index.php?do=marche\">au magasin</a>, ou utilisez les boutons directionnel de gauche pour continuer à explorer le monde.", "Acheter objets"); die(); }

if (
$marcherow["type"] == "exp") {

$page = "<img src=\"././images/shop.gif\"/><br>Vous allez acheter ".$marcherow["name"].", vous êtes d'accord?<br /><br /><form action=\"index.php?do=marche3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Oui\" /> <input type=\"submit\" name=\"cancel\" value=\"Non\" /></form>";

} elseif (
$marcherow["type"] == "mp") {

$page = "<img src=\"././images/shop.gif\"/><br>Vous allez acheter ".$marcherow["name"].", vous êtes d'accord?<br /><br /><form action=\"index.php?do=marche3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Oui\" /> <input type=\"submit\" name=\"cancel\" value=\"Non\" /></form>";

} elseif (
$marcherow["type"] == "hp") {

$page = "<img src=\"././images/shop.gif\"/><br>Vous allez acheter ".$marcherow["name"].", vous êtes d'accord?<br /><br /><form action=\"index.php?do=marche3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Oui\" /> <input type=\"submit\" name=\"cancel\" value=\"Non\" /></form>";

} elseif (
$marcherow["type"] == "tp") {

$page = "<img src=\"././images/shop.gif\"/><br>Vous allez acheter ".$marcherow["name"].", vous êtes d'accord?<br /><br /><form action=\"index.php?do=marche3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Oui\" /> <input type=\"submit\" name=\"cancel\" value=\"Non\" /></form>";
}


$title = "Acheter objets";
display($page, $title);

}

function
marche3($id) { // Update user profile with new item & stats.

if (isset($_POST["cancel"])) { header("Location: index.php"); die(); }

global
$userrow;

$marchequery = doquery("SELECT * FROM {{table}} WHERE id='$id' LIMIT 1", "marche");
$marcherow = mysql_fetch_array($marchequery);

if (
$userrow["gold"] < $marcherow["prix"]) { display("<img src=\"././images/shop.gif\"/><br>Vous n'avez pas assez de gils pour acheter cet objet.<br /><br />Vous pouvez <a href=\"index.php\">retourner à la ville</a>, <a href=\"index.php?do=marche\">au magasin</a>, ou utiliser les boutons directionnel de gauche pour continuer à explorer le monde.", "Acheter objets"); die(); }

if (
$marcherow["type"] == "exp") { //experience++

// New stats.
$newgold = $userrow["gold"] - $marcherow["prix"];
$newexp = $userrow["experience"] + $marcherow["attribute"]


// Final update.
$updatequery = doquery("UPDATE {{table}} SET gold='$newgold', experience='$newexp' WHERE id='".$userrow["id"]."'", "users");


} elseif (
$marcherow["type"] == "mp") { // Armor

// New stats.
$newgold = $userrow["gold"] - $marcherow["prix"];
$newmp = $userrow["maxmp"] + $marcherow["attribute"]


// Final update.
$updatequery = doquery("UPDATE {{table}} SET gold='$newgold', maxmp='$newmp' WHERE id='".$userrow["id"]."'", "users");

} elseif (
$marcherow["type"] == "hp") { // Shield

// New stats.
$newgold = $userrow["gold"] - $marcherow["prix"];
$newhp = $userrow["maxhp"] + $marcherow["attribute"]


// Final update.
$updatequery = doquery("UPDATE {{table}} SET gold='$newgold', maxhp='$newhp' WHERE id='".$userrow["id"]."'", "users");

} elseif (
$marcherow["type"] == "tp") { // Armor

// New stats.
$newgold = $userrow["gold"] - $marcherow["prix"];
$newtp = $userrow["maxtp"] + $marcherow["attribute"]


// Final update.
$updatequery = doquery("UPDATE {{table}} SET gold='$newgold', maxmp='$newtp' WHERE id='".$userrow["id"]."'", "users");


}

display("<img src=\"././images/shop.gif\"/><br>Merci d'avoir acheté cet objet.<br /><br />Vous pouvez maintenant <a href=\"index.php\">retourner à la ville</a>, <a href=\"index.php?do=marche\">au magasin</a>, ou utiliser les boutons directionnel de gauche pour continuer à explorer le monde.", "Acheter objets");

}


puis l'erreur
Code :
Parse error: syntax error, unexpected T_VARIABLE in /home/fenix29o/www/towns.php on line 1054

et enfin la ligne concerner
Code PHP :
<?php 
$updatequery
= doquery("UPDATE {{table}} SET gold='$newgold', experience='$newexp' WHERE id='".$userrow["id"]."'", "users");

voila en espereant que cette fois tout y soit [/php][/code]


RE: probleme avec updatequery - Sephi-Chan - 03-11-2007

Heureux de voir que tu cherches un peu le problème avant de poster. Confusediffle:

Le message d'erreur l'explique :
Citation :Parse error: syntax error, unexpected T_VARIABLE in /home/fenix29o/www/towns.php on line 1054
Il n'attend pas une déclaration de variable à la ligne 1054. La ligne de code précédente n'est en effet pas achevée selon PHP, ce qui est vrai puisque l'expression n'est pas close.

Il manque un point virgule à la fin de la ligne suivante :
Code PHP :
<?php 
$newexp
= $userrow["experience"] + $marcherow["attribute"]

Et pour t'épargner 3 posts : il manque aussi le point virgule aux lignes suivantes :
Code PHP :
<?php 
$newhp
= $userrow["maxhp"] + $marcherow["attribute"]
Code PHP :
<?php 
$newhp
= $userrow["maxhp"] + $marcherow["attribute"]
Code PHP :
<?php 
$newtp
= $userrow["maxtp"] + $marcherow["attribute"]


Sephi-Chan, je sais, je suis un prince... Confusediffle:


RE: probleme avec updatequery - fenix - 03-11-2007

l'erreur co*** Sad c'est la premiere fois celle là j'y avait meme pas penser et comme les trois autres sont des copie de la premiere


RE: probleme avec updatequery[regler] - Sephi-Chan - 03-11-2007

Oui c'est une erreur chiante et malgré ça toute bête. C'est dans ces cas là qu'on se rend compte que les messages d'erreur de PHP sont très pratiques. Le tout est de les avoir déjà vu au moins une fois.


Sephi-Chan, ajoute une encoche à sa souris


RE: probleme avec updatequery[regler] - Plume - 04-11-2007

Oui enfin, même sans les avoir déjà vue, jeter un oeil aux lignes indiquées ou environnantes, ça tue personne ...


RE: probleme avec updatequery[regler] - fenix - 04-11-2007

sa je l'avais fait sauf que le ; il mes passé sou le nez Sad