Autor Zpráva
jakubk0c
Profil
Dobrý den,
mám problém. Občas se stane třeba 1 z 20, že se stejný SQL dotaz zapíše do DB vícekrát. Nevíte čím by to mohlo být? Není tam žádný while, for nic.

Dole zjednodušený zápis.

      $query = $db->prepare("INSERT INTO home (name) 
                             VALUES (?)");
      $query->bind_param("s", $_POST['name']);    
      $query->execute(); 
      $query->close();
      
Tomášeek
Profil
jakubk0c:
Ten kód je v pořádku, pokud neni v cyklu, nebo script nevolás vícekrát, není možné, aby se zapsalo vícekrát.
jakubk0c
Profil
Ten kod používám u 3ch společností. A dělá to pouze u jedné. Je možné nějaké špatné nastavení u nich?
Tomášeek
Profil
jakubk0c:
Nehledej chybu, kde není, proste ji mas někde v kódu. Kde přesně? To nevíme, uvedeny trojradek je v pořádku.
jakubk0c
Profil
Celý kod, co se spusti po vyvolani formu.

  if (isset($_POST['new_rezervace'])) {

      $query = $db->prepare("INSERT INTO home (name) 
                             VALUES (?)");
      $query->bind_param("s", $_POST['name']);    
      $query->execute(); 
      $query->close();
      
      $_SESSION['result_rez'] = overeni_rez($query);    

      if("Rezervace se nezdařila." !=  $_SESSION['result_rez']){
         //Email
           switch ($_SESSION['email_prava']) {
            case 0:                  
                /odeslat email 1
                break;
            case 1:                
                /odeslat email 2
                break;
            case 2:             
                /odeslat email 3
                break;
            case 3:                 
                /odeslat email 4
                break;
            default:
                echo "Email nebyl odeslán";
          }
            presmerovani("../../home.php");
          }
      }else{
        presmerovani("../../rezervace.php");
      }
  } 
Tomášeek
Profil
jakubk0c:
Ani tady chyba není, krom te hodně krkolomne a snadno rozpadnouci se podmínky na ř. 11.

Přebývá tam jedna závorka, ale to je spíše tady, než v aplikaci, to by házeli chybu. Hledej dal. Sleduj, kudy kód prochází, postupným ukazovanim správných části aplikace se výsledku nedobereme.
jakubk0c
Profil
Právě, že tady kod končí, ani žádná funkce tu neni nic. Ale udělá to náhodně třeba 1 z 20 dotazů, nebo 1 z 50. Jo ta podmínka už je změněná, ale díky :-).
Tomášeek
Profil
jakubk0c:
Max. pomalý server a vícenásobné odeslání klientem (refresh dříve, než dojde na konci kódu k redirectu). Nic jiného mě nenapadá.
Kajman
Profil
Formulář je asi odeslán vícekrát (buď obnova, doubleclick, nebo něco dalšího). Když si u formulářů uděláte systém tokenů, které ošetří i duplicitní poslání, mělo by to pomoci.
jakubk0c
Profil
Kajman:
Šlo by to trochu rozvést? Já se tam nemám čeho chytnout. Není tam, žádný unikátní číslo. jediný co bych mohl, je vytvořit unikátní číslo a pak zkoumat, zda už to číslo neexistuje. Nebo to myslíte jinak?
Kajman
Profil
Např. si budete do session ukládat tokeny pro formuláře (raději dvojice id_tokenu - hodnota_tokenu). Dvojici si vygenerujete při zobrazení formuláře, dáte do session a jako dva skryté inputy do toho formuláře. Při zpracování formuláře zkontrolujete, že v session je daná dvojice platná. Pokud je platná, formulář uložíte a token ze session odstraníte.
Keeehi
Profil
jakubk0c:
Šlo by to trochu rozvést
Je to vlastně úplně stejné jako obrana proti CSRF útoku. Tak si nastuduj to. Článků na toto téma je na internetu spousta takže s jejich pomocí bys to měl určitě zvládnout :)
jakubk0c
Profil
Super, todle je řešení. Děkuji

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:

0