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.
Tvůrce
Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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.
Buď getLastID, nebo pokud to chceš mít v dotazu tak takto
SELECT *
FROM inzeraty
ORDER BY inzeraty_id DESC
LIMIT 1;
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
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šší.
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..
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ý
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
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ě.
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...
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..
Zobrazeno 11 zpráv z 11.