Avatar
virgis
Člen
Avatar
virgis:

Nazdar mám dve update

$sql = ("UPDATE members SET   money=money+'2' WHERE id='$id' AND body<10");
       ("UPDATE members SET   money=money-'2' WHERE id='$id' AND body>10");

ale plní sa len ten hore ten dolný akoby tam nebol. Viem že to mm zle preto vás idem poprosiť o pomoc ako by som mohol tieto ve update spojiť ale vytvoriť z toho nejaký funkčný kód. Ke to pôjde tak prosím bez podmienky if. Ďakujem

 
Odpovědět 2.1.2014 12:10
Avatar
mkub
Redaktor
Avatar
Odpovídá na virgis
mkub:

zavana ti to rozbitim databazy, ak obe UPDATE nezlucis do jednej transakcie a na transakcie potrebujes InnoDB

 
Nahoru Odpovědět 2.1.2014 12:14
Avatar
Kit
Redaktor
Avatar
Odpovídá na virgis
Kit:
$sql = "UPDATE members SET money=money+if(body<10, 2, if(body>10, -2,0)) WHERE id=$id";

Bacha, může ti to kmitat stejně jako původní řešení.

Editováno 2.1.2014 12:26
Nahoru Odpovědět 2.1.2014 12:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na mkub
Kit:

Ovladač MySQL v PHP AFAIK neumí dva SQL dotazy v jednom příkazu.

Nahoru Odpovědět 2.1.2014 12:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na virgis
Kit:

Ještě dodatek: Čísla v SQL nepatří do apostrofů. MySQL to sice překousne, ale jiné databáze to tvrdě odmítají.

Nahoru Odpovědět 2.1.2014 12:28
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
mkub
Redaktor
Avatar
Odpovídá na Kit
mkub:

len som ho upozornil na nebezpecenstvo, co vznikne pri vzajomnom posobeni tychto prikazov v databaze... a SQL prkaz UPDATE je destrukcny - meni udaje v databazi, lahko sa moze stat, ze pri vzajomnom pristupe viacerych navstevnikov k databaze sa cela tabulka stane nekonzistentnou...
tu treba potom zacat pouzivat transakcie, resp. zamky na citanie/zapis pri zachovani konzistencie

 
Nahoru Odpovědět 2.1.2014 12:40
Avatar
Kit
Redaktor
Avatar
Odpovídá na mkub
Kit:

Podle názvu proměnných to spíš vypadá, že to riziko není vysoké. Proč však dělat dva SQL dotazy a spojovat je do jedné transakce, když to jde jedním SQL dotazem, u kterého je transakčnost zajištěna?

Nahoru Odpovědět  +1 2.1.2014 12:44
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
virgis
Člen
Avatar
virgis:

No dám si určite pozor ale Kit tiež ide o to že ja tam mám asi 5 premenných v jednom a vdruhom sa robí to isté len sa mení jedna no skúsim to aj ked stím bude veľa práce :) Ďakujem za kód aj za upozornenia.

 
Nahoru Odpovědět 2.1.2014 12:52
Avatar
Kit
Redaktor
Avatar
Odpovídá na virgis
Kit:

5 proměnných není moc. Napiš si to na víc řádek, ať v tom neztratíš přehled

$sql = <<<EOT
UPDATE members
    SET
        money=money+if(body<10, 2, if(body>10, -2, 0)),
        wood=wood+5,
        steel=steel+2*body
    WHERE
        id=$id
EOT;

To jsem si jen trochu vymýšlel, je to na tobě.

Nahoru Odpovědět  +1 2.1.2014 13:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
virgis
Člen
Avatar
virgis:

Ďakujem všetko krásne ide :)

 
Nahoru Odpovědět 2.1.2014 14:39
Avatar
virgis
Člen
Avatar
virgis:

Môžem sa opítať čo robí ta núla na konci ? Akú ma funkciu ? Lebo zase mi niečo neje

0)),
 
Nahoru Odpovědět 2.1.2014 16:49
Avatar
Kit
Redaktor
Avatar
Odpovídá na virgis
Kit:

Předpokládal jsem, že pokud body==10, tak to nemá dělat nic. Alespoň to vyplývá z původního dotazu.

Nahoru Odpovědět 2.1.2014 16:55
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
virgis
Člen
Avatar
virgis:

Aha dobre chápem.

 
Nahoru Odpovědět 2.1.2014 16:57
Avatar
virgis
Člen
Avatar
virgis:

Kit a keď chcem nastaviť jednu premennu na niekoho iného a nie na id ale chcem aby ostatné premenné boli na id jak to mám teraz tak to mám ako urobiť ? Stačí to dať za to f ako to ostatné ? Pretože v podstate sú všetky premenné nastavené na id

 
Nahoru Odpovědět 2.1.2014 20:33
Avatar
Kit
Redaktor
Avatar
Odpovídá na virgis
Kit:

Obvykle je v takovém případě výhodnější udělat dva SQL dotazy a uzavřít do transakce. Napřiklad pokud dva hráči spolu obchodují a mění si zboží za peníze. Pokud však máš správně navrženou databázi, jde to i jedním SQL dotazem, jen je to možná o něco komplikovanější.

$sql = <<<EOT
UPDATE members
    SET
        money=money+if(id=$id1, $cena, if(id=$id2, -$cena,0)),
        wood=wood+if(id=$id1, -$pocet, if(id=$id2, $pocet,0))
    WHERE
        id=$id1 OR id=$id2
EOT;
Nahoru Odpovědět 2.1.2014 20:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
virgis
Člen
Avatar
virgis:

Aha oukej ale keď sa jedná o zápis textu do databáze cca 3 slová a nejde o číselné hodnoty ? Chcem aby príkaz napísal prihlásenému napríklad Ahoj a tomu druhému užívateľovi napísal napríklad Dovidenia. Skúšal som lenže to vyhadzuje errory

 
Nahoru Odpovědět 2.1.2014 21:58
Avatar
Kit
Redaktor
Avatar
Odpovídá na virgis
Kit:

V tom případě jsi udělal nějakou chybu. Stringy nemůžeš sčítat.

Nahoru Odpovědět 2.1.2014 22:08
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
virgis
Člen
Avatar
virgis:

Takže en kód sa asi nedá použiť na text nie ?

 
Nahoru Odpovědět 3.1.2014 12:06
Avatar
Kit
Redaktor
Avatar
Odpovídá na virgis
Kit:

Na text ho musíš trochu upravit. Přece jen jsou operace se stringy odlišné od operací s čísly. A asi nebudeš chtít stringy sčítat, ale například vyměňovat.

Nahoru Odpovědět 3.1.2014 12:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
virgis
Člen
Avatar
virgis:

No to jo.... Pokusím sa a uvidím že čo ako poprípade nájdem niečo na nete.

 
Nahoru Odpovědět 3.1.2014 15:49
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 20 zpráv z 20.