NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: MySQL databáze automaticky přičítá +1

V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Griven
Člen
Avatar
Griven:22.9.2015 16:43

Dobrý den. Mám jednoduchý php soubor kde z MySQL databáze si nechám vypsat data, provede nějaké kontroly a zapisuje je zpět do db přičte +1. takže když z db vytáhnu třeba hodnotu "45" tak chci aby zapsal hodnotu 46. ale nezapíše hodnotu "46" ale "47". Přitom když si vypíšu co mu přišlo z databáze, po přičtení 1 a po zápisu do databáze tak pokaždé hodnoty sedí ale mysql si prostě řekne že mu přičte ještě jednu. Když dám aby přičítal třeba 2 tak přičte ty dvě + další dvě. takže z 45 má být 47 ale do db se uloží 49. Nevím čím to je , už se s tím drbám druhý den a nemohu na to přijít. Nestalo se to někomu nebo neví někdo co s tím ? Děkuji předem za odpověď.

$sql = mysql_query("SELECT * FROM tabulka");
$data = mysql_fetch_array($sql);

print_r($data); // zde jsou hodnoty v pořádku jak přišli z db

$data["val"]++;

echo $data["val"]; // Zde jsou hodnoty přesně jak chci zapisovat do db čili +1

mysql_query("UPDATE tabulka SET val=".$data["val"]." ;");

//když se podívám do PMA tak nahrál další +1 tzn z původní hodnoty je to +2;

zkoušel jsem to i zjednodušeně a to přímo v příkazu SET val=val+1 ; ale to také přičítá +2. Už nevím co s tím mám dělat.

 
Odpovědět
22.9.2015 16:43
Avatar
Milan Křepelka
Tvůrce
Avatar
Milan Křepelka:22.9.2015 17:08

Není možné, že tam je trigger o kterém nevíš, který dělá to samé co ty v aplikační logice? Tedy přičítá jedničku?

 
Nahoru Odpovědět
22.9.2015 17:08
Avatar
Griven
Člen
Avatar
Odpovídá na Milan Křepelka
Griven:22.9.2015 17:19

Nemyslím si. Jsem teĎ ještě zkoušel když mu nechám nahrát hodnotu pevně ... SET val="55"; tak ji tam nahraje správně. Jen když tam chci nacpat proměnou tak přičte další +1. takže teĎ jsem z toho ještě víc v prdeli než předtím. přitom i když si tu proměnou vypíšu před i za tak pokaždé mi vyjde stejná hodnota. ale v db je prostě o jedno větší.

 
Nahoru Odpovědět
22.9.2015 17:19
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Griven
David Hartinger:22.9.2015 17:28
  1. Loguj si kolikrát se ten skript spustil
  2. Zamysli se vážně nad tím, zda je vhodné používat funkce co již neexistují a o té SQL injekci raději ani nemluvím. Že vás to baví.
Nahoru Odpovědět
22.9.2015 17:28
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Ondřej Langr (andysekcze):22.9.2015 17:36

Při tom jako by tu neměli o bezpečnosti a SQL dost ;-)

Nahoru Odpovědět
22.9.2015 17:36
I have a charger. I have Note 7. Umh I haven't Note7.
Avatar
Griven
Člen
Avatar
Odpovídá na David Hartinger
Griven:22.9.2015 17:38

Pustí se jednou. K injekci dojít nemůže, protože tam nedosazuji hodnoty které se dají ovlivnit. k ukázce jsem použil mysql_query abych to nemusel psát celé. k ukázce mého problému je to dostačující.

 
Nahoru Odpovědět
22.9.2015 17:38
Avatar
Odpovídá na Griven
Michal Žůrek - misaz:22.9.2015 17:41

neovlivnitelné hodnoty asi myslíš ty co načítač v input typu number, že? :) No kžadopádně to fakt vypadá na to, že se to prostě zavolá 2×. Zkus si dát nějaký log do souboru.

 
Nahoru Odpovědět
22.9.2015 17:41
Avatar
Michal Žůrek - misaz:22.9.2015 17:41

ještě můžeš zkusit restartovat MySQL, někdy to pomůže.

 
Nahoru Odpovědět
22.9.2015 17:41
Avatar
Griven
Člen
Avatar
Griven:22.9.2015 18:17

Neovlivnitelnýma myslím ty, které si nemají s formulářem nic společného. vytáhne si data z mysql, zpočítá a nahraje z5.

 
Nahoru Odpovědět
22.9.2015 18:17
Avatar
Odpovídá na Griven
Michal Žůrek - misaz:22.9.2015 18:49

a za jakých okolností to dělá?

 
Nahoru Odpovědět
22.9.2015 18:49
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Griven
David Hartinger:22.9.2015 21:47

k ukázce jsem použil mysql_query abych to nemusel psát celé

Nevím, proč používáš k ukázce něco, co už v PHP dávno není? K injekci samozřejmě dojít může, protože tam dáváš proměnnou, do té si může kdokoli cokoli uložit, že to tam ty teď neděláš neznamená, že dalšího člověka co to bude upravovat nebe tebe pak nenapadne dát tam něco z formu. A ne, nebudeš kontrolovat X řádků co se s tou proměnnou dělá, prostě to tam napereš. A pak je z toho pěknej průser. Představ si, že to tady někdo uvidí a nedej bože to použije. Hlavně, že to vždycky odůvodníte nějakým nesmyslem.

K tvému problému. Pokud to dělá i samotný kód:

UPDATE tabulka SET val=val + 1

, proč sem posíláš ten PHP kód? Je tedy bezpředmětný. Co se stane, když SQL kód výše dáš do SQL konzole? Pokud se to zvýší o 2, tak zkus založit novou tabulku a zkus to samé. Případně novou DB. Přijde mi docela jednoduché přijít na to čím to je, stačí to vyzkoušet.

Nahoru Odpovědět
22.9.2015 21:47
New kid back on the block with a R.I.P
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.