Zadejte hledaný výraz...

Jak na insert řetězce s AUTO_INCREMENT

Luděk Kvapil
verified
rating uzivatele
5. 2. 2016 16:23:41
Potřebuju do sloupce vložit kombinaci stringu a AUTO_INCREMENT. Respektive první sloupec ID je AUTO_INCREMENT. Můj požadovaný výsledek je canonical URL. Tu si skládám na základě těch textových řetězců a toho ID (např. /kombinovana-chladnicka/159 přičemž 159 je to ID).
Hodnoty do sloupce canonical potřebuju zapsat současně se založením řádku. Dopředu vlastně to ID nevím, takže si to nemůžu zavolat přes PHP.
Vygoogloval jsem si, že mám použít CONCAT, ale nevím, jak mám zapsat, aby tam vložil ID, když v okamžik vkládání vlastně ještě neexistuje).
Nějaké návrhy?
5. 2. 2016 16:23:41
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172270
tomve
verified
rating uzivatele
(22 hodnocení)
5. 2. 2016 16:33:32
funkce return (s)
PDO - http://php.net/manual/en/pdo.lastinsertid.php
MySQLi - http://php.net/manual/en/mysqli.insert-id.php
(+ následný update řádku s daným id - sice na palici, ale...)
5. 2. 2016 16:33:32
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172269
Tom
verified
rating uzivatele
(7 hodnocení)
5. 2. 2016 16:35:05
zkrátka to nejde (pokud se bavíme o běžných db?) jedině trigger, který sloupec upraví po vložení
5. 2. 2016 16:35:05
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172268
// Předpokládám MySQL/MariaDB.
Ve zkratce: Nejde to. Auto-incremented index se přiřazuje až při zapisování řádku. Sice existuje způsob, jak se zeptat na příští auto-incremented číslo, ale nemáte jistotu, že ho dostane právě ten další insert - mezitím může odjinud přijít jiný zápis.
Podobné věci se dělají ve dvou krocích. Nejdřív se zapíše, co lze, pak to, co závisí na indexu.
5. 2. 2016 16:39:06
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172267
i-PRESS
verified
rating uzivatele
(2 hodnocení)
5. 2. 2016 16:39:18
Řešení je několik..
1) vrátí ID, které bude použito při následujícím insertu. Tuto variantu krajně nedoporučuji, protože mezi tím selectem a insertem může teoreticky proběhnout jiný.
2) Uložit prázdný string "", nebo třeba tu kategorii což vrátí ID a provést UPDATE toho ID kde hodnota bude "/kombinovana-chladnicka/".$id - nepěkné
3) Ukládat kategorii a id do samostatných sloupců - výhoda při přejmenování kategorie, kdy pak jde updatnout název bez změny ID a použití nějaký replace.
4) Lepší varianta by asi byla, mít kategorie ve zvláštní tabulce a u produktu pouze cizí klíč do ní, by se při přejmenování kategorie nemuseli updatovat stovky produktů. Stále by ale mohl být produkt pouze v 1 kotagerii, což by mohlo časem omezovat.
5) Nejlepší varianta mít tbl kategorie a spojovací tbl product_has_category a do něj insertovat pouze cizí klíč na kategorii a cizí klíč produktu. Produkt pak může mít i více kategorií
5. 2. 2016 16:39:18
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172266
James_Scott
verified
rating uzivatele
(7 hodnocení)
5. 2. 2016 16:48:54
V rámci normalizace DB mít kategorie zvlášť v tabulce pro vazbu 1:N nebo pro vazbu M:N ještě přes pojovací tabulku (takže přesně jak píše i-PRESS body 4,5)
Ostatní řešení jsou prasárna..
5. 2. 2016 16:48:54
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172265
Lze to udělat, locknout tabulku, z db získat next auto increment hodnotu, zapsat soubežne s insertem, unlocknout.
Důvod k tomu není, proč je potřeba ukládát to ID duplicitně?
Pokud jde o nasledny překlad URL na ID zbozi tak při selectu přece stačí použít select na to ID ne na celou cestu tj select .. from ... where id=159 , a nasledne po selectu volitene jeste overit cestu s tim stringem kombinovana-chladnicka bude to jiste rychlejsi a mene naročné na db.
5. 2. 2016 16:51:15
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172264
i-PRESS
verified
rating uzivatele
(2 hodnocení)
5. 2. 2016 17:03:23
To ID duplicitně je určitě nesmysl, já si akorát nebyl jist, jestli se ten insert týkal přímo tbl zboží, takže samozřejmě pokud je k dispozici cizí klíč produktu (id), nebo je to dokonce v tabulce produktu, tak u varianty není to ID třeba znova ukládat a stačí ta cesta :-)
5. 2. 2016 17:03:23
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172263
tomve
verified
rating uzivatele
(22 hodnocení)
5. 2. 2016 17:40:09
Kategorie, kategorie, kategorie. Nějak to z ničeho nemůžu vyčíst, že to je dotaz na tvorbu urlčka kategorie, to bych nepsal takovou blbost. Asi potřebuji k očnímu.
5. 2. 2016 17:40:09
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172262
Luděk Kvapil
verified
rating uzivatele
8. 2. 2016 08:56:15
Kategorie jsou v pohodě. Tam je canonická URL jasná. Problém je při zakládání nových produktů. Každý by měl mít unikátní URL, která obsahuje jeho ID ( ID v URL totiž označuje, který produkt se zobrazí).
Napadlo mě, že bych to řešil přes cron. Canonické URL by se vložily nejpozději do dvou hodin po založení produktu. Sice to není ideální, ale aspoň něco..
8. 2. 2016 08:56:15
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172261
i-PRESS
verified
rating uzivatele
(2 hodnocení)
8. 2. 2016 10:31:20
No já myslím že na to je autoincrement ideální, ne? Pominu tedy kategorie... Vložíte nový produkt do databáze. Je pak pouze věcí aplikace, aby dokázal naroutovat třeba "https://domena.cz/produkt/45678--radiobudik-sony" a načíst z tbl "produkty" položku s ID 45678. Tzn druhý dotaz po insertu vůbec podle mě nepotřebujete.
Pokud pak v app vypisujete rel="canonical" tak si to tam složte jako --, případně jinou formou, to je jedno. Uvádět v samostatném sloupci něco, co lze "poskládat" z jiných dat není vhodná cesta, což se pozná pak třeba při změnách, kdy je potřeba provádět složité updaty.
8. 2. 2016 10:31:20
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172260
Luděk Kvapil
verified
rating uzivatele
8. 2. 2016 10:37:54
Napsal i-PRESS;1264886
Pokud pak v app vypisujete rel="canonical" tak si to tam složte jako --, případně jinou formou, to je jedno. Uvádět v samostatném sloupci něco, co lze "poskládat" z jiných dat není vhodná cesta, což se pozná pak třeba při změnách, kdy je potřeba provádět složité updaty.
No eshop je právě naprogramován tak, že si tam lze poskládat jakoukoliv URL. Takže vznikl takový náhodný generátor URL adres, což není dobré pro SEO. Proto se právě snažím omezit ty duplicity přes canonickou URL.
8. 2. 2016 10:37:54
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172259
i-PRESS
verified
rating uzivatele
(2 hodnocení)
8. 2. 2016 10:54:14
Napsal siva01;1264892
No eshop je právě naprogramován tak, že si tam lze poskládat jakoukoliv URL.
Tomu rozumím, to je tak poměrně často, důležité ale právě je, abyste ten kanonický název poskládal vždy stejně. I tak však není nutné jej nikde zapisovat zvlášť. Uvedu příklad, třeba na již zmíněné URL:
"/45678--radiobudik-sony" - Vypíše se produkt, URl je kanonická
"/45678--tady-nejaky-blabol" - a) redirect na canonical, b) vypíše produkt, ale rel canonical bude URL výše
Takže stále je dle mě lepší tu URL "poskládat vždy stejně". Netuším jak je to řešeno, ale pokud někde vytvořím takový generátor kanonických adres, který to vždy složí z ID+názvu a vypíšu ji v šabloně, nemůže se mi stát, že budou na 1 produkt 2 kanonické URL. Navíc je pak změna adres otázka 1 úpravy na 1 místě. Já pak většinou volím formu přesměrování, aby byla kanonická URl i v adresním řádku, tedy pokud jsem z URL schopen zjistit ID produktu, napřed zkontroluji jestli jde o kanonický tvar a pokud ne, provedu na ni redirect.
8. 2. 2016 10:54:14
https://webtrh.cz/diskuse/jak-na-insert-retezce-s-auto_increment#reply1172258
Pro odpověď se přihlašte.
Přihlásit