Autor Zpráva
Vanama
Profil *
Zdravím, potřeboval bych opět poradit.

Vytvořil jsem skript uvedený níže, který má za úkol aktualizovat řádek v databázi, pokud tam je. Pokud tam není, tak se řádek vloží. Problém mám ale v tom, že se může stát, že hodnoty, které se mají aktualizovay jsou naprosto stejné jako hodnoty, které jsou v DB a to mi udělá nežádoucí účinek a to ten, že mi vytvoří další řádek.

     $query = "UPDATE #__puarcade_leaders SET place='$place',points='$bestPosBonus[$place]',highscore='$highscore' WHERE gameid = '$gameid' AND userid = '$userid'"; 
     $database->setQuery($query);
		 $database->query();  

    if ($database->getAffectedRows() == 0) {
     $query = "INSERT INTO #__puarcade_leaders (userid, place, points, gameid, highscore) VALUES ('$userid', '$place', '$bestPosBonus[$place]', '$gameid', '$highscore')"; 
     $database->setQuery($query);
		 $database->query();      
    }


Dá se nějak udělat, aby ten skript nezakládal další řádek, pokud tam ten řádek je (hodnoty $gameid a $userid)? Vzhledem k tomu, že tohle se mi ve skriptu provede třeba 20x za sebou (s jinými hodnotami), nechci to zbytečně zatěžovat příkazem SELECT.

Díky za rady.
ninja
Profil
INSERT ... ON DUPLICATE KEY UPDATE nebo REPLACE
Vanama
Profil *
Tady to fakt žije a odpovědi jsou super rychlé. SUPER!

Vzhledem k tomu, že jsem se k těmto příkazům zatím nedostal, hledal jsem nějaké informace na internetu (vím, že jste mi to napsal i s odkazy, ale nějak si nerozumím s angličtinou) a zkusil jsem se s tím poprat. Zjistil jsem, že příkaz replace není dobré používat, protože je hodně nestandartní a tak jsem se vrhnul na druhý příkaz. Tak nějak jsem to dal dohromady, ale bohužel mi to pokaždý vytvoří nové, naprosto stejné řádky. Auto increment id tam nemám.

     $query = "INSERT INTO #__puarcade_leaders (userid, place, points, gameid, highscore) VALUES ('$userid', '$place', '$bestPosBonus[$place]', '$gameid', '$highscore') ON DUPLICATE KEY UPDATE place='$place',points='$bestPosBonus[$place]',highscore='$highscore'"; 
     $database->setQuery($query);
		 $database->query(); 


Mám tam někde chybu nebo jsem něco opomenul?
Kajman_
Profil *
Aby to fungovalo, musíte tam mít nějaký jedinečný klíč (gameid,userid), podle kterého to pozná, že už tam je příslušný řádek.

Případně první příklad jde upravit tak, že tam přidáte sloupeček, kam si budete dávat čas now(), takže se vždy zaktualizuje i když jsou ostatní hodnoty stejné. Ale i tam by se hodil jedinečný klíč.
Vanama
Profil
Asi nevím jak ho napsat. WHERE tam asi nefunguje a když tam zadám všechny hodnoty i při aktualizaci, tak se to chová stále stejně.

     $query = "INSERT INTO #__puarcade_leaders (userid, place, points, gameid, highscore) VALUES ('$userid', '$place', '$bestPosBonus[$place]', '$gameid', '$highscore') ON DUPLICATE KEY UPDATE userid='$userid',gameid='$gameid',place='$place',points='$bestPosBonus[$place]',highscore='$highscore'"; 
     $database->setQuery($query);
		 $database->query(); 
Kajman_
Profil *
Asi nevím jak ho napsat.
ALTER TABLE puarcade_leaders ADD UNIQUE INDEX nazevindexu (userid, gameid)

Ale nepůjde Vám to, pokud tam nemáte jedinečné hodnoty v těchto sloupečcích. V syntaxy naleznete možnost ignore... ale jesli si nejste jistý, co všechno za data ztratíte a že to tak opravdu chcete, tak to raději nezkoušejte.
Vanama
Profil
Index mi nějak nešel vytvořit a tak mám tabulku bez indexu. A tak jsem se vrátil k tomu svýmu původnímu skriptu s tím, že jsem si vytvořil sloupec time a při aktualizaci do něj zapisuju čas pomocí time(). Nevím proč, ale příkaz now() mi nějak nefungoval.

     $query = "UPDATE #__puarcade_leaders SET time='".time()."',place='$place',points='$bestPosBonus[$place]',highscore='$highscore' WHERE gameid = '$gameid' AND userid = '$userid'"; 
     $database->setQuery($query);
		 $database->query();  

    if ($database->getAffectedRows() == 0) {
     $query = "INSERT INTO #__puarcade_leaders (userid, place, points, gameid, highscore) VALUES ('$userid', '$place', '$bestPosBonus[$place]', '$gameid', '$highscore')"; 
     $database->setQuery($query);
		 $database->query();  


Každopádně Vám děkuji.
Toto téma je uzamčeno. Odpověď nelze zaslat.