Autor | Zpráva | ||
---|---|---|---|
jakubk0c Profil |
#1 · Zasláno: 16. 7. 2019, 06:08:09
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 |
#2 · Zasláno: 16. 7. 2019, 07:36:31
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 |
#3 · Zasláno: 16. 7. 2019, 07:41:28
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 |
#4 · Zasláno: 16. 7. 2019, 07:48:30
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 |
#6 · Zasláno: 16. 7. 2019, 09:09:54
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 |
#7 · Zasláno: 16. 7. 2019, 09:21:29
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 |
#8 · Zasláno: 16. 7. 2019, 09:23:43
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 |
#9 · Zasláno: 16. 7. 2019, 10:15:51
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 |
#10 · Zasláno: 16. 7. 2019, 10:37:01
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 |
#11 · Zasláno: 16. 7. 2019, 12:54:30
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 |
#12 · Zasláno: 16. 7. 2019, 12:55:55
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 |
#13 · Zasláno: 18. 7. 2019, 09:11:05
Super, todle je řešení. Děkuji
|
||
Časová prodleva: 4 roky
|
0