Stránka: 1 z 1
| [ Príspevkov: 8 ] | |
| Autor | Správa |
|---|
Registrovaný: 17.02.14 Prihlásený: 20.04.26 Príspevky: 404 Témy: 152 | 152 Bydlisko: Poprad-okolie |
Ahojte, pracujem na PHP hre a prišiel som k problému. Na výstupe je nutné, aby mi premenná dosadilo hodnotu z db. Bohužiaľ ale stále dostávam chybu v podobe undefined variable. Ak by mi niekto vedel kód upraviť natoľko, aby fungoval, bol by som mega vďačný. Kód: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Moja dedina</title> </head> </html> <?php session_start(); include ('header.php' ); ?> <?php // kontrola Loginu if(!isset($_SESSION['uid'])){ echo "Musíte sa prihlásiť!"; }else{ // Stavba budov if(isset($_POST['buy'])){ $main_building = protect($_POST['main_building']); $barracks = protect($_POST['barracks']); $tower = protect($_POST['tower']); $wall = protect($_POST['wall']); $blacksmith = protect($_POST['blacksmith']); $workshop = protect($_POST['workshop']); $gold_needed = (2000 * $main_building) + (3000 * $barracks) + (3500 * $tower) + (2200 * $wall) + (1500 * $blacksmith) + (5000 * $workshop); if($main_building < 0 || $barracks < 0 || $tower < 0 || $wall < 0 || $blacksmith < 0 || $workshop < 0){ output("Musíte zakúpiť prvý stupeň budovy!"); }elseif($stats['gold'] < $gold_needed){ output("Nemáte dostatok zlata na vybudovanie budovy."); }else{ $building['main_building'] += $main_building; $building['barracks'] += $barracks; $building['tower'] += $tower; $building['wall'] += $wall; $building['blacksmith'] += $blacksmith; $building['workshop'] += $workshop; $update_buildings = mysql_query("UPDATE `buildings` SET `main_building`='".$building['main_building']."', `barracks`='".$building['barracks']."', `tower`='".$building['tower']."', `wall`='".$building['wall']."', `blacksmith`='".$building['blacksmith']."', `workshop`='".$building['workshop']."' WHERE `id`='".$_SESSION['uid']."'") or die(mysql_error()); $stats['gold'] -= $gold_needed; $update_gold = mysql_query("UPDATE `stats` SET `gold`='".$stats['gold']."' WHERE `id`='".$_SESSION['uid']."'") or die(mysql_error()); include("update_stats.php"); output("Vylepšili ste budovu!"); } }elseif(isset($_POST['sell'])){ // Predaj zbraní $main_building = protect($_POST['main_building']); $barracks = protect($_POST['barracks']); $tower = protect($_POST['tower']); $wall = protect($_POST['wall']); $blacksmith = protect($_POST['blacksmith']); $workshop = protect($_POST['workshop']); $gold_gained = (800 * $main_building) + (800 * $barracks) + (1200 * $tower) + (900 * $wall) + (600 * $blacksmith) + (2000 * $workshop); if($main_building < 0 || $barracks < 0 || $tower < 0 || $wall < 0 || $blacksmith < 0 || $workshop < 0){ output("Musíte rozobrať kladný počet zariadení"); }elseif($main_building > $building['main_building'] || $barracks > $building['barracks'] || $tower > $building['tower'] || $wall > $building['wall'] || $blacksmith > $building['blacksmith'] || $workshop > $building['workshop']){ output("Nemáte dostatok zbraní na predaj!"); }else{ $building['main_building'] -= $main_building; $building['barracks'] -= $barracks; $building['tower'] -= $tower; $building['wall'] -= $wall; $building['blacksmith'] -= $blacksmith; $building['workshop'] -= $workshop; $update_buildings = mysql_query("UPDATE `buildings` SET `main_building`='".$building['main_building']."', `barracks`='".$building['barracks']."', `tower`='".$building['tower']."', `wall`='".$building['wall']."', `blacksmith`='".$building['blacksmith']."', `workshop`='".$building['workshop']."' WHERE `id`='".$_SESSION['uid']."'") or die(mysql_error()); $stats['gold'] += $gold_gained; $update_gold = mysql_query("UPDATE `stats` SET `gold`='".$stats['gold']."' WHERE `id`='".$_SESSION['uid']."'") or die(mysql_error()); include("update_stats.php"); output("Vaše budovy boli úspešne rozobraté!"); } } ?> <center><h2>Vaše zbrane</h2></center> <br /> Tu môžete kúpiť a predať vaše zbrane <br /><br /> <form action="village.php" method="post"> <table cellpadding="5" cellspacing="5" max-width=799px> <tr> <td><b>Typ zbrane</b></td> <td><b>Počet zbraní</b></td> <td><b>Cena zbrane v zlate</b></td> <td><b>Kúpiť</b></td> </tr> <tr> <td>Hlavná budova</a> <img src="images/sword.png" alt="sword.png, 1,1kB" title="Sword" height="20" width="20"></td> <td><?php echo number_format($building['main_building']); ?></td> <td>10 <img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="sword" size=1/></td> </tr> <tr> <td>Kasárne</a> <img src="images/bow.png" alt="bow.png, 3,8kB" title="bow" height="20" width="20"></td> <td><?php echo number_format($building['barracks']); ?></td> <td>15 <img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="bow" size=1/ ></td> </tr> <tr> <td>Sekera</a><img src="images/axe.png" alt="axe.png, 1,1kB" title="Axe" height="20" width="20"></td> <td><?php echo number_format($building['tower']); ?></td> <td>30 <img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="axe" size=1/></td> </tr> <tr> <td>Štít</a><img src="images/shield.png" alt="shield.png, 3,8kB" title="Shield" height="20" width="20"></td> <td><?php echo number_format($building['wall']); ?></td> <td>10 <img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="shield" size=1/ ></td> </tr> <tr> <td>Palisáda z kolov</a><img src="images/kol.png" alt="kol.png, 3,8kB" title="Kol" height="20" width="20"></td> <td><?php echo number_format($building['blacksmith']); ?></td> <td>15 <img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="kol" size=1/ ></td> </tr> <tr> <td>Kanón</a><img src="images/canon.png" alt="canon.png, 3,8kB" title="Canon" height="20" width="20"></td> <td><?php echo number_format($building['workshop']); ?></td> <td>500 <img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="canon" size=1/ ></td> </tr> <tr> <td></td> <td></td> <td></td> <td><input type="submit" name="buy" value="Kúpiť"/></td> </tr> </table> </form> <hr /> <form action="village.php" method="post"> <table cellpadding="5" cellspacing="5"> <tr> <td><b>Typ zbrane</b></td> <td><b>Počet zbraní</b></td> <td><b>Cena zbrane v zlate</b></td> <td><b>Predať</b></td> </tr> <tr> <td>Meč <img src="images/sword.png" alt="sword.png, 1,1kB" title="Sword" height="20" width="20"></td> <td><?php echo number_format($building['main_building']); ?></td> <td>8 <img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="sword" size=1/></td> </tr> <tr> <td>Luk <img src="images/bow.png" alt="bow.png, 3,8kB" title="Bow" height="20" width="20"></td> <td><?php echo number_format($building['barracks']); ?></td> <td>6 <img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="bow" size=1/ ></td> </tr> <tr> <td>Sekera<img src="images/axe.png" alt="axe.png, 1,1kB" title="Axe" height="20" width="20"></td> <td><?php echo number_format($building['tower']); ?></td> <td>10 <img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="axe" size=1/></td> </tr> <tr> <td>Štít <img src="images/shield.png" alt="shield.png, 3,8kB" title="Shield" height="20" width="20"></td> <td><?php echo number_format($building['wall']); ?></td> <td>8 <img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="shield" size=1/></td> </tr> <tr> <td>Palisáda z kolov<img src="images/kol.png" alt="kol.png, 3,8kB" title="kol" height="20" width="20"></td> <td><?php echo number_format($building['blacksmith']); ?></td> <td>6 <img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="kol" size=1/></td> </tr> <tr> <td>Kanón <img src="images/canon.png" alt="canon.png, 1,1kB" title="Canon" height="20" width="20"></td> <td><?php echo number_format($building['workshop']); ?></td> <td>200<img src="images/gold.png" alt="gold.png, 3,3kB" title="Gold" height="20" width="20"></td> <td><input type="text" name="canon" size=1/></td> </tr> <td></td> <td></td> <td></td> <td><input type="submit" name="sell" value="Predať"/></td> </tr> </table> </form>
<?php }include ('footer.php' ); ?>
|
|
Registrovaný: 21.09.13 Prihlásený: 04.04.26 Príspevky: 2111 Témy: 77 | 77 Bydlisko: Považská By... |
Pouzi nieco normalne a nie mysql_query ktore je zastarale a myslim ze php7 uz ani neni.
_________________ Nesnívaj svoj život, ale ži svoj sen. |
|
Registrovaný: 17.02.14 Prihlásený: 20.04.26 Príspevky: 404 Témy: 152 | 152 Bydlisko: Poprad-okolie |
využívam PHP 5.6.. takýmto príkazom ma to naučili aj v škole, mnoho hostingov ešte PHP 7 nemá
|
|
Registrovaný: 08.08.09 Príspevky: 12446 Témy: 38 | 38 |
Strach a hrôza. Príklad špagetového kódu. Je to tak neprehľadný kód, že som skončil niekde na tejto nešťastnej konštrukcií Kód: if(!isset($_SESSION['uid'])){ echo "Musíte sa prihlásiť!"; }else{ kde poriadne ani neviem kde máš to [c]else[/c] uzavreté. Ak ti môžem odporučiť, najprv ešte veľa študuj, pre chybové hlášky začni využívať výnimky, pozri si napríklad MVC model (alebo iný model využívajúci objekty) a rob to podľa neho, pretože toto skončí tak, že keď sa na to o pol roka pozrieš, sám si budeš trhať vlasy. Ako písal zajac, mysql_ nepoužívať. Naučili ťa to zle, takže minimálne mysqli_, PDO, prípadne podľa mňa ideálne mať vlastnú vrstvu pre prácu s databázou (dibi, notORM,...) a nemusí ťa trápiť driver, dokonca niekedy ani optimalizácia príkazov (To nie je záležitosť PHP 7, takže tým argumentovať prečo používaš niečo dávno nepodporované už vo verzií PHP 5.5 a potenciálne nebezpečné, je z cesty). Inak ktorá premenná je undefined?
_________________ always is always wrong |
|
Registrovaný: 17.02.14 Prihlásený: 20.04.26 Príspevky: 404 Témy: 152 | 152 Bydlisko: Poprad-okolie |
Premenná §building --> Notice: Undefined variable: building in C:\wamp\www\nationwars\village.php on line 106 Call Stack # Time Memory Function Location 1 0.0020 285904 {main}( ) ..\village.php:0
§building nefunguje následne ani pri ďalších hodnotách, ktoré tam potrebujem. else je ukončené na konci kódu pred include footer.
|
|
Registrovaný: 08.08.09 Príspevky: 12446 Témy: 38 | 38 |
Daj si niekam na začiatok aspoň [c]$building = array();[/c] Že je else ukončené na konci kódu je síce pekné, ale tým pádom je tam zbytočne, stačí správne použiť silu [c]exit()[/c], prípadne iných "zabijáckych" funkcií. Chcel som len, aby si si uvedomil, že ten postup akým to teraz robíš nie je úplne správny a môže iba tebe spôsobiť v budúcnosti problémy s prípadnou údržbou. PHP je prasácky jazyk. Nemá prakticky žiadne obmedzenia, preto programátorovi dovolí robiť zvrátenosti od výmyslu sveta (jeden príklad za všetky, typová kompatibilita premenných, inými slovami, raz do premennej uložíš celé číslo, inokedy reťazec, potom dokonca objekt a interpreter jazyka sa tvári akože je všetko v poriadku, pritom každý jazyk na úrovni má túto základnú vec ošetrenú). Nechcem ťa demotivovať, len vidím kúsok dopredu, ako tento celý projekt môže práve na tomto stroskotať. Ten kód je proste hrozný, ani nemám silu ho celý čítať, takže chýb tam môže byť omnoho viac.
_________________ always is always wrong |
|
Registrovaný: 17.02.14 Prihlásený: 20.04.26 Príspevky: 404 Témy: 152 | 152 Bydlisko: Poprad-okolie |
Neviem prečo mi to nefunguje, nakoľko využívam totožný kód, ako pri inom scripte kde sa kupujú zbrane. Tu som iba zmenil hodnoty. Ale ten array skúsim využiť. Dám vedieť, či som to rozbehal. Tam je else taktiež ukončené až na samom konci scriptu
// Spojený príspevok Ned 06.03.16 14:12
Teraz mi to ukazuje to isté s indexom. Undefined index: main_building in C:\wamp\www\nationwars\village.php on line 111
|
|
Registrovaný: 08.08.09 Príspevky: 12446 Témy: 38 | 38 |
No samozrejme, bude ti to nadávať kým nebudeš mať deklarovanú každú premennú ktorú niekde využívaš. Túto časť Kód: $main_building = protect($_POST['main_building']); $barracks = protect($_POST['barracks']); $tower = protect($_POST['tower']); $wall = protect($_POST['wall']); $blacksmith = protect($_POST['blacksmith']); $workshop = protect($_POST['workshop']); $gold_needed = (2000 * $main_building) + (3000 * $barracks) + (3500 * $tower) + (2200 * $wall) + (1500 * $blacksmith) + (5000 * $workshop); if($main_building < 0 || $barracks < 0 || $tower < 0 || $wall < 0 || $blacksmith < 0 || $workshop < 0){ output("Musíte zakúpiť prvý stupeň budovy!"); }elseif($stats['gold'] < $gold_needed){ output("Nemáte dostatok zlata na vybudovanie budovy."); }else{ $building['main_building'] += $main_building; $building['barracks'] += $barracks; $building['tower'] += $tower; $building['wall'] += $wall; $building['blacksmith'] += $blacksmith; $building['workshop'] += $workshop; $update_buildings = mysql_query("UPDATE `buildings` SET `main_building`='".$building['main_building']."', `barracks`='".$building['barracks']."', `tower`='".$building['tower']."', `wall`='".$building['wall']."', `blacksmith`='".$building['blacksmith']."', `workshop`='".$building['workshop']."' WHERE `id`='".$_SESSION['uid']."'") or die(mysql_error()); $stats['gold'] -= $gold_needed; $update_gold = mysql_query("UPDATE `stats` SET `gold`='".$stats['gold']."' WHERE `id`='".$_SESSION['uid']."'") or die(mysql_error()); include("update_stats.php"); output("Vylepšili ste budovu!"); Tam máš až na pár rozdielov duplicitne. Nemohol by si spoločné časti vytiahnuť pred podmienku? Stále viac som presvedčený, že pre teba bude lepšie keď to vymažeš a začneš podľa nejakého predpisu písať nanovo. Najlepšie objektovo - tým by sa ti kopa starostí vyriešila už na začiatku. Keďže ale asi nevieš čo sú to objekty a celkovo objektové programovanie, tak sa asi zbytočne snažím a prerábať to (ak sa na to rovno nevykašleš) začneš až keď sa ti v hlave ujasní, že takto ten kód udržiavať nezvládneš.
_________________ always is always wrong |
|
Stránka: 1 z 1
| [ Príspevkov: 8 ] | |
|