
PHP: Chyba s odkazem typu index.php?id=1..
Ahoj mám takový problém,mám plně funkční stránku v php, kde jsou stránky uloženy jako stranka1.php,stranka2.php a dal. Protoze maji podobny nazev a potrebuju odkazy dynamicky, tak sem se rozhodl, ze budu ty stranky includovat a odkaz bude index.php?id=1.. Jenze problem je ze odkazy nefunguji a zustava to porad na index.php. Php kod na includovani myslim ze mam spravne
test.php
$id = $_GET["id"];
if ($id == "1") {
include "forum/index.php";
}elseif ($id == "2") {
include "stranka1.php";
}elseif ($id == "3") {
include "stranka2.php";
}elseif ($id == "4") {
include "stranka3.php";
}elseif ($id == "5") {
include "stranka4.php";
}elseif ($id == "6") {
include "stranka5.php";
}else {include "index.php";}
TOTO je stranka na ktere maji ty odkazy fungovat
<body leftmargin="0" topmargin="0" marginheight="0" marginwidth="0">
[b]<?php include ("test.php") ?>[/b]
<div id="telo" class="wrapper">
<div class="container"></div>
<div class="bunka-42"></div>
<div class="bunka-43"></div>
<div class="domu"><a href="index.php" target="_self">Domů</a></div>
<div class="bunka-53"></div>
<div class="bunka-54"></div>
<div class="forum"><a href="forum/index.php?id=1" target="_self">Fórum</a></div>
<div class="bunka-56"></div>
<div class="galerie"><a href="index.php?id=2" target="_blank">Galerie</a></div>
<div class="bunka-58"></div>
<div class="bunka-63"></div>
<div class="bunka-64"><a href="index.php?id=3" target="_self">Odkaz3</a></div>
<div class="bunka-65"></div>
<div class="bunka-66"><a href="index.php?id=6" target="_self">Odkaz6</a></div>
<div class="bunka-67"></div>
<div class="bunka-68"></div>
<div class="preview"><script language="javascript" type="text/javascript" src="js/thumbnails.js"></script></div>
<div class="bunka-70"></div>
<div class="bunka-149"></div>
</div>
</body>
</div>
odmazal sem nejake bunky protoze se to sem nevlezlo ale ty na to nemaji myslim vliv
- takto udělané include stránek je naprosto nevhodné
- slyšel jsi o příkazu SWITCH?
- vypiš si echem, zda má proměnná $id přiřazenou správnou hodnotu?
A teď koukám, že bys ty čísla neměl mít asi v uvozovkách, protože to není řetězec. Zkus takto:
Ono vůbec se to dá strašně zjednodušit a zpřehlednit:
A switch už prý hodně programátorů zavrhuje, switch je prý nepřehledný.
V uvozovkách chyba není, PHP je na takovéto prasárny jako stavěné
.
Ak niekto zavrhuje switch, tak potom nie je programátor.
Ach jo, v OOP je switch považován za code smell a v 95% procentech případů se dá nahradit polymorfismem...
Možná by sis mohl zadat do google switch code smell, pokochat se vysledky a třeba se i nečemu přiučit...
EDIT: Tady je hezké video... blog dokonce ukazuje i proč je dobré mit napsané na svůj kód unit testy.
Skús nahradiť switch..case, o ktorom sa bavíme teraz, polymorfizmom. Buď sme sa trafili do tých 5 % (nie), alebo si si tých 95 % vycucal z prsta (áno).
Hezké video ukazuje prípad, ktorý si zaslúžil refaktoring, ale príčinou nebol switch..case ako taký, ale to, že logika pre rôzne prípady bola definovaná v jednej monolitickej metóde. Code smell je len symptóm problému, to ale neznamená, že tam nejaký problém je. Javisti majú ale s enumom nejaký mentálny problém, keďže im aj celkom dlho trvalo (8 rokov?), kým prišli na to, že by mali enum vôbec do toho jazyka zapracovať.
Napr. chlapík vo videu na záver upravil factory metódu zo switch..case na HashMap so slovami, že to je more object-oriented way. Pritom do slovníka ukladal inštancie nových objektov, ktoré vytváral zbytočne a v prípade, že by niektorý z nich bol časovo náročnejší na vytvorenie, tak by sa mu to odrazilo na výkone. Pritom switch..case týmto neduhom netrpel, takže toto konkrétne by som skôr nazval more stupid way. Môžeš síce povedať, že to nie je podstatné (dalo by sa pridať lazy loading a neviem čo ešte), ale takisto aj ja môžem povedať, že celý ten refaktoring bol len stratou času (príliš malý problém, pre ktorý sa našlo "elegantné" a komplexné riešenie, Java way).
Ja se právě vůbec nebavím o tomto problému, jen jsem reagoval na to
protože spíš opak je pravdou...
Myslím, že mentální problém s enumem mají spíš ccékřížkaři, protože si ty enumy sice zavedli hned, ale dost divné. Protože nemůžou mít metody, takže jsou to asi nějaké polovíční objekty nebo co...
Mně řešení komplexní nepřišlo. Zlepšila se čitelnost kódu a jeho udržovatelnost. A navíc, takových příkladu ti vygooglím milion i pro cékřížek...
Tvoje tvrdenie, že opak je pravdou, nie je ničím podložené a spadá do kategórie tvrdení "v 95% procentech případů se dá (switch..case) nahradit polymorfismem". To, že si strávil príliš veľa času s Javou, sa výrazne podpísalo na tvojom spôsobe uvažovania. Vygoogli si radšej aký je rozdiel v enumoch v Jave a ostatných programovacích jazykoch a skús sa na to pozrieť s nadhľadom, pretože v tomto je výnimkou práve Java - v Jave sú to také "polovičné objekty".
Nehovorím, že sa nezlepšila čitateľnosť kódu, ale to riešenie JE komplexnejšie. Udržiavateľnosť sa v tomto konkrétnom prípade príliš nezmenila, zlepšila sa skôr modulárnosť a tým pádom aj rozširovateľnosť. A zavedením HashMapy namiesto switch..case sa k lepšiemu nezmenilo teda vôbec nič.
Príklady mi googliť naozaj nemusíš, takéto základy sa učia v škole. Pokiaľ si si nevšimol, tak dosť jasne rozlišujem medzi prípadom switch..case vs. if..else a prípadom switch..case/if..else vs. polymorfizmus. Tvrdíš, že switch..case je horší ako if..else a že sa dá takmer vždy nahradiť polymorfizmom - ale to je totálny nonsens.
Dám příklad (nekamenujte mě jsem samouk):
Jak vyhodíte switch ?
Takovou hovadinu, jsem nikdy nenapsal. Switch je urcitě lepší jako horda ifů. Tvrdil jsem jenom, že v OOP je lepší použít polymorfizmus místo switche (pokud to jde), kvůli čitelnosti kódu. Nic víc...
Takto to dáva zmysel a o tomto sa nikto neháda. Ale keď v kontexte if..else vs switch..case odpovieš na "Ak niekto zavrhuje switch, tak potom nie je programátor.", že spíš opak je pravdou, tak z toho priamo vyplýva, že by si namiesto switch..case použil polymorfizmus alebo if..else alebo niečo iné. A to už zmysel nedávalo.
Návrh :
Pole bych nadefinoval někde v dalším php a svázal s odkazy v divech .
Udržba a aktualizace se zjednoduší.
Ještě lépe:
To je samozřejmě taky dobře. Ale co kdyby byly odkazy - $stranky definovány jen pro $id=7,15,36 .
.
Otázka vkusu i situace
Tak to vypada ze mam asi neco s nastavenim php, protoze at to zapisu jak chcu tak mi echo napise Notice: Undefined variable: id
To testuješ na localhostu? Kam jsi ten příkaz echo přesně umístil?
echo sem strcil do div na te strance a testuju to na localhostu ale se zaplym wamp2 kde ostatni php skripty jdou, jestli tohle muze byt problem tak to zkusim dat na server
To echo $id dej před switch ($id), resp. za $_GET["id"], podle toho, jak to máš udělané.
Taky můžeš zkusit do proměnné id přiřadit nějakou hodnotu natvrdo, jestli to bude vypisovat a fungovat.
Dekuji za trpelivot ale asi muj pocitac je blbej nebo ja, protoze, kdyz tak zadam pevnou hodnotu treba 2 ta to echo spravne zobrazi ale jinak ne
Zkus dát :
Přečetl jsem tohleto :
http://www.issociate.de/board/post/444500/Undefine d_variable_passing_vars_via_URL_locally.html
V čem mu to pomůže (odkaz jsem nečetl)? Však promenná ID je definovaná na začátku.
Popravdě řečeno jsem z toho taky janek. Ale stačí mrknout na odkaz - symptomy jsou stejné (nebo zdají se) a řešení, jaké jsem psal , tož jsem to v zoufalství zkusil, neboť pokus stojí tazatele nejvýš minutu. Pokud víc, omlouvám se.
Ostatně problém v tomto dotazu je k uzoufání , od začátku do konce se zdá, že řešení už musí přijít. A nic.
Jak uz jsem rikal zkousel jsem to i tvym zposobem require($stranky[$_GET["id"]]); ale pise to stejnou chybu. Dokonce jsem ten script primove vlozil do stranek jestli se neco zmeni a nic. Tak sem pouzil require misto include co mi to napise za chybu a pise to stale stejne co na normalnim serveru Undefined index: id, require() [function.require]: Filename cannot be empty in .../index.php on line 348, ktera je require($stranky[$_GET["id"]]);
require() [function.require]: Failed opening required '' (include_path= tady cesta on line 348
Ja rozumim co ta chyba znamena ale nechapu proc pise ze id neni definovany, kdyz je.
Ako vyzerá URL, kde ti to píše? Lebo ak v nej nie je parameter ?id=hodnota, tak index "id" v poli $_GET bude skutočne nedefinovaný.
URL vypada index.php, tak se ale omlouvam pokud je to timto, ale nevim jak to udelat aby to melo parametr, kdyz jsem jeste na nic neklikl. Dival sem se i na ostatni stranky a i ty kdyz se nacte index, tak nema zadny parametr.
Či je index poľa nastavený alebo nie, zistíš pomocou funkcie isset.
Takze skript vypada ze funguje. Ale index.php se mi porad refreshuje a ostatni stranky maji z nejakeho duvodu otevreny lightbox,ktery se nikdy nenacte. Myslel jsem si ze je to konfliktni nejak se skriptem ktery je pouze na index.php. Ten zjisti rozliseni monitoru, refreshne stranku a pomoci get ulozi hodnoty do php promenne, ale i dyz vymazu referenci tak se stranka index.php porad refreshuje
56672186.png
Za otvorený lightbox a refreshovanie bude zodpovedný nejaký JavaScript. Prinajhoršom ho môžeš v prehliadači odkrokovať a zistiť, kvôli čomu sa to tak chová. Na odladenie môžeš použiť napr. Firebug.
Len z obrázka sa bez kódu alebo živej ukážky ťažko bude dať povedať viac.
Takze sem zabalil do archivu index.php a skript,ktery ma includovat ty ostatni stranky
stranky.rar
Doufam ze to pomuze najit problem
Tam nie je žiadne refreshovanie, ale dokola sa includuje tá istá stránka. Ak niekto ide na stránku test.php, tak sa mu includuje stránka index.php, ktorá na konci includuje stránku test.php, ktorá includuje index.php a tak stále dokola.
Takže by malo stačiť vymazať include ("test.php") na konci súboru index.php.
Ten test.php by som napísal tak, že by tam bolo jedno pomocné pole so stránkami, podľa ktorého by si sa rozhodoval. Indexy toho poľa by si potom mohol upraviť na niečo rozumnejšie, takže by odkazy boli čitateľnejšie (napr. test.php?id=galerie). Mohlo by to vyzerať napr. takto:
To množstvo divov vyzerá v kóde strašne, ale tak snáď vieš, čo robíš.
Tak i toto mi vypisuje Undefined variable: id
Zkusil jsem udelat jednoduchou stranku jetli to pujde tam
a tady to nevypise zadnou chybu ale taky to porad zustava na test.php
mi na obrazovku vypise v prohlizeci
"forum/index.php", "galerie" => "galerie.php", "4" => "page3.php", "5" => "page4.php" ); if (isset($pages[$_GET["id"]])) $page = $pages[$_GET["id"]]; else $page = "test.php"; include $page; ?> TOTO je : forum galerie page1 page2
Používaš shorttagy - máš ich zapnuté?
Omlouvam se mel sem omylem napsane <? misto <?php ale po zmene se objevila zase hlaska Notice: Undefined index: id in D:\wamp\www\cssseite\test.php on line 12
a line 12 je:
Tak to uprav ešte na: