Autor Zpráva
Clarity
Profil *
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 *
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 *
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 *
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 *
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 *
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 *
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
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 *
Funguje. :)

Veľká vďaka.
lionel messi
Profil
Clarity:
Veľká vďaka.
Za málo, na to tu sme. :-)
Keeehi
Profil
Clarity:
Máš taky za co, jelikož jsi doporučení od lionel messi z [#2] nepoužil! Nevěřím, že by kód z [#14] nefungoval a zároveň ani nezobrazil chybu. Tyto chybové hlášky velmi pomáhají, takže si je příště prosím nejdříve zobraz.
Lamicz
Profil
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.)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: