| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

12-04-2009, 23:11
|
|
Seggl-hoch-drei
Registrierter Benutzer
|
|
Registriert seit: Sep 2007
Beiträge: 310
|
|
Abbildung von URLs in der Datenbank
Hallo,
ich möchte Zur Zeit ein Menü erstellen, das im Adminbereich verwaltet werden kann. Dazu würde ich gerne auf eine MySQL-Datenbank zurückgreifen.
Zur Info: Ich verwende mein eigenes MVC-Framework. Es gibt Controller und Actions. Man kann umstellen, ob die Links mod_rewrite-mäßig ausgegeben werden, oder einfach normal mit ? und &.
Und genau hier beginnt das Problem.
Es soll nämlich die Möglichkeit geben, externe Links ins Menü einzutragen. Wenn es das nicht gäbe, würde ich einfach 2 Spalten in meiner Datenbank anlegen: Controller, Action.
Dann könnte meine Anwendung je nach mod_rewrite on/off entscheiden, wie die Links ausgegeben werden.
Aber wie lege ich dann die externen Links ab? DIe haben ja zum Teil ganz andere Formate.
Und was mache ich, wenn es mal interne Links gibt, die nicht nur so (Controller/Action.html bzw. ?controller=controller&action=action) aufgebaut sind, sondern noch weitere Parameter hinten dran haben?
Forum/Show.html?id=20
Achja, das ist kein Crossposting. (bei phpforum.de gibt es einen ähnlichen Thread, der geht aber mehr um die Logik der Vererbung im Menü)
Hier möchte ich gute Möglichkeiten finden, die URLs in einer Datenbank zu verwalten.
MfG
Seggl
|

12-04-2009, 23:25
|
ghostgambler
Master 
|
|
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
|
|
Varchar fertig.
|

12-04-2009, 23:26
|
|
Seggl-hoch-drei
Registrierter Benutzer
|
|
Registriert seit: Sep 2007
Beiträge: 310
|
|
Klar, das wäre die einfachste Lösung.
Aber was ist, wenn ich jetzt alle Links so eintrage, dass sie mod_rewrite vorraussetzen?
Später will ich aber mod_rewrite deaktivieren, aus welchem grund auch immer.
Dann müsste ich alle Links umschreiben.
gibt es keine bessere Möglichkeit?
|

13-04-2009, 00:39
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
table menu_item
id
controller
action
table menu_item_params
menu_item_id
key
value
Der Link ?controller=foo&action=bar&id=1 wird durch die folgenden Datensätze repräsentiert:
menu_item( 1, 'foo', 'bar )
menu_item_params( 1, 'id', '1' )
Für externe URLs hast du eine weitere Tabelle, die über ein Feld url verfügt. Fertig. Das ist die von dir mündlich erstellte Struktur einmal festgehalten.
|

13-04-2009, 12:43
|
|
Seggl-hoch-drei
Registrierter Benutzer
|
|
Registriert seit: Sep 2007
Beiträge: 310
|
|
Ok, danke
Klingt nach komplizierten Abfragen.
Würdet ihr das wirklich so lösen?
Kann doch nicht sein, dass ich der erste bin, der das Problem hat
Seggl-hoch-drei
|

13-04-2009, 15:58
|
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
ich denke, das problem ist eher nicht in der db zu suchen, sondern in dem modul, welches die links wieder entgegen nimmt.
Forum/Show.html?id=20
ist eh ein halbherziges rewrite
ein link in der form
Forum/Show.html/id=20,foo=2,foo2=x
wenn der link auch genau so in der db steht, kann er ja unbearbeitet durchs rewrite laufen
wenn deine struktur es vorsieht das der erste parameter immer der controller und der 2. die action ist, lässt sich das doch recht einfach auflösen
explode / auf den ganzen string, explode , auf die ergebnisse des ersten
und ein explode = auf den 2.
ich benutze diese art von rewrite in mehreren projekten und fahre damit ganz gut
so in etwa lässt sich das umwandeln
PHP-Code:
$uri="Forum/Show.html/id=20,foo=2,foo2=x";
$uri_arr=explode("/",$uri);
while (list ($uri_key, $uri_val) = each ($uri_arr))
{
if($uri_val<>"")
{
$uri_arr_new[$uri_key]=explode(".",$uri_arr[$uri_key]);
$uri_arr[$uri_key]=$uri_arr_new[$uri_key][0];
}
$temp_arr=explode(",",$uri_arr[$uri_key]);
while (list ($key, $val) = each ($temp_arr))
{
if (stristr($val,"="))
{
$temp_arr2=explode("=",$val);
$params[$temp_arr2[0]]=$temp_arr2[1];
}
}
}
$params['controller']=$uri_arr[0];
$params['action']=$uri_arr[1];
$get_uri="?";
while (list ($key, $val) = each ($params))
{
$get_uri.="&".$key."=".$val;
}
EDIT: Ich hab das ganze nochmal verändert:
$params['controller']=$uri_arr[0];
$params['action']=$uri_arr[1];
müssen ans ende, damit auch uris ohne weitere angaben gelten
Geändert von Peacie (13-04-2009 um 16:36 Uhr)
|

13-04-2009, 16:11
|
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
eventuell noch zur erklärung des codes.
ich definiere die actions bzw controller in meinen projekten nicht fest.
ich habe schematas in arrayform vorliegen, die die stellen definieren.
PHP-Code:
$uri_schema[0]=["Controller"];
$uri_schema[1]=["Action"];
in deinem beispiel
|

13-04-2009, 22:51
|
|
Seggl-hoch-drei
Registrierter Benutzer
|
|
Registriert seit: Sep 2007
Beiträge: 310
|
|
Danke!
Soll ich also die Links in der Form
Controller/Action.html?weitere=parameter&und=so
ablegen und dann bei Bedarf umwandeln?
Wäre halt rechenintensiv, aber eine andere Lösung fällt mir auch nicht ein.
Simon
|

13-04-2009, 23:00
|
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
Controller/Action.html?weitere=parameter&und=so
das wäre ja eine halb rewrite und halb get methode
ich habe auch nur einen ansatz aus meiner engine genommen und schnell mal zusammengecodet.
eigentlich gehts nur um das prinzip:
Controller/Action/weitere=parameter,und=so
könnte man halt nach meiner methode recht fix wieder umbauen in einen get parameter link.
rechenintensiv ist das ganze bei ein paar links sicher nicht. und wenn du mal 1000 links in mod rewrite hast und dich entschliessen solltest auf get umzuändern, kannst du mit der gleichen methode ja alle links in der datenbank damit aktualisieren.
jede methode kann man ja umdrehen
das einzige was mich halt stört ist, das du in deinen beispielen beides kombinierst.
entweder rewrite oder alles per get.
ist halt meine meinung
ich benutze in meinen projekten die das system benutzen nirgendwo auch nur einen get parameter
/nachtrag
die form, die du in der datenbank abspeicherst sollte die am meissten verwendete sein um die rechenzeit so kurz wie möglich zu halten.
Geändert von Peacie (13-04-2009 um 23:04 Uhr)
|

14-04-2009, 05:12
|
|
eRoZion
Registrierter Benutzer
|
|
Registriert seit: Jan 2003
Ort: Magdeburg(S-A)
Beiträge: 150
|
|
Ich würde die URIs so anlegen:
Code:
/controller/action/param1/foo/param2/bar/
Dann kann man alles ganz einfach mit explode zerlegen und weiterverarbeiten. Oder man wendet Reguläre Ausdrücke auf die Zeichekette an. Oder oder ...
Warum verwendet man nicht einfach das Zend Framework?
__________________
Internet-Explorer User und stolz drauf! :P
|

14-04-2009, 08:56
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Wie die Links jetzt im Rewrite aussehen ist doch Wumpe. Tatsache ist einfach, das Seggl jetzt die Möglichkeit hat, die Links in die Komponenten zu zerlegen und in die Datenbank zu packen, oder die Links als reine URL abzulegen. Ersteres ist ganz normal normalisiert, zweiteres ist sicherlich schneller. Ist halt die Frage, was Seggl damit so vor hat. Sollen nämlich einzelne Linkkomponenten ausgetauscht werden, ohne Rücksicht auf die Rewrite-Methode, ist die normalisierte Form vorzuziehen. Werden die Links einmal eingepflegt und danach nicht wieder angefasst, ist die zweite Methode sicher sinniger.
|

14-04-2009, 08:59
|
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
wie ich bereits sagte, wie man die links speichert ist völlig latte.
die auflösung ist wichtig.
meine form benutze ich halt um eine trennug zwischen controllern und parametern zu haben.
Zitat:
|
Warum verwendet man nicht einfach das Zend Framework?
|
weil man nicht muss
|

14-04-2009, 23:58
|
|
Seggl-hoch-drei
Registrierter Benutzer
|
|
Registriert seit: Sep 2007
Beiträge: 310
|
|
Weil Zend zu überladen ist.
Und ich hasse es, wenn man mich ständig davon abbringen will, mein eigenes FW zu programmiere. So lernt man nunmal am allermeisten über MVC und alles, was dazu gehört.
-----
Ich hätte noch ne Idee (danke an Creator)
Wie wäre es, wenn ich die Tabelle so aufbaue?
link_id | controller | action | params
Bei Params lade ich einfach ein serialisiertes Array rein.
Da meine Link-Generator sowieso so arbeitet:
PHP-Code:
FW_Tools::getInternalURL("controller", "action", array("more" => "params", "und" => "so weiter"))
Da könnte ich ja das
PHP-Code:
array("more" => "params", "und" => "so weiter"))
Serialisieren.
Was haltet ihr davon?
|

15-04-2009, 00:01
|
|
PHP-Desaster
PHP Expert
|
|
Registriert seit: Mar 2006
Beiträge: 3.104
|
|
Nichts, das ist nämlich voll Banane! Das spricht gegen jede vernünftige Normalisierung. Dann lieber direkt den Link als Zeichenkette.
|

15-04-2009, 00:04
|
|
Peacie
Registrierter Benutzer
|
|
Registriert seit: Nov 2003
Beiträge: 341
|
|
/agree PHP-Desaster
sobald du mal auf die idee kommen solltest einen zweiten controller oder eine subaction zu nutzen, hampelst du die irgendwie in die parameter.
klare trennung zwischen steuerung und parametern, aber nicht soviel zerhäckseln
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|