-
Query mal funzionante
Ciao ragazzi,
mi è insorto un problema nella applicazione di una query nel senso che invece di applicarmi il risultato di una operazione mi cambia il dato in 0
Vi posto tutto il codice in questione che ha il compito di eseguire le operazioni di un marcato per un gdr php
anche se forse il malfunzionamento sta nelle operazioni matematiche ma magari c'è anche qualcosa d'altro quindi ve lo posto tutto:
Codice PHP:
<?php
require "parte1.php";
$modo = 'c';
$o =$_GET['o'];
$qtac =$_POST['qtac'];
$qtav =$_POST['qtav'];
$sic =$_SESSION['sic'];
//controllo di sicurezza
if ($sic == '1') {
// recupero dei dati del mercato
$quer = "SELECT * FROM mercato " .
"WHERE posizione = '$posizione' ";
$resul = mysql_query($quer) or die (mysql_error());
$og = mysql_fetch_array($resul);
foreach($og as $chiave=>$valore)
$$chiave = $valore;
$quero = "SELECT * FROM mercato_prezzi " .
"WHERE pposizione = '$posizione' ";
$resulo = mysql_query($quero) or die (mysql_error());
$p = mysql_fetch_array($resulo);
foreach($p as $chiave=>$valore)
$$chiave = $valore;
$quers = "SELECT * FROM user_inventario2 " .
"WHERE id = '$id' ";
$resuls = mysql_query($quers) or die (mysql_error());
$i = mysql_fetch_array($resuls);
foreach($i as $chiave=>$valore)
$$chiave = $valore;
//Il massimo del magazzino del mercato per i vari livelli
if ($mercato == 1) {
$limit = 15;
//liv1 e 2
}
if ($mercato > 2) {
$limit = 20;
//liv 3
}
if ($mercato > 3) {
$limit = 35;
//liv 4
}
if ($mercato > 4) {
$limit = 45;
//liv 5
}
if ($mercato > 5) {
$limit = 55;
//liv 6 e 7
}
if ($mercato > 7) {
$limit = 80;
//liv 8
}
if ($mercato > 8) {
$limit = 100;
//liv 9
}
if ($mercato > 9) {
$limit = 150;
//liv 10
}
if ($mercato == 11) {
$limit = 200;
//liv 11
}
//l'oggetto
//l'inventario oggetto
$inv = 'a' . $o;
//il prezzo oggetto
$pr = 'p' . $o;
//tutto
$env = $inv;
$oggetto = $og[$o];
$oinv = $i[$inv];
$opr = $p[$pr];
// L'acquisto
if ($modo == 'c') {
if (($qtac != '') && ($qtac != '0')) {
//presa dell'oggetto
$ni = $oinv + $qtac;
//retrazione dal mercato
$no = $oggetto - $qtac;
if (($opr != '1') && ($opr != '1000')) {
//modifica del prezzo del mercato
if (($o != 'oro') && ($o != 'ferro') && ($o != 'acciaio') && ($o != 'legno') && ($o != 'sale')&& ($o != 'bastone') && ($o != 'aratro') && ($o != 'armatura')&& ($o != 'spada')&& ($o != 'ariete')&& ($o != 'trabocco') && ($o != 'catapulta') && ($o != 'cannone') && ($o != 'vaso') && ($o != 'tazze')) {
$npr = $opr + (1 * $qtac);
} else {
$npr = $opr + (10 * $qtac);
}
} else {$npr = $opr;}
if ($soldi >= $npr) {
if ($oggetto >= $qtac) {
$nsoldi = $npr * $qtac;
echo "Vuoi veramente comprare " . $qtac . " $o " . " per il prezzo di " . $npr . " denari?<br>";?>
<a href="?conf=si&o=<? echo $o; ?>">Sì</a><br><a href="?conf=no">No</a><br><?
} else {echo "Ehm come dire... Non ne abbiamo così tanti quanti ne avete richiesto mio cliente";}
} else {echo "Non hai abbastanza soldi nel tuo portafoglio per comprarlo"; }
}
}
// La vendita
if ($modo == 'v') {
if (($qtav != '') && ($qta != '0')) {
//r dell'oggetto
$ni = $oinv - $qtac;
//p dal mercato
$no = $oggetto + $qtac;
if (($opr != 1) && ($opr != 1000)) {
//modifica del prezzo del mercato
if (($o != 'oro') && ($o != 'ferro') && ($o != 'acciaio') && ($o != 'legno') && ($o != 'sale')&& ($o != 'bastone')&& ($o != 'aratro')&& ($o != 'armatura')&& ($o != 'spada')&& ($o != 'ariete')&& ($o != 'trabocco')&& ($o != 'catapulta') && ($o != 'cannone') && ($o != 'vaso') && ($o != 'tazze')) {
$npr = $opr - (1 * $qtav);
} else {
$npr = $opr - (10 * $qtav);
}}
} else {$npr = $opr;}
$nsoldi = $npr * $qtav;
if ($limit > $no) {
if ($oinv >= $qtav) {
echo "<br>Vuoi veramente vendere " . $oggetto . $o . " per il prezzo di " . $npr . " denari?<br>";
?>
<a href="?conf=si">Sì</a><br><a href="?conf=no">No</a><br>
<?
} else {echo "Non ne avete così tanti!";}
} else {echo "<br>Non puoi vendere questo prodotto qua adesso perchè il limite di immagazzinamento di questo prodotto consentito dall'odierno livello del mercato è stato raggiunto<br>"; }
}
$conf =$_GET['conf'];
if (($conf == 'si') && ($sic == '1')) {
//disattivazione immediata della chiave di sicurezza
$_SESSION['sic']= '0';
$up99 = "UPDATE `user_inventario2` SET `{$env}` = '{$ni}' WHERE `nome` = '{$user}'";
$rs99 = mysql_query($up99) or die(mysql_error());
$up88 = "UPDATE user SET " .
" soldi = '$nsoldi' " .
"WHERE user_username = '$user' ";
$rs88 = mysql_query($up88) or die(mysql_error());
$up77 = "UPDATE `mercato` SET `{$o}` = '{$no}' WHERE `posizione` = '{$posizione}'";
$rs77 = mysql_query($up77) or die(mysql_error());
$up66 = "UPDATE `mercato_prezzi` SET `{$pr}` = '{$npr}' WHERE `pposizione` = '{$posizione}'";
$rs98 = mysql_query($up66) or die(mysql_error());
echo "Affare fatto!";
}
if ($conf == 'no') {
//disattivazione immediata della chiave di sicurezza
$_SESSION['sic']= '0';
echo "Hai detto al venditore che non compravi quell'oggetto, forse ci sarà rimasto un po' male ma<br> pazienza...<br>
<i>State tornando al mercato</i><br>";
header ("Refresh: 3; URL= mercato.php");
}
} else {echo "Errore di trasferimento dei dati,rifare l'operazione per favore";
//disattivazione immediata della chiave di sicurezza
$_SESSION['sic']= '0';
}
//disattivazione immediata della chiave di sicurezza
require "parte2.php";
?>
Voi avete qualche spiegazione del perché mi modifica tutti i risultati in 0?
-
Ci sono cinque query di update li dentro, tutte con nomi incomprensibili, che prendono parametri con nomi incomprensibili, e non abbiamo idea di cosa ci finisca dentro. Non è che ci rendi il lavoro facile eh :mrgreen:
Stampa la query invece di eseguirla, e guarda cosa fa.
-
Ci ho impiegato qualche giorno per vedere la provenienza di tutte le variabili coinvolte e per fare qualche esperimento e sono arrivato a questa conclusione:
-Le variabili provenienti dal form per decidere la qta da comprare o vendere
($qtac & $qtav) sono varchar pur avendo come valore un numero, mentre le altre sono tutte pure int quindi vanno bene le altre.
-Se si fa qualunque operazione aritmetica mettendo un n1 varchar e n2 int si ottiene sempre un int che vale 0
-Se provi assegnare un numero direttamente sul codice sorgente invece che le corrispondenti variabili post a $qtac o $qtav allora il mercato funziona tutto alla perfezione.
QUINDI PER CORREGGERLO BISOGNA CAPIRE COME TRASFORMARE QUELLE VARIABILI POST IN INT
Voi sapete come si fa esistono tipi di form appositi?
-
Basta fare un cast:
Codice PHP:
$foo = (int)$foo;
-
Ok grazie adesso funziona bene ciaoo