NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Skutečné naposledy použité ID v DB

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

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:3.9.2015 9:58

Ahoj.
Už jsem se na něco podobného ptal jednou, ale dá se nějakým dotazem přes správceInzeratu zeptat db, které ID naposledy použilo? Je tam nastaveno AI, takže když třeba smažu záznamy 345 a 346 a vložím nový, tak použije ID 347 protože to je v pořadí. Jenže v url cestě vytvářím ID na konec řetězce tak, že použiju poslední v DB a zvětším o jedna.

Takže když dva záznamy vymažu tak další se uloží s dobrým číslem v ID ale v URL už to nesedí.. Ono to funguje, ale je to matoucí.. Když jsem zkoušel getLastID tak to vracelo nulu, navíc getLastID mi stejně vrátí největší ID, které v DB reálně je, ne?

Díky

 
Odpovědět
3.9.2015 9:58
Avatar
shaman
Člen
Avatar
Odpovídá na Michal Kuba
shaman:3.9.2015 10:37

To mas dost zle ak ty musis posielat id. Beries si na seba problemy, ktore SQL uz perfektne riesi.
Ak je id nastavene v tabulke ako autoincrement, tak nemusis posielat id. SQL si sam nastavi dalsiu hodnotu. Vzapeti si mozes vypytat svoje lastInsertedId­.Takze mozes pracovat s novym id.

Nahoru Odpovědět
3.9.2015 10:37
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Pedro
Člen
Avatar
Odpovídá na Michal Kuba
Pedro:3.9.2015 11:12

Buď getLastID, nebo pokud to chceš mít v dotazu tak takto

SELECT *
        FROM inzeraty
        ORDER BY inzeraty_id DESC
        LIMIT 1;
 
Nahoru Odpovědět
3.9.2015 11:12
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Pedro
Michal Kuba:3.9.2015 11:55

Tohle právě bere poslední existující záznam, takhle to mam teď. Když poslední smažu tak to do URL dává jiné číslo.než do AI sloupce ID

 
Nahoru Odpovědět
3.9.2015 11:55
Avatar
Pedro
Člen
Avatar
Odpovídá na Michal Kuba
Pedro:3.9.2015 13:29

Hoď sem blok kódu :) Nicméně je mi divný že by ti to takhle házelo jiný čísla. Do url by mělo být možný to přímo z databáze vytáhnout dotazem na ID. Navíc poslední použitý ID by mělo bejt to nejvyšší.

 
Nahoru Odpovědět
3.9.2015 13:29
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Pedro
Michal Kuba:3.9.2015 13:34

Bere to největší ID v databázi, když nějaký záznam ale vymažu (poslední) tak nový řádek se vytvoří s dobrým ID, ale do url to ukládám "ručně" a tam beru poslední ID + 1..

Tohle je kontroler podávající inzerát, část:

if ($_POST)
              {$id=$spravceInzeratu->aktualniID();
             $id=$id['ID']+1;

         $_SESSION['inzerat']= $inzerat = array(
                                      'ID' => $_POST["ID"],
                      'titulek' => $_POST['titulek'],
                      'obrazek' => $_FILES['obrazek'],
                      'url'=>$this->upravTitulek($_POST['titulek']).'-'. $id  ,
                      'text' => $_POST["text"],
                      'kategorie' => $_POST["kategorie"],
                      'upresneni' => $_POST['upresneni_' . $_POST['kategorie']],
                      'mesto' => $_POST["mesto"],
                       'autor' => $_SESSION['uzivatel']['login']);

takhle vypadá metoda v modelu:

public function aktualniID(){
    $res= Db::dotazJeden('SELECT ID FROM inzeraty ORDER BY `ID` DESC LIMIT 1');
    return $res;

}

Když prostě mám tři položky v db, poslední má ID 345 a já ji vymažu, udělám nový inzerát, tak ten nový si uloží ID 346, ale do url to už vkládám tak, že vezmu nejvyšší ID (tím je ted už např: 344) a přičtu 1 - takže v url pak mám jiné číslo než v ID..

 
Nahoru Odpovědět
3.9.2015 13:34
Avatar
Pedro
Člen
Avatar
Pedro:3.9.2015 14:12

Jestli tenhle blok posílá data novýho inzerátu do databáze, pak by sis ID mohl vytáhnout z už existujícího záznamu. Napadá mě třeba tady vynechat id a poslat ty data jako novej záznam. Pak se ptát jestli je nastavená session['inzerat']. Pokud jo, pak zkontrolovat, zda nejnovější záznam v databázi odpovídá tomu co máš v tý session, a pokud jo, tak si vytáhnout nejvyšší ID z databáze a rovnou třeba přes header přesměrovat na ten inzerát.

Vim...moc teoretický :D

 
Nahoru Odpovědět
3.9.2015 14:12
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Pedro
Michal Kuba:3.9.2015 14:16

I trochu složitý. Nechám to zatím takto, budu doufat v to, že až to bude v provozu tak ty inzeráty nebudou mizet tak rychle, spíš se nebudou mazat poslední vložené a bude to v pořádku :-)

 
Nahoru Odpovědět
3.9.2015 14:16
Avatar
hitzoR
Člen
Avatar
hitzoR:3.9.2015 17:17

Taková dobrá rada, která se týká nějaké obecné teorie o databázích - nikdy nic nemaž. Pokud něco potřebuješ smazat, tak si tam udělej sloupec, třeba s názvem "active" a defaultní hodnotou 1 s tím, že když to člověk bude chtít smazat, tak do toho sloupce nastavíš hodnotu 0. Hodnotu tohohle sloupce taky budeš kontrolovat při výběru z databáze (jak nějakého výpisu inzerátů, tak při linku na konkrétní inzerát). Ono být uživatelem, uložit si nějaký inzerát do záložek a přijít druhý den a vidět na stejné adrese úplně jiný inzerát je dost matoucí, o SEO ani nemluvě.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
3.9.2015 17:17
Avatar
Odpovídá na Michal Kuba
Matyáš Procházka:3.9.2015 17:43

Co takhle mít ještě jednu tabulku, kde si budeš ukládat různý data, tudíž tabulka se sloupcema něco jako:

ID | NAME | CONTENT

a tam si uložíš jeden záznam, kterej budeš vždy aktualizovat a bude něco jako:

ID se vyplní samo, Name bude třeba AdvertCount a jako Content dosadíš na začátku číslo 0 a při každym novym inzerátu ho zvětšíš o jedna, tudíž budeš mít vždy aktuální číslo inzerátu...

 
Nahoru Odpovědět
3.9.2015 17:43
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na hitzoR
Michal Kuba:4.9.2015 8:37

No jo, ale takhle se mi databáze přeplní.. Můžu si ale udělat funkci, že po třeceti dnech se inzerát kompletně vymaže z db, pokud nebude poslední, ne? Nemám zatím nijak extra velkou db a takhle bych mohl za chvíli skončit..

 
Nahoru Odpovědět
4.9.2015 8:37
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.