Autor Zpráva
Karlos
Profil *
Dobrý den,
chci se zeptat, kde může být chyba ?

Mám formulář, který vkládá data na mysql server, používá se metoda POST. Tento formulář je kontrolován pomocí JS. Vše funguje. Data jsou předány na další stránku, kde se vykoná INSERT.

Mám stejný formulář, který upravuje určitý záznam v databázi. Nejdříve ta data načtu do kolonek a opět kontroluji pomocí JS. Data jsou předány na další stránku (metoda GET), kde se vykoná UPDATE. Kontrola pomocí JS, zde nefunguje, rsp. propustí se jakákoli data zapsaná do formuláře.

Díky za odpověďi
lionel messi
Profil
Karlos:
Kontrola pomocí JS, zde nefunguje, rsp. propustí se jakákoli data zapsaná do formuláře.
Jediná spoľahlivá kontrola užívateľského vstupu je možná na strane serveru (napr. v PHP), užívateľ môže klientský skript vypnúť a podobne.

Pre konkrétnejšiu radu prosím o odkaz na živú ukážku (kvôli JS). V prípade záujmu o prevod validácie formulára do PHP taktiež PHP kód spracúvajúci formulárové dáta.
juriad
Profil
lionel messi:
Navíc bys neměl posílat GETem nic, co způsobí vedlejší efekt (změna databáze). Vždy POST a redirect.
Karlos
Profil *
Musim poslat pomocí GET id, bylo to v zadání cvičení.
Karlos
Profil *
 <?php
       
       $localhost = "localhost";
  $user = "e13110";
  $password = "****";
  $databaze = "e13110";
  
  mysql_connect($localhost, $user, $password);
  mysql_select_db($databaze);
  mysql_query("SET CHARACTER SET cp1250");
       
  $ID=$_GET['ID'];
 
  $sql = "SELECT * FROM `Jazykove_kurzy` WHERE ID=$ID";
  $vysledek = mysql_query($sql);
  $zaznam = mysql_fetch_array($vysledek);
  
   ?>
  <form action="update_save.php" name="formular" method="post" onSubmit="kontrola();">
  <input type=hidden name="ID" value="<?php echo $zaznam["ID"] ?>"> 
    <p>
        <label class="left">Vyuèovaný jazyk</label>
        <select name="jazyk" size="3">
                                 <option value="Aj" <?php print ($zaznam['jazyk'] == 'Aj') ? 'SELECTED' : ''; ?>>Angliètina</option>
                                 <option value="Rj" <?php print ($zaznam['jazyk'] == 'Rj') ? 'SELECTED' : ''; ?>>Ruština</option>
                                 <option value="Nj" <?php print ($zaznam['jazyk'] == 'Nj') ? 'SELECTED' : ''; ?>>Nìmèina</option>
                                 <option value="Sj" <?php print ($zaznam['jazyk'] == 'Sj') ? 'SELECTED' : ''; ?>>Španìlština</option>
                                 <option value="Fj" <?php print ($zaznam['jazyk'] == 'Fj') ? 'SELECTED' : ''; ?>>Francouzština</option>
                                 </select>
    </p>
    <p>
        <label class="left">Volných míst</label>
        <input type="text" name="pocet" maxlength="2" value="<?php echo $zaznam["pocet"] ?>"/>
    </p>
    <p>
    <label class="left">Rozsah výuky (h/tyd)</label>
        <input type="text" maxlength="2" name="rozsah" value="<?php echo $zaznam["rozsah"] ?>"/>
    </p>
  <p>
    <label class="left">Mìsto</label>
        <input type="text" name="mesto" value="<?php echo $zaznam["mesto"] ?>"/>
    </p>
  <p>
    <label class="left">Cena</label>
        <input type="text" name="cena" maxlength="5" value="ssss"/>
    </p>
  <p>
    <label class="left">Pocet lektorù</label>
        <input type="radio" name="lektori" value="1" <?php print ($zaznam['lektori'] == '1') ? 'CHECKED' : ''; ?>>1 
                                <input type="radio" name="lektori" value="2" <?php print ($zaznam['lektori'] == '2') ? 'CHECKED' : ''; ?>>2 
                                <input type="radio" name="lektori" value="3" <?php print ($zaznam['lektori'] == '3') ? 'CHECKED' : ''; ?>>3
    </p>
  <p>
    <label>Platnost termínu</label>
        <input type="checkbox" name="platnost" <?php print ($zaznam['platnost'] == 'Platí') ? 'CHECKED' : ''; ?>/>
    </p>
  <input type="submit" value="Odeslat">
</form> 

 <script type="text/javascript">
  
  function kontrola(){
  if((document.formular.pocet.value=="") || isNaN(document.formular.pocet.value)){window.alert('Špatnì vyplnené pole volných míst.');}
  if((document.formular.rozsah.value=="") || isNaN(document.formular.rozsah.value)){window.alert('Špatnì vyplnené pole rozsahu výuky.');}
  if(document.formular.mesto.value==""){window.alert('Špatnì vyplnené pole město.');}
  if((document.formular.cena.value=="") || isNaN(document.formular.cena.value)){window.alert('Špatnì vyplnené pole cena.');} *
  }   
  
   </script> 

Nějak se v tom hrabu, ale chybka nelze najít.

Moderátor juriad: Cenzura hesla.
lionel messi
Profil
Karlos:
Pár námetov na vylepšenie:

1. Funkcie z rodiny mysql_* sú zastarané a budú odstránené, bližšie info na: www.fisir.tk/itblog/mysql_.
2. Na riadku 12 vôbec neriešiš prípadnú neexistenciu $_GET['id'], bežne sa to rieši jednoduchou podmienkou $ID = (isset($_GET['ID']) ? $_GET['ID'] : '');.
3. Miesto mysql_fetch_array môžeš použiť rovno mysql_fetch_assoc (resp. po prechode na novšie rozhranie jej mysqli_* alias).
4. Dôležité: Skript obsahuje bezpečnostnú chybu SQL Injection. Ak bude $id obsahovať apostrof, celý dotaz zlyhá (v horšom prípade získa útočník možnosť manipulovať s databázovým dotazom). Riešením je escapovanie, keďže ID je číslo, postačí i pretypovanie na číslo (napr. pomocou funkcie intval).

Čo sa týka JavaScriptu, nemám dostatok skúseností, aby som si trúfol poradiť, ospravedlňujem sa.


Tak predsa som to našiel. Na konci r. 66 je prebytočný znak *, ktorý tam vôbec nepatrí a spôsobí syntaktickú chybu. Po jeho odstránení validácia funguje bezproblémovo (živá ukážka splácaná bez ladu a skladu, na demonštráciu funkčnej validácie však postačí).

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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