Autor Zpráva
cistax
Profil *
DObrý den, chtěl bych se zeptat, jestli někdo nevíte, jak to mám udělat, když jsem si v db založil tabulku články a nastavil k sloupci nazev UNICATE, vzdy kdyz pridam clanek se stejnym nazvem, tak mi to hodi: Duplica Key 'clanek' for '2' . A já bych chtěl, aby mi php vypsalo : název článku je shodný s již existujícím článkem, ale JAK na to:?: díky předeem
Moderátor Alphard: Opraven překlep v názvu tématu
joe
Profil
Například takhle

if(!mysql_query("INSERT INTO ...")) {
if(mysql_error() == 1062) {

}
}

Tou funkcí mysql_error() si teď nejsem uplně jist, nevím jaký má přesně název. Ale dostaneš chybu s kódem 1062 a ještě nějaký, to ti napíše, když zkusíš ten dotaz třeba v phpMyAdminu.
keeehi
Profil
Před chvílí to tu bylo. ZDE
joe
Profil
keeehi
To ale není stejné.
Mike8748
Profil
mysql_error() vraci string, popis chyby.
mysql_errno() vraci cislo chyby
Tomasds
Profil
Snažíte se přímo odpovědět na otázku, ale já bych řekl, že problém je jinde.

cistax
Ne že by to nešlo řešit, ale dělá se to jinak. Přidej si do té tabulky sloupec ID, tomu nastav UNIQUE a autoincrement. ID potom při přidávání článku nezadávej, databáze se o to stará sama. Článek pak zobrazuj přes /zobrazitclanek.php?id=15 ( a select textclanku from clanky where id = ..). Není důvod neumožnit existenci dvou článků se stejným názvem, rozhoduje ID.

Jestli toto víš a máš opravdu důvod dělat to co popisuješ, tak mě ignoruj :)
joe
Profil
Tomasds
Pokud ten sloupec má jako ident, pak není možné, aby byly dva stejné :-)

Jinak to je jak napsal Mike8748. Já už v PHP zas dlouho nedělal, mi to všechno vypadlo :)
AM_
Profil
Pokud ten sloupec má jako ident, pak není možné, aby byly dva stejné :-)
Tak to asi Tomasds myslel, místo identifikace pomocí názvu článku použít ID. Tak se to dělá.

Přidej si do té tabulky sloupec ID, tomu nastav UNIQUE a autoincrement
ID se obvykle dává PRIMARY místo UNIQUE (každá tabulka by měla mít primární klíč).
joe
Profil
AM_
Já myslel ident jako například: nejaky-pekny-clanek
Toto se většinou skrývá pod identem v tabulce.
keeehi
Profil
joe
Jak to, že to není stejné? Je potřeba zjistit, zda je už název v DB. Jen to nebude zajišťovat databáze ale PHP.
joe
Profil
keeehi
Protože kdyby to dělal tím co jsi poslal, tak by vykonával dva dotazy zbytečně pokaždý. Takhle stačí jeden. Pokud se nevloží řádek, pak se vyvolá chyba, pokud ne, tak se řádek vloží.

V tom tématu, na který odkazuješ se řeší jen to, jestli už v databázi je nebo není.
AM_
Profil
Optimální řešení je podle mě jako ident používat ID. Pokud používá textový ident třeba kvůli pěkné url, udělal bych ty url třeba /clanky/15-o-koze-a-voze.htm, aby se zachovala pěkná url, ze které je jasné, o čem stránka je, přičemž při zpracování použije jen ID článku a název se zahodí.
joe
Profil
AM_
Tak by se to ale dělat nemělo, protože pak ti bude existovat nekonečně mnoho adres

/clanky/15-bla-bla.htm
/clanky/15-o-koze-a-voze.htm
/clanky/15-nejlepsi-web.htm
/clanky/15-nejlepsi-web
.
.
Článek by se měl objevit jen na jedné url. Takže vhodné je použít primární klič id - jako autoincrement a ident jako textový, který bude unique.
Alphard
Profil
joe:
Protože kdyby to dělal tím co jsi poslal, tak by vykonával dva dotazy zbytečně pokaždý. Takhle stačí jeden. Pokud se nevloží řádek, pak se vyvolá chyba, pokud ne, tak se řádek vloží.
neviděl bych to tak jednoznačně, jeden dotaz navíc při vkládání článku (jak časté to bude?) není taková katastrofa

id bych tam dal určitě, kvůli připojení jiných tabulek, přejmenování článku atd., hodí se, když tam zůstane zachovaný identifikátor

tvar URL je na autorovi, s mod_rewrite může být v podstatě jakýkoliv
joe
Profil
Alphard
Jasně, že to třeba při vkládání článku není katastrofa, ale je lepší, když bude vědět, že taková možnost tady je, a že se na dotazech vyplatí šetřit.
AM_
Profil
joe
OK, ale v tom případě bych to řešil tak, že řekněme po zadání 15-bla-bla.htm se z databáze vytáhne článek 15, ověří se jeho ident (který nemusí být unikátní, což řeší problém, že se to nemusí nijak ošetřovat), jestli je roven bla-bla, a pokud není, vyhodit 404.
cistax
Profil *
tomasds: drive jsem to mel na ?id=25 ale vice se mi libi kdyz to vypise ?nadpis=dobrej-clanek .... jo a díky všem za nápady, pokusím se to jedním z těch nápadů řešit
Tomasds
Profil
cistax
To se dělá úplně jinak. Řádky mají ID a to v rámci systému používáš k identifikaci. Používat pro identifikaci kus textu je dost neefektivní. To co ty chceš, tomu se říká pěkné adresy nebo cool uri .. pohledej tady v diskusi, zjistíš jak se to používá.
cistax
Profil *
j, diky, take jsem prisel jeste na jeden problem s tim ID, kdyz je to ?id=25, tak to nektere vyhledavace můžou prý brát jako že se tam ukládá hash od session
joe
Profil
Tomasds
Zase o tolik pomalejší to nebude, když na tom sloupci bude index. Taky nepředpokládám, že nepůjde o staticíce článků...

cistax
Nikdo ti nebrání, abys použil třeba /clanek=nejaky-clanek nebo jen /nejaky-clanek

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: