IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: cisla objednavek

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

Aktivity
Avatar
brickleberry
Člen
Avatar
brickleberry:4.2.2015 18:51

Ahoj, snad tím, že vytvářím nové vlákno ještě když nemám dořešeno starší neporušuji zdejší pravidla. Pokud ano, omlouvám se...

Napřed bych asi měl popsat problém... Takže mám tabulku objednávky, zde se mi tedy ukládají objednávky včetně aktuálního datumu (fukce NOW() ) Vše jede jak má, ale nyní jsem založil do tabulky sloupec cisla_objednavek. Ten je samozřejmě prázdný, což je logické zatím není součástí insertního dotazu. Má myšlenka je taková, že bych vzal aktuální datum ještě před jeho vložením do DB (kde má formát 2015-02-04, čili je zde ve sloupci nastaven datový typ DATE) a tento datum vzal dal do formátu 20150204 a přidal k němu ID objednávky takže by to vypadalo takto 20150204100 tímpádem by nemohlavvzniknout duplicita, protože id objednávky je vždy jedinečné.. Takže zatím má otázka je to proveditelné? nebo to mám řešit spíše pomocí triggerů a autoincrementu? Na to si ale netroufám... Pokud má myšlenka je proveditelná, poradí mi někdo jak začít? jen upozorňuji, že se bude jednat o 2 datumy. První klasický co tam již je fukcí NOW() a druhý upravený a přidání k němu ID objednávky. Děkuji za případné rady a tipy

 
Odpovědět
4.2.2015 18:51
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:4.2.2015 18:58

Není to zbytečné? Přece ID je taky unikátní a nemůže se opakovat.

Ale pokud ti jde aby to vypadalo pěkně "32548" a ne "1", "2", atd..
Tak můžeš např. č.objednavky dělát takto:

$id = "id z DB"
$cislo = 54681 // libovolné číslo
$objednavka = $cislo . $id

tím pádem se ti č.objednávky nebude opakovat. Jelikož id je vždy jedinečné.

PS: Číslo může být např. číslo dané sekce v eshopu :)

Editováno 4.2.2015 18:59
Nahoru Odpovědět
4.2.2015 18:58
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:4.2.2015 19:25

Takže říkáte, že si to tímto zbytečně komplikuji? Šlo mi o to, že by se v tom čísle potom dalo dohledat danou objednávku lépe... tj. když bude mít někdo na třeba faktuře 20150204+id obj. vědělo by se, že se jedná o objednávku z 4.2.2015 + id... Nyní když mám dvě tabulky s objednávkama pro registrované a neregistrované pak by to mohlo dělat guláš ne? leda, že bych podle Vašeho kódu nastavil manuálně jiné číslo třeba 3888 na nereg. uživatele a 4888 na reg uživatele...?

 
Nahoru Odpovědět
4.2.2015 19:25
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:4.2.2015 19:31

Snažíš se udělat to co už je v základu hotové :D

Přece když v tabulce budeš vyhledávat podle ID a podle toho čísla objednávky tak dostaneš stejné výsledky :)

Nahoru Odpovědět
4.2.2015 19:31
Neaktivní uživatelský účet
Avatar
sahlepik
Člen
Avatar
Odpovídá na brickleberry
sahlepik:4.2.2015 19:34

Mě se naopak líbí tvoje myšlenka datum+jedinečné id. Má to logiku, je to přehledné a jedinečnost čísla objednávky zůstane zachována. Ale to je jen můj osobní názor. To id se každý den začíná načítat od "1" nebo to stále pokračuje v inkrementaci? Podle mě ale není nutné mít zvlášť část datumu a id. spojil bych to a uložil do jednoho sloupce jako id_objednavky

Editováno 4.2.2015 19:36
 
Nahoru Odpovědět
4.2.2015 19:34
Avatar
brickleberry
Člen
Avatar
Odpovídá na sahlepik
brickleberry:4.2.2015 19:49

tak jsem nakonec přistoupil, jelikož jsem ještě lama k tomu rychlešímu tvému řešení.. Nicméně se mi tedy do sloupce cislo_objednavky ulozi toto 1000id_objednav­ky_bez_registra­ce
skript

$id = "id_objednavky_bez_registrace" ;
$cislo = 1000; // libovolné číslo
$cislo_objednavky = $cislo . $id;

        if (mysql_query($sql)) {
          $sql="INSERT INTO e_objednavky_bez_registrace (nazev,pocet,cena,jmeno,prijmeni,ulice,mesto,psc,email,telefon,datum,id_produktu,cislo_objednavky)VALUES('$nazev','1','$cena','$jmeno','$prijmeni','$ulice','$mesto','$psc','$email','$telefon',NOW(), '$id_produktu', '$cislo_objednavky')";

logicky usuzuji, že to nedokázalo přečíst dané id?

reakce k dalšímu příspěvku od sahlepik:
id objednávky je primary klic a autoincrement, takže to od 1 každý den nepokračuje.. takže tvá myšlenka spočívá v přiřetězení sloupce datumu a id... ale nevím jak to udělat aby se jednou ten datum uložil ve formátu 2015-02-04 a podruhé aby se uložil 20150204 a id..

 
Nahoru Odpovědět
4.2.2015 19:49
Avatar
sahlepik
Člen
Avatar
Odpovídá na brickleberry
sahlepik:4.2.2015 19:55

Datum ve formátu xxxx-xx-xx se dá rozsekat PHP funkcí explode(), kdy dělícím znakem bude pomlčka a pak ty díly, které vzniknou, jen spojíš + k němu připojíš číselné id.

$id = "id_objednavky_bez_registrace" ;
$cislo = 1000; // libovolné číslo
$cislo_objednavky = $cislo . $id;

Tohle je zajímavý kód, k čemu tam je ten dlouhý textový řetězec?

 
Nahoru Odpovědět
4.2.2015 19:55
Avatar
brickleberry
Člen
Avatar
Odpovídá na sahlepik
brickleberry:4.2.2015 19:58

myslíš tím řádek

$id = "id_objednavky_bez_registrace" ;

? že? Už jsem si to uvědomil a napsal místo toho

$id = $_GET["id_objednavky_bez_registrace"] ;

nyní mi to v DB ukáže pouze hodnotu 1000 ALE nepřičte tam id objednavky

 
Nahoru Odpovědět
4.2.2015 19:58
Avatar
Odpovídá na brickleberry
Neaktivní uživatel:4.2.2015 20:00

A co do sloupců id_objednavky vkládat normálně ID, jak jde za sebou a při výstupu to spojit s datem pomocí nějaké pomlčky? Bylo by to efektivní...

Nahoru Odpovědět
4.2.2015 20:00
Neaktivní uživatelský účet
Avatar
brickleberry
Člen
Avatar
Odpovídá na Neaktivní uživatel
brickleberry:4.2.2015 20:03

Nevím jestli jsem porozuměl dobře, ale id_objednavky je klasicke id s autoincrementem.

 
Nahoru Odpovědět
4.2.2015 20:03
Avatar
sahlepik
Člen
Avatar
Odpovídá na brickleberry
sahlepik:4.2.2015 20:15

A co třeba jako id použít za sebou napsaný datum a aktuální čas? Např.:

$id = date("YnjHis");

Tohle bude jistě jedinečné číslo a stále budeš schopen z čísla objednávky vyčíst, kdy byla uskutečněna a dokonce v kolik hodin, minut a sekund :D

 
Nahoru Odpovědět
4.2.2015 20:15
Avatar
brickleberry
Člen
Avatar
Odpovídá na sahlepik
brickleberry:4.2.2015 20:20

Nevím co na to napsat.. Málem mi ukápla i krokodýlí slza ... Moc děkuji... Nejen tobě ale všem co se účastnili...

 
Nahoru Odpovědět
4.2.2015 20:20
Avatar
brickleberry
Člen
Avatar
Odpovídá na sahlepik
brickleberry:4.2.2015 22:49

měl bych ještě konečný dotaz. Když mám nastaveno na sloupci cislo_obj varchar(100) a ukládám tam čísla takto velká 2015242245582000 nebude to v budoucnu dělat problém, že nebude stačit velikost znaků na tom sloupci.. chápu to dobře že teď to má jelikož je to 16cticiferné číslo varchar(16) ?

 
Nahoru Odpovědět
4.2.2015 22:49
Avatar
Ori I
Člen
Avatar
Odpovídá na brickleberry
Ori I:4.2.2015 23:05

tak za prvé pokiaľ tam nebudeš mať iné znaky ako čísla tak by som to nastavil na int, poprípade bigint. Taktiež kvôli duplicite údajov by som stĺpec číslo objednávky úplne vynechal, pretože mal by si mať stĺpec date a taktiež ID. A keďže tento stĺpec je zložených z týchto dvoch tak zbytočne budeš držať v DB údaje, čiže zbytočnosť. Predstav si to, že by si mal stĺpec Meno potom ďalší Priezvisko a potom stĺpec celé meno(kde by bolo uložené meno aj priezvisko) ... aká by bola pointa tohto stĺpca ?

 
Nahoru Odpovědět
4.2.2015 23:05
Avatar
sahlepik
Člen
Avatar
Odpovídá na brickleberry
sahlepik:4.2.2015 23:57

Každá číslice se v případě VARCHAR bere jako jeden znak, ID objednávky totiž ukládáš do databáze jako textový řetězec s proměnlivým počtem znaků.

 
Nahoru Odpovědět
4.2.2015 23:57
Avatar
brickleberry
Člen
Avatar
 
Nahoru Odpovědět
5.2.2015 12:49
Avatar
solta
Člen
Avatar
solta:5.2.2015 14:31

nevim presne na co to potrebujes ale cislo objednavky se obvykle pouziva jako variabilni symbol ten muze mit maximalne 10 cislic dobrym zvykem je na zacatku myt 2 mebo 4 znamky urcujici rok a dale nasleduje vetsinou poradove cislo objednavky toho roku. Obcas se jeste rozlisuje treba stredisko, pridava se jeste treba mesic.
YYYY00000n
YY0000000n
YYMM00000n
YY0100000n

 
Nahoru Odpovědět
5.2.2015 14:31
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 17 zpráv z 17.