[PHP] URL info beschikbaar maken voor rest van applicatie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Mijn CMS'je werkt met mod_rewrite. Als er een pagina wordt aangeroepen, lees ik eerst de URL uit, en verwerk deze:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
function q($part=NULL, $index=NULL)
{
  if (isset($_GET['q']))
  {
    $q = explode('$', $_GET['q']);
    if (isset($q[1])) $arg = $q[1];
    $qs = explode('/', $q[0]);

    $ids = Array();
    $pad = Array();

    if (is_numeric($qs[0]))
    {
      for ($i = 1; $i < count($qs); $i++) $ids[] = $qs[$i]; 
      $pad[] = $url[0];
    }
    else
    {
      for ($i = 0; $i < count($qs); $i++)
      {
        if (is_numeric($qs[$i])) $ids[] = $qs[$i]; 
        else $pad[] = $qs[$i];
      }
    }

    if (isset($part))
    {
      switch ($part)
      {
        case 'pad':
          if (isset($index)) return $pad[$index];
          else return rtrim(implode('/', $pad), '/');
        break;
      
        case 'id':
          if (isset($index)) return $ids[$index];
          else return implode('/', $ids);
        break;
      
        case 'arg':
          return $arg;
        break;      
      }
    }
    else
    {
      if (isset($_GET['q'])) return $_GET['q'];
      else return false;
    }
  }
  else
  {
    return false;
  }
}

Neem nu als voorbeeld:
code:
1
2
3
4
5
6
7
$_GET['q'] = http://www.site.com/bedrijf/management/2004/06$print

en dan enkele voorbeelden van functie calls:

- q('pad') levert op: bedrijf/management
- q('pad', 1) levert op: management
- q('id', 0) levert op: 2004

Ik heb deze functie geschreven met het idee dat als er iets verandert in de url opbouw, ik alleen deze functie hoef aan te passen. Er zitten echter wat nadelen aan deze fucntie:
• elke keer als ik ergens in mijn applicatie een call maak, wordt de hele url opnieuw ontleed. Dat kost tijd
• ik heb niet alle functionaliteit die ik zou willen, zoals de grootte van 'pad' bepalen (sizeof van de pad array). Nu zou ik de functie kunnen uitbreiden maar dan heb ik het idee dat het zo'n gedrocht wordt.

Ik heb uiteindelijk voor een functievorm gekozen omdat ik niet een hele zooi variabelen aan wil maken, zoals
PHP:
1
2
3
4
5
$pad[0] = 'bedrijf';
$pad[1] = 'management';

$id[0] = 2004;
..etc..

Want dan moet ik in elk toekomstig stukje code een heleboel globals aanhalen in die nog te schrijven functies. Echter, zojuist heb ik gekeken hoe bijvoorbeeld Geeklog een en ander doet. Zij stoppen bijvoorbeeld alle variabelen (van database naam tot IP banlist tot templates) in een $_CONF array. Nu was dus mijn idee om deze functie (ik heb nog geen idee hoe) een dergelijke array te laten uitspugen:
PHP:
1
2
3
4
5
6
$_CONF['url']['pad'] = 'bedrijf/management';
$_CONF['url']['pad'][0] = 'bedrijf';
$_CONF['url']['pad'][1] = 'management';
$_CONF['url']['id'] = '2004/06';
$_CONF['url']['id'][0] = 2004;
...etc..

Het voordeel is:
• dat ik op elke request maar 1 keer de url hoef te ontleden en de array vul. Verdere code maakt dan gebruik van de $_CONF global ipv dat zij een functie call maken;
• ik heb nu wel de beschikking over sizeof(...) en in_array(...) mogelijkheden

Deze code is de basis van mijn systeem, en moet daarom zo handig mogelijk ontworpen worden. Ik twijfel nogal, vooral omdat mijn ervaring met grootschalige projecten beperkt is. Niet dat dit CMS nou zo enterprise-class is ofzo, maar het is wel het project waar ik nog jaren vol plezier aan bezig wil zijn. Ik wil niet elke 3 maanden de basis opnieuw hoeven te maken. Aan jullie dus de vraag: welke oplossing zouden jullie kiezen en waarom?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

Bijvoorbeeld dat je bij de eerste pageview van een bepaalde soort de array wordt aangemaakt, en bij volgende pageviews 'ie de informatie uit die array haalt? Dan schrijf je gewoon met fopen en fwrite die array naar een bestand..

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Nou, het gaat niet zozeer om de vraag waar ik die array laat (in het geheugen van de server, in een bestand of database) maar om de vraag wat een betere keurze is:
• 1 keer url filteren en een globale array aanmaken
• een functie aanroepen als ik info over de array wil

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Je kan toch gewoon 1x (voor performance áltijd het beste) die hele URL exploden, en dan bijv. die array in $_SERVER knikkeren? Die zijn altijd overal beschikbaar, desnoods kan je dat zelfs in je session var gooien :)

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Wordt dat vaker gedaan? Informatie in $_SERVER stoppen? Gaat dan de logica niet uit je systeem? Let op: ik heb een heleboel info in $_SERVER te stoppen dus:
PHP:
1
2
3
4
5
6
$_SERVER['url']['pad'] = 'bedrijf/management';
$_SERVER['url']['pad'][0] = 'bedrijf';
$_SERVER['url']['pad'][1] = 'management';
$_SERVER['url']['id'] = '2004/06';
$_SERVER['url']['id'][0] = 2004;
...etc..

Overigens - eigenlijk gaat dit weer over WAAR ik de informatie over de url stop. Maar mijn eigenlijke vraag was of ik beter van die functie uit kon gaan of van een script wat alle info in een global array stopt. Iemand :?

[ Voor 38% gewijzigd door Reveller op 31-10-2004 16:44 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Reveller schreef op 31 oktober 2004 @ 15:38:
Wordt dat vaker gedaan? Informatie in $_SERVER stoppen? Gaat dan de logica niet uit je systeem?
in $_SERVER staan o.a. path info enzo, dus ik zou niet inzien waarom je dit dan niet enigzins zou mogen tweaken c/q verder gebruik ervan maken.

Over je 2e (eigenlijke) vraag: Wat denk je zelf wat efficienter is? 1x je arraytje opzetten, of dit 20x achter elkaar doen?

Voordeel van een functie is wel: als de informatie om de een of andere manier nog niet ingedeeld mocht zijn, zou je dit makkelijker kunnen opvangen door een check.

Het hangt er een beetje vanaf wat je programmeerstijl is dus imho

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Wanneer bepaal je dan eigenlijk wanneer je een variabele in de globale arena aanmaakt en wanneer je een waarde laat outputten door een functie? Zulke dingen zijn mij wat onduidelijk en ik kan er geen richtlijnen voor vinden. Een ander voorbeeld is dat veel mensen een config.php bestand maken met daarin:
PHP:
1
2
3
4
5
6
7
$_DB_USER = 'root';
$_DB_PASS = 'password';

// Terwijl het toch veel logischer is om die constant te maken:

define('DB_USER', 'root');
//etc...

Maar dat is wat off-topic. Zijn er nog mensen die hun visie op de startpost zouden willen geven?

[ Voor 5% gewijzigd door Reveller op 31-10-2004 17:50 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Nu ik er over nadenk - hoeveel globale variabelen gebruiken jullie trouwens ueberhaupt? Ik zit er nu aan te denken om een aantal globale variabelen aan te maken, die een array zijn. Bijvoorbeeld:

• $_URL ($_URL['PAD'], $_URL['IDS'], etc.)
• $_CONF ($_CONF['DB_USER'], $_CONF['IP_BAN_LIST'], etc.)
• $_PAGE ($_PAGE['TITLE'], $_PAGE['FOOTER_TEXT'], etc.)

Op deze manier kun je al je variabelen kwijt in 2 of 3 array's. Je kunt zelfs denken aan array's in array's (zoals de IP_BAN_LIST een array zal zijn). Wat is jullie werkwijze wanneer je omvangrijke applicaties bouwt?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

Verwijderd

waarom doe je niet gewoon zoals ik :P lekker makkelijk en alleen gericht op het werken met mod_rewrite

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function _pGET($req)
{
    if(!empty($_SERVER['PATH_INFO']))
    {
        $_a = substr($_SERVER['PATH_INFO'], 1);
        $_a = explode('/', $_a);
        $x = 0;

        for ($x = 0; $x < count($_a); $x++)
        {
            if ($x == $req)
            {
                return $_a[$x];
            }
        }

        return false;
    }

    return false;
}


hiermee kan je controlleren of een variabel gezet is bv.

index/list_topics/1

_pGET(0) = "list_topics";
_pGET(1) = "1";

en dan gewoon lekker werken met je if statementjes.

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Waarom dat for-loopje?
PHP:
1
2
3
4
5
if (isSet ($_a[$req]))
{
   return $_a[$req];
}
return false;

Werkt een stukje efficienter. Kijk trouwens eens naar code in de start post, daar gebeurt iets meer als jij hier doet ;)

Over die globals, waarom niet in de $GLOBALS array zetten? $GLOBALS['_Config'] ed, moeten mijns inziens kunnen :)

Acties:
  • 0 Henk 'm!

Verwijderd

het mag dan misschien wel anders werken maar de persoon wil eingelijk per stuk de data terug... mja ieder z'n eigen manier natuurlijk.

idd het kan ook zonder for-loopje :D
Pagina: 1