Autor | Zpráva | ||
---|---|---|---|
Clarity Profil * |
#1 · Zasláno: 20. 2. 2015, 15:18:26 · Upravil/a: Moderátor (editace znemožněna) 20. 2. 2015, 18:58:31
Vytvoril som si kód na verbovanie jednotiek, mal by fungovať takto: Hráč si vybere a zapíše do políčka koľko chce daných jednotiek.
<table cellspacing="0" cellpading="0"> <form method="POST"> <tr><td><b>Šermiari</b> </td> <td><?php echo $sermiar['sermiar'] ?></td><td><input type="text" name="ser"></td></tr> <tr><td><b>Lukostrelci</b> </td> <td><?php echo $lukostrelec['lukostrelec'] ?></td><td><input type="text" name="luk"></td></tr> <tr><td><b>Kopíjníci</b> </td><td> <?php echo $kopijnik['kopijnik'] ?></td><td><input type="text" name="kop"></td></tr> <tr><td><b>Halapartníci</b> </td><td><?php echo $halapartnik['halapartnik'] ?></td><td><input type="text" name="hal"></td></tr> <tr><td><b>Husári</b></td> <td><?php echo $husar['husar'] ?></td><td><input type="text" name="hus"></td></tr> <tr><td><b>Rytieri </b></td> <td><?php echo $rytier['rytier'] ?></td><td><input type="text" name="ryt"></td></tr> <tr><td><b>Lukostrelci na koňoch </b></td><td> <?php echo $lukostrelecKon['lukostrelecKon'] ?></td><td><input type="text" name="kon"></td></tr> <tr><td><b>Baranidlá </b></td> <td><?php echo $baranidlo['baranidlo'] ?></td><td><input type="text" name="bar"></td></tr> <tr><td><b>Bojové vozy </b></td> <td><?php echo $voz['voz'] ?></td><td><input type="text" name="voz"></td></tr> <tr><td></td> <td></td><td><input type="submit" value="Verbovať" name="verbuj"></td></tr> </form> </table> Potom klikne na tlačítko "Verbovať" a mal by nastať tento PHP kód: <?php $verS = mysql_real_escape_string($_POST['ser']); $verL = mysql_real_escape_string($_POST['luk']); $verK = mysql_real_escape_string($_POST['kop']); $verH = mysql_real_escape_string($_POST['hal']); $verHs = mysql_real_escape_string($_POST['hus']); $verR = mysql_real_escape_string($_POST['ryt']); $verLk = mysql_real_escape_string($_POST['kon']); $verB = mysql_real_escape_string($_POST['bar']); $verV = mysql_real_escape_string($_POST['voz']); if(isset($_POST['verbuj'])){ $sermiar = $sermiar + $verS; $lukostrelec = $lukostrelec + $verL; $kopijnik = $kopijnik + $verK; $voz = $voz + $verV; $baranidlo = $baranidlo + $verB; $lukostrelecKon = $lukostrelecKon + $verLk; $halapartnik = $halapartnik + $verH; $rytier = $rytier + $verR; mysql_query("INSERT INTO uzivatelia(sermiar,kopijnik,lukostrelec,halapartnik,husar,rytier,lukostrelecKon,baranidlo,voz) VALUES('$sermiar', '$kopijnik', '$lukostrelec', '$halapartnik', '$husar', '$rytier', '$lukostrelecKon', '$baranidlo', '$voz') WHERE meno = '". $_SESSION["meno"] ."'"); } No z neznámej príčiny to nechce fungovať, neviete prečo? Hodnota jednotky sa proste nezmení. Moderátor Davex: Titulek „Verbovanie jednotiek“ nevystihoval podstatu dotazu. Příště zkus prosím vymyslet lepší.
|
||
lionel messi Profil |
Clarity:
Pár pripomienok: 1. Escapovanie (riadky 2–10) presuň až do podmienky kontrolujúcej odoslanie formulára (detail). 2. K riadkom 13–20: Nemajú logiku, veľmi im nerozumiem. Buď ide len o akýsi úryvok alebo o chybu, pretože hodnota $sermiar sa vypočíta 0 + $verS , pretože s týmito premennými predtým nepracuješ. Ale k zmene hodnoty by malo prísť tak či onak.
3. Čo sa stane, keď upravíš záver podmienky takto: mysql_query("INSERT INTO uzivatelia(sermiar,kopijnik,lukostrelec,halapartnik,husar,rytier,lukostrelecKon,baranidlo,voz) VALUES('$sermiar', '$kopijnik', '$lukostrelec', '$halapartnik', '$husar', '$rytier', '$lukostrelecKon', '$baranidlo', '$voz') WHERE meno = '". $_SESSION["meno"] ."'"); if (mysql_error()) { echo "Došlo k chybe dotazu: ". mysql_error(); } Ak to nefungovalo doteraz, nebude ani po tejto zmene, ale ide o nájdenie chyby, ktorá sa v prípade zlyhania dotazu vypíše. PS: Nikde som si nevšimol, že by si sa k db pripájal, ale predpokladám, že to riešiš v kóde na inom mieste (podobne session_start). |
||
Clarity Profil * |
#3 · Zasláno: 20. 2. 2015, 15:45:41 · Upravil/a: Clarity
Ahoj, vďaka za reakciu
2. To je môj spôsob verbovania, do premennej $sermiar sa pripočíta hodnota, ktorú sme zadali vo formulári a vypíše sa už tá nová. A súbor na pripojenie ku databáze tam mám. |
||
lionel messi Profil |
Clarity:
Ďakujem za objasnenie. Vyskúšal si upraviť kód podľa bodu 3 z predošlého príspevku? Vypisuje sa chyba? |
||
Clarity Profil * |
#5 · Zasláno: 20. 2. 2015, 15:53:36
Nič sa nevypísalo.
|
||
lionel messi Profil |
Clarity:
„Nič sa nevypísalo.“ Žiaľ, iné problémy než tie, na ktoré som poukázal v [#2], v úryvkoch nevidím. Spýtam sa však na niečo iné, možno od veci. Nehľadáš náhodou UPDATE miesto INSERT? Chceš v tabuľke prepísať existujúci záznam alebo vložiť nový (nie je mi to na 100% jasné)? Čo vkladá do db tvoj kód (niečo by mal, keďže mysql_error mlčí)?
|
||
Clarity Profil * |
#7 · Zasláno: 20. 2. 2015, 16:01:57
Prepísať existujúci, akurát pozerám jeden tutorial, kde použil UPDATE, idem to vyskúšať.
|
||
lionel messi Profil |
Clarity:
„idem to vyskúšať.“ V tom prípade sa možno bude hodiť nakuknúť do dokumentácie na správnu syntax. |
||
Clarity Profil * |
#9 · Zasláno: 20. 2. 2015, 16:37:46 · Upravil/a: Clarity
Upravil som kód takto, stále nechce fungovať už vážne netuším prečo :(
<?php include "config.php"; $verS = $_POST['ser']; $verL = $_POST['luk']; $verK = $_POST['kop']; $verH = $_POST['hal']; $verHs = $_POST['hus']; $verR = $_POST['ryt']; $verLk = $_POST['kon']; $verB = $_POST['bar']; $verV = $_POST['voz']; if(isset($_POST['verbuj'])){ $sermiar = $sermiar + $verS; $lukostrelec = $lukostrelec + $verL; $kopijnik = $kopijnik + $verK; $voz = $voz + $verV; $baranidlo = $baranidlo + $verB; $lukostrelecKon = $lukostrelecKon + $verLk; $halapartnik = $halapartnik + $verH; $rytier = $rytier + $verR; $husar = $husar + $verHs; mysql_query("UPDATE 'uzivatelia' SET 'sermiar' = '.$sermiar.', 'kopijnik' = '.$kopijnik.', 'lukostrelec' = .$lukostrelec.', 'halapartnik' = '.$halapartnik.', 'husar' = '.$husar.', 'rytier' = '.$rytier.', 'lukostrelecKon' = '.$lukostrelecKon.', 'baranidlo' = '.$baranidlo.', 'voz' = '.$voz.' WHERE 'meno' = '".$_SESSION['meno']."'"); } ?> Pri .$lukostrelec je '
|
||
lionel messi Profil |
Clarity:
„Upravil som kód takto,“ Zaniesol si do neho bezpečnostnú chybu, pretože si odstránil escapovanie (ja som ti ho radil iba presunúť a to spolu s priradeným užívateľských vstupov do lokálnych premenných). Navyše je syntakticky chybný, väčšina bodiek (okrem tých vo WHERE) tam nemá čo hľadať (základy spájania reťazcov). Správna verzia: mysql_query("UPDATE uzivatelia SET 'sermiar' = '$sermiar', 'kopijnik' = '$kopijnik', 'lukostrelec' = '$lukostrelec', 'halapartnik' = '$halapartnik', 'husar' = '$husar', 'rytier' = '$rytier', 'lukostrelecKon' = '$lukostrelecKon', 'baranidlo' = '$baranidlo', 'voz' = '$voz' WHERE 'meno' = '".$_SESSION['meno']."'"); |
||
Slark Profil * |
#11 · Zasláno: 20. 2. 2015, 16:49:24
U lukostřelce Vám chybí apostrof.
|
||
lionel messi Profil |
Slark:
„U lukostřelce Vám chybí apostrof.“ Komu? Ak Claritymu, dodatočne sa o tom v [#9] zmienil: „Pri .$lukostrelec je ' “ a chyba bola aj tak inde. Vo svojom kóde žiadny chýbajúci apostrof nevidím.
|
||
Keeehi Profil |
Je co updatovat? Když provedeš
"SELECT * FROM uzivatelia WHERE meno = '".$_SESSION['meno']."'" tak to získá jednoho uživatele?
Názvy sloupců nepatří do apostrofů! Pokud už tam chceš něco dát, tak tento znak `
Počty jednotek snad nejsou stringy! Měl by to být nějaký typ integeru. Takže ani kolem nich nepatří apostrofy. S tím ale pak souvisí i to, že se nepoužívá mysql_rel_escape_string ale musíš zajistit, že to budy vždy číslo (třeba přetypováním) A za další by mělo být bezpečnější použít "sermiar = sermiar + ".$verS než "sermiar = $sermiar" . Ta první veze vždy zvětší hodnotu o dané číslo, u té druhé (aktuální) se může stát, že ne.
|
||
Clarity Profil * |
#14 · Zasláno: 20. 2. 2015, 17:16:36
Upravil som kód takto, no výsledok stále ten istý:
<?php include "config.php"; $verS = (int)$_POST['ser']; $verL = (int)$_POST['luk']; $verK = (int)$_POST['kop']; $verH = (int)$_POST['hal']; $verHs =(int)$_POST['hus']; $verR = (int)$_POST['ryt']; $verLk =(int)$_POST['kon']; $verB = (int)$_POST['bar']; $verV = (int)$_POST['voz']; if(isset($_POST['verbuj'])){ mysql_query("UPDATE 'uzivatelia' SET sermiar = $sermiar + $verS, kopijnik = $kopijnik + $verK, lukostrelec = $lukostrelec + $verL, halapartnik = $halapartnik + $verH, husar = $husar + $verHs, rytier = $rytier + $verR, lukostrelecKon = $lukostrelecKon + $verLk, baranidlo = $baranidlo + $verB, voz = $voz + $verV WHERE meno = '".$_SESSION['meno']."'"); } ?> |
||
lionel messi Profil |
#15 · Zasláno: 20. 2. 2015, 17:21:20
Clarity:
Stále zle. mysql_query("UPDATE uzivatelia SET sermiar = sermiar + $verS, kopijnik = kopijnik + $verK, lukostrelec = lukostrelec + $verL, halapartnik = halapartnik + $verH, husar = husar + $verHs, rytier = rytier + $verR, lukostrelecKon = lukostrelecKon + $verLk, baranidlo = baranidlo + $verB, voz = voz + $verV WHERE meno = '".$_SESSION['meno']."'"); |
||
Clarity Profil * |
#16 · Zasláno: 20. 2. 2015, 17:27:29
Funguje. :)
Veľká vďaka. |
||
lionel messi Profil |
Clarity:
„Veľká vďaka.“ Za málo, na to tu sme. :-) |
||
Keeehi Profil |
#18 · Zasláno: 20. 2. 2015, 17:44:43
|
||
Lamicz Profil |
#19 · Zasláno: 22. 2. 2015, 20:22:50
Vím, že podle kódu je Clarity začátečník, ale ta struktura DB se mi moc nezdá. Osobně bych volil číselník jednotek a M:N vazební tabulku mezi jednotky a uživatele s počtem dané jednotky
číselník jednotek - jednotka: id (PK), nazev vazební tabulka - jednotka_uzivatel: id (PK) - nepovinné, jednotka_id (vazba na jednotku), uzivatel_id (vazba na uzivatele), pocet (pocet naverbovanych jedn.) |
||
Časová prodleva: 10 let
|
0