« 1 2 »
Autor Zpráva
Školník
Profil
Stalo se vám někdy, že switch přeskočil několik podmínek? Na jedné stránce mam aspoň 4 switch podmínky a vždycky, kdy že case 08: prikaz a case 09: prikaz. Vzdycky to preskočí osmičku a devítku, ve všech případech. 10 už zase funguje v pohodě...:-?
WertriK
Profil *
Samo od sebe by to php nepreskocilo, chyba bude nekde v scriptu ...
Peca
Profil
Hoď sem kus zdrojáku, podíváme se na to... Nechybí tam třeba někde break?
Školník
Profil
Je to trochu delší... [menu1_id i 2 i 3 i 4 nabývá správných hodnot] DÍKY


switch ("$menu1_id")
{
case 01: $menu1_name = 'O firmě'; $menu1_link = 'o-firme';
switch ("$menu2_id")
{
case 01: $menu2_name = 'Novinky'; $menu2_link = 'novinky'; break;
case 02: $menu2_name = "Činnost firmy"; $menu2_link = 'cinnost-firmy'; break;
case 03: $menu2_name = "Profil firmy"; $menu2_link = 'profil-firmy'; break;
case 04: $menu2_name = "Certifikáty a ocenění"; $menu2_link = 'certifikaty-a-oceneni';
switch ("$menu3_id")
{
case 01: $menu3_name = 'Certifikáty'; $menu3_link = 'novinky'; break;
case 02: $menu3_name = "Ocenění"; $menu3_link = 'oceneni'; break;
default: $menu3_name = ""; break;
}
break;
case 05: $menu2_name = 'Členství'; $menu2_link = 'clenstvi'; break;
case 06: $menu2_name = 'Napsali o nás'; $menu2_link = 'napsali-o-nas'; break;
case 07: $menu2_name = 'Logo firmy a graf. manuál'; $menu2_link = 'logo-firmy-a-graficky-manual'; break;
//tady chyba zacina
case 08: $menu2_name = 'Sponzorské aktivity'; $menu2_link = 'sponzorske-aktivity'; break;
case 09: $menu2_name = 'Videoprezentace firmy'; $menu2_link = 'videoprezentace-firmy'; break;
//tady konci
case 10: $menu2_name = 'Výrobní prostory'; $menu2_link = 'vyrobni-prostory'; break;
case 11: $menu2_name = 'Zaměstnání'; $menu2_link = 'zamestnani'; break;
default: $menu2_name = ""; break;
}
break;
case 02: $menu1_name = "Produkty"; $menu1_link = 'produkty';
switch ("$menu2_id")
{
case 01: $menu2_name = 'Lisy do 5 tun lisovacího tlaku'; $menu2_link = 'lisy-do-5-tun-lisovaciho-tlaku';
switch ("$menu3_id")
{
case 01: $menu3_name = 'L3-V'; $menu3_link = 'lis-L3-V'; break;
case 02: $menu3_name = "L3-VK"; $menu3_link = 'lis-L3-VK'; break;
case 03: $menu3_name = "L3-P"; $menu3_link = 'lis-L3-P'; break;
case 04: $menu3_name = "L5-V"; $menu3_link = 'lis-L5-V'; break;
case 05: $menu3_name = "L5-2"; $menu3_link = 'lis-L5-2'; break;
default: $menu3_name = ""; break;
}
break;
case 02: $menu2_name = 'Lisy od 20 tun lisovacího tlaku'; $menu2_link = 'lisy-od-20-tun-lisovaciho-tlaku';
switch ("$menu3_id")
{
case 01: $menu3_name = 'L20-1, L30-1, L50-1'; $menu3_link = 'lisy-L20-1-L30-1-L50-1'; break;
case 02: $menu3_name = "L20-2"; $menu3_link = 'lis-L20-2'; break;
case 03: $menu3_name = "L30-2"; $menu3_link = 'lis-L30-2'; break;
case 04: $menu3_name = "L30-2 New Generation"; $menu3_link = 'lis-L30-2-new-generation'; break;
case 05: $menu3_name = "L100 a ostatní speciální lisy"; $menu3_link = 'lis-L5-2-a-ostatni-specialni-lisy'; break;
default: $menu3_name = ""; break;
}
break;
case 03: $menu2_name = 'Kontejnerové lisy'; $menu2_link = 'kontejnerove-lisy';
switch ("$menu3_id")
{
case 01: $menu3_name = 'Stacionární lis s přípojným kontejnerem'; $menu3_link = 'stacionarni-lis-s-pripojnym-kontejnerem'; break;
case 02: $menu3_name = "Lisovací kontejner"; $menu3_link = 'lisovaci-kontejner'; break;
default: $menu3_name = ""; break;
}
break;
case 04: $menu2_name = 'Příslušenství'; $menu2_link = 'prislusenstvi';
switch ("$menu3_id")
{
case 01: $menu3_name = 'Vázací materiál'; $menu3_link = 'vazaci-material'; break;
case 02: $menu3_name = "Propichovačka PET lahví"; $menu3_link = 'propichovacka-PET-lahvi'; break;
case 03: $menu3_name = "Vybírací rudl"; $menu3_link = 'vybiraci-rudl'; break;
case 04: $menu3_name = "Násypka, rampa, dopravník..."; $menu3_link = 'nasypka-rampa-dopravnik-atd'; break;
default: $menu3_name = ""; break;
}
break;
case 05: $menu2_name = "Gravitační shozy odpadu a prádla"; $menu2_link = 'gravitacni-shozy-odpadu-a-pradla'; break;
case 06: $menu2_name = "Prostředky pro primární třídění odpadu a nádoby na odpad"; $menu2_link = 'prostredky-pro-primarni-trideni-odpadu-a-nadoby-na-odpad'; break;
case 07: $menu2_name = "Horizontální balíkovací lisy"; $menu2_link = 'horizontalni-balikovaci-lisy'; break;
//tady ta chyba zacina
case 08: $menu2_name = "Použitá zařízení"; $menu2_link = 'pouzita-zarizeni'; break;
case 09: $menu2_name = "Special Transponders"; $menu2_link = 'special-transponders'; break;
//tady konci
default: $menu2_name = ""; break;
}
break;
case 03: $menu1_name = "Servis, služby, poradenství"; $menu1_link = 'servis-sluzby-poradenstvi';
switch ("$menu2_id")
{
case 01: $menu2_name = 'Servis'; $menu2_link = 'servis'; break;
case 02: $menu2_name = 'Služby'; $menu2_link = 'sluzby';
switch ("$menu3_id")
{
case 01: $menu3_name = 'Přeprava zařízení k zákazníkovi'; $menu3_link = 'preprava-zarizeni-k-zakaznikovi'; break;
default: $menu3_name = ""; break;
}
break;
case 03: $menu2_name = 'Poradenství'; $menu2_link = 'poradenstvi';
switch ("$menu3_id")
{
case 01: $menu3_name = '10 důvodů, proč si koupit lis'; $menu3_link = '10-duvodu-proc-si-koupit-lis'; break;
case 02: $menu3_name = "Neděláte to náhodou špatně? Máme pro Vás řešení"; $menu3_link = 'nedelate-to-nahodou-spatne-mame-pro-vas-reseni'; break;
case 03: $menu3_name = "Máte ve firmě také něco takového?"; $menu3_link = 'mate-ve-firme-take-neco-takoveho'; break;
default: $menu3_name = ""; break;
}
break;
case 04: $menu2_name = 'Poptávkový formulář - objednávka přes internet'; $menu2_link = 'poptavkovy-formular-objednavka-pres-internet'; break;
}
break;
case 04: $menu1_name = "Otázky a odpovědi (FAQs)"; $menu1_link = 'otazky-a-odpovedi-faq'; break;
case 05: $menu1_name = "Reference"; $menu1_link = 'reference'; break;
case 06: $menu1_name = "Links"; $menu1_link = 'links'; break;
case 07: $menu1_name = "Kontakt"; $menu1_link = 'kontakt'; break;
//tu jsem udelal pokus a zase nejde
case 08: $menu1_name = "Pokus"; $menu1_link = 'pokus'; break;
//a tady ta chyba konci
case 10: $menu1_name = "Pokus2"; $menu1_link = 'pokus2'; break;
}
jozob
Profil
Tak to je čistá šialenosť, ani sa mi to nechce čítať. :-)
Malá poznámka / otázočka pre odborníkov: Ako je to s číselnými konštantami v PHP? Je to rovnaké ako v C? Pretože v tom prípade by bol zápis 01, 02, 03 atď... chápaný ako číselná konštanta v osmičkovej sústave.
Školník
Profil
jozob O šílenosti mi povídej, já to musel napsat..:-) O zápisu konstant nevím. Je to takové moje malé kousek řešení drobečkové navigace...
jozob
Profil
"O zápisu konstant nevím."
Aby som to upresnil hovorím o číselných konštantách, nie o symbolických konštantách (symbolické sú tie klasické, ktoré poznáme). Číselné konštanty sú všetky čísla: napríklad zápis 12 je konštanta a má hodnotu 12 v desiatkovej sústave, zápis 012 je konštanta a má hodnotu 12 v osmičkovej sústave, zápis 0x12 je konštanta a má hodnotu 12 v hexadecimálnej sústave. Toto mi je známe z Céčka, na ktoré sa PHP celkom podobá, preto by mohli nastávať problémy ak sa v PHP číselné konštanty interpretujú rovnako ako v Céčku. Ale práve som to skúšal a podobnosť zápisu číselných konštánt s Céčkom vylučujem.

To len tak OT, už to nemusíme riešiť, v tom problém nie je.
Školník
Profil
jozob Doufám, že jsem nikde nepřehlédl nějakou maličkost, to by mě mrzelo. Díky za osvětu co se týče interpretace v céčku, o povědomí víc.. Připadám si, jako bych seděl v létě u ohně a čekal. Jen nevím na co.:-)
Peca
Profil
Zkus dát ty hodnoty 01,02,... (nebo aspoň 08, 09) do apostrofů, třeba to pomůže...
Školník
Profil
Peca Bohužel nepomohlo...
Školník
Profil
Ať dám podmínku 08 nebo 09 do jakýhokoli switche na stránce, tak to nejde.
jozob
Profil
Školník
Skús tam dať nejaký výraz. Napríklad 2*4
Školník
Profil
Dopytle.:-) Díky kluci, fungujou (už) jak apostrofy , tak výraz... Paráda..:-) A ví někdo proč tomu tak bylo? DÍKy
jozob
Profil
Školník
Skús to ešte zmeniť z 08 -> 8, či to pôjde.
jozob
Profil
Takisto to skús hodiť do if podmienky. Možno nájdeš bug. :-)
Školník
Profil
jozob 8 nefunguje, protože v proměnný mam 08, dvojčíslí. Bug..;-)
jozob
Profil
Školník
Premenná je string?
Školník
Profil
Řekl bych že integer.
jozob
Profil
Školník
V akej forme sa to zapisuje do premennej, niečo takéto?: $a=08;?
Školník
Profil
$menu4_id = SubStr($_GET['velkapromenna'],6,2); a $velkapromenna vznika v .htaccess jako index.php?velkapromenna=01010308 -> z toho právě 08.
jozob
Profil
Školník
Skús si tento kód:
$a=08;
echo $a;

Vypíše 0.
Školník
Profil
A $a='08'; echo $a; vypíše 08..:-) $a='07'; echo $a; vypíše 7. Dívám se na LOST, nemůžu z toho bláznit?:-) Je pozdě...
souki
Profil
co to tu řešíte?
když je to v apostrovech, považuje se proměnná za řetězec.... možná by úplně stačilo do podmínky switche dát přetypování na integer a bylo by vystaráno... když je předčíslem 0, automaticky se považuje za šetnáctkové číslo.... když tedy v $id předáš 8 tak to ale není rovno 08 pokud přímo neřekneš jakého je typu... v tomhle případě by ale mělo stačit pracovat s $id jako řetezcem => takže case do uvozovek a případně přetypovat switch podmínku na string....
mila
Profil
Zapřemýšlel bych nad celým řešením.

Asi bych si ty texty uložil do pole. Něco jako

$menu[1][0] = 'Hlavní položka 1';
$menu[2][0] = 'Hlavní položka 2';
$menu[1][1][0] = 'Položka 1.1';
$menu[1][2][0] = 'Položka 1.2';
$menu[1][2][1][0] = 'Položka 1.2.1';
$menu[1][2][2][0] = 'Položka 1.2.2';


Dále bych nedělal odkaz ve tvaru neco=08121368, ale raději neco=08-12-13-68, nebo ještě lépe /08/12/13/68.

Pak bych místo:
$menu4_id = SubStr($_GET['velkapromenna'],6,2); //(asi tam budou 4 takové řádky)
a toho hrozného swich raději prošel $_GET['velkapromenna'] v cyklu:

1. $polozka = $menu;
2. $vyber = další číslo na řadě, pokud je - jinak skonči
4. $polozka = $polozka[$vyber]
3. Vypíše $polozka[0]
5. Zpět na 2
jozob
Profil
souki
"když je předčíslem 0, automaticky se považuje za šetnáctkové číslo"
S tým nemôžem súhlasiť, ak sa pred číslom uvedie 0, číselná konštanta je v osmičkovej sústave, nie v šestnástkovej. Pre zápis číselných konštánt predstavujúcich čísla v šestnástkovej sústave sa pred číslo zapisuje 0x.

"když je to v apostrovech, považuje se proměnná za řetězec..."
PHP automaticky pretypuje číselné konštanty, reťazce a premenné. Tam problém vôbec neviazne.

Toľko k pripomienkám. A konečne som na to prišiel! (ono to je úplne jednoduché, stačí mať len minimálnu matematickú predstavivosť, ktorú som o toľkej hodine v noci nemal)

Takže. Povedali sme si niečo o číselných konštantách. Každé samostatne zapísané číslo v zdrojovom kóde predstavuje číselnú konštantu. Návratová hodnota tejto konštanty nemusí byť vždy v desiatkovej sústave, ako by sme mohli predpokladať. Už som načŕtol podobnosť PHP s "Cé" jazykom. V tomto jazyku používame 3 typy číselných konštánt:

1.) číselné konštanty vyjadrujúce desiatkovú sústavu - tie sú zapísané vo formáte, ktorý je identický s ich čieslnou hodnotou. Príklad: 3, 5, 134 - všetky majú rovnaký zápis ako aj hodnotu v desiatkovej sústave.

2.) číselné konštanty vyjadrujúce osmičkovú sústavu - tie sú zapísané s prefixom 0 (slovom - "nula").
Príklad: 03 - predstavuje číslo 3, 05 - predstavuje číslo 5, 0134 - predstavuje číslo 134... Všetko v osmičkovej sústave (pre vyjadrenie v desiatkovej sústave je samozrejme potrebný prepočet).

3.) číselné konštanty vyjadrujúce šestnástkovú sústavu - tie sú zapísané s prefixom 0x. Príklad: 0x154, 0x54AB41, 0xACF21... No tie nás momentálne nezaujímajú...

Poďme späť k číselným konštantám predstavujúcim čísla v osmičkovej sústave. Tam viazne Školníkov problém. Zapisuje číselné konštanty s prefixom 0, čo znamená, že všetko za nulou sa považuje za číslo vyjadrené v osmičkovej sústave.

A prečo problém pri číslach 08 a 09? Ako vieme, na zápis čísla používame číslice (:-)). V desiatkovej sústave používame číslice 0 - 9, v dvojkovej sústave číslice 0 a 1, v šestnástkovej sústave číslice 0 - 9 a písmena A - F... V osmičkovej sústave používame spolu osem číslic a to 0 - 7. Dáme si malú ukážku postupnosti čísiel v desiatkovej sústave:
prvá je 0, potom 1, 2, 3, 4, 5, 6, 7, 8, 9, a čo teraz, keď došli číslice? No predsa 10, ako každý vieme.

Teraz to isté, ale osmičkovej sústave:
prvá je 0, potom 1, 2, 3, 4, 5, 6, 7, a čo teraz? No predsa 10. A ďalej 11, 12, 13, 14, 15, 16, 17, a čo teraz? No predsa 20. Atď...

Teraz sa vráťme k problému. Problém bol s číselnými konštantami 08 a 09. V osmičkovej sústave takéto čísla jednoducho neexistujú a tieto číselné konštanty v PHP vracajú 0. Takže tam nastal problém. Je to to isté, ako keby ste zapísal 1AF1 - používate desiatkovú sústavu, ale A a F sa v desiatkovej sústave nevyskytujú, našli by sme ich napríklad v šestnástkovej sústave.

Toľko na okraj :-)

Prepáčte mi za článok, ale nedalo mi to :-). Možno si niektorí poviete, že je to samozrejmé a jozob to zbytočne takto opisuje. Ale nie každý tomu pochopí, takže radšej som to rozpísal, aby sa poučili aj začiatočníci. A ak nájdete nejaké nepresnosti, opravte ma.

Ďakujem za pozornosť. ;-)
souki
Profil
ommouvám se.... spletl jsem se... je to osmičková..... ten dlouhý text sem nečetl ale konečně to dává smysl.... protože co se stane když se v osmičkové na píše 8 nebo 9 a může s epoužívat jen 01234567? stane se z toho 10 (nebo tak nějak)
jozob
Profil
souki
"stane se z toho 10 (nebo tak nějak)"
Nič sa nestane :-). Osobne si myslím, že by mohol parser fungovať tak, aby vyhodil chybu. No nie je to tak a číslo jednoducho nadobudne hodnotu 0.
souki
Profil
Nič sa nestane
určitě? snad se proměnná přetypuje podle toho co se s ní počítá a ta nula tam fungule jako "Int2osmičková" (ted nevim jak to je přesně=) )
asi tu plácám úplný nesmysli.. je to docela možný =) Vycházim jen ze zkušeností =)
Tak se kdyžtak omlouvám =(
jozob
Profil
souki
No ono by sa nemalo nič stať, pretože také číslice v osmičkovej sústave neexistujú, takže je to blbosť. Malo by to vyhodiť chybu (podľa mňa). Ale pokiaľ hovoríme o PHP, tak áno - stane sa niečo - číselná konštanta vráti hodnotu 0.
souki
Profil
aha.... tak děkuju za objasnění.....
u data jde taky zadat 40.2. a projde to a ještě se to převede... string jde taky vydělit dvěma.... tak jsem předpokládal že je liberálnější
« 1 2 »
Toto téma je uzamčeno. Odpověď nelze zaslat.

0