config.inc.php uit de juiste map laden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Roland Braat

Roland Braat

02/11/2014 22:08:04
Quote Anchor link
Goedenavond,

ik heb een bestand dat heet db.inc.php Deze laad eenmalig een config.inc.php in.
Dat gebeurt op deze simpele manier: include_once '../../../../config.inc.php';

Nu is het zo dat die config.inc.php afhankelijk is van welke gebruiker inlogt. De gebruikers hebben allemaal een eigen "instance map" Dus je raad het al hoe kan ik die config.inc.php uit de juiste map inladen?

Ik dacht het op de volgende manier te doen:

include_once '../../../../../../instances/'.$_SESSION['db'].'/config.inc.php';
Dit is zonder resultaat, dus had ik er dit nog boven gezet:
global $sid;
session_start();

$sid = md5(session_id());

Ook zonder resultaat, alleen nu blijft de pagina laden.
Als ik in dezelfde map van de db.inc.php een test file plaats en ik vul dat met onderstaande code dan toont hij wel de juiste instance map.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
    global $sid;
    session_start();

    $sid = md5(session_id());

echo $_SESSION['db'];    
?>


Wat doe ik fout?
Is het eigenlijk wel mogelijk om op deze manier een config.inc.php in te laden?
 
PHP hulp

PHP hulp

04/05/2024 13:45:49
 
Ivo P

Ivo P

02/11/2014 22:20:43
Quote Anchor link
Relatieve paden, zeker als je zoals jij iets van 6 stappen omhoog doet, is een zekerheid om de weg kwijt te raken.

Zelf gaat al mijn verkeer via dezelfde index.php die in de document root staat.

Het enige dat die index.php weet, is dat hetconfig bestand staat in ../config/config.php

In config.php (of eigenlijk 1 van zijn kindjes die samen met hem in die map staan) worden alle paden bepaald. Absoluut.

config.php weet namelijk via __DIR__ waar hij zelf staat.

Vanuit daar worden er dan constanten gemaakt als DIR_CONTROLLERS die verwijst naar DIR_ROOT/mvc/controllers/ (en DIR_ROOT is dan de map waarin ook config/ en docroot/ staan.

Misschien heb jij nog specifiek per gebruiker een config nodig.
ofwel wordt dat dan DIR_INSTANCES/session-specifiek/config.inc.php

ofwel zou ik zelf zoeken naar een plek in de config dir.
Ik heb het niet zo op per gebruiker een aparte mappenstructuur aan te leggen. Voor je het weet zit je met 500 kopieen van een structuur. Waarna je ineens bedenkt dat er in elk boompje een extra fileje bij had gemoeten.....
 
Frank Nietbelangrijk

Frank Nietbelangrijk

02/11/2014 23:31:20
Quote Anchor link
Inderdaad gaan relatieve verwijzingen op een gegeven ogenblik voor problemen zorgen. Als je werkt met een frontcontroller dan kan het nog wel enigszins goed gaan omdat het script dan altijd door hetzelfde php bestand gestart wordt maar anders is het evil.

Uit het hele verhaal dat ivo verteld is denk ik het belangrijkste om kennis te gaan maken met __DIR__
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo __DIR__;
?>
 
Roland Braat

Roland Braat

03/11/2014 08:22:32
Quote Anchor link
Oke bedankt voor de reacties.
Ik had gehoopt dat het iets simpels was.

Nog tips waar ik wat meer info vandaan kan halen over DIR_ behalve google?
 
Daan Slagter

Daan Slagter

03/11/2014 09:04:21
 
Roland Braat

Roland Braat

03/11/2014 09:12:58
Quote Anchor link
Ik heb nu het volgende:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    session_start();

require_once($_SERVER['DOCUMENT_ROOT'].'/instances/'.$_SESSION['db'].'/config.inc.php');
?>


Als ik in config.inc.php een echo plaats en ik gebruik dezelfde code in een testfile in dezelfde map. Dan krijg ik de echo terug. Dus ik weet dat ik de juiste link en bestand opvraag.
Alleen hij blijft maar laden en doet niet wat hij hoort te doen.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

03/11/2014 10:16:44
Quote Anchor link
Waarschijnlijk een lus

test.php:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
// gaat oneindig door
include 'test.php';
?>
 
Roland Braat

Roland Braat

05/11/2014 15:04:03
Quote Anchor link
Daar ben ik weer. Ik kom er gewoon niet uit.
Ik zal even de situatie schetsen van mijn bedoeling

Wij hebben een site met een aanmeld formulier. Als je je daar registreert dan word er op jouw naam een website gemaakt. Deze website staat dan in een map instance/crmi_000001/ die crmi map hebben we verschilllende bijv. crmi_000002, crmi_000003 etc. Iedere map(installatie) heeft een eigen config.inc.php
We hebben een aantal modules die worden gedeeld door de verschilende crmi mappen (dit om het update makkelijke te maken) 1 van deze modules maakt gebruik van een config.inc.php. op dit moment word die opgeroepen vanuit de db.inc.php op deze manier: include_once '../../../../config.inc.php. alleen die config.inc.php moet gehaald worden uit 1 van die crmi mappen. Dus ik heb nu weer dit

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
session_start()
include_once($_SERVER['DOCUMENT_ROOT'].'/instances/'.$_SESSION['db'].'/config.inc.php');
?>


Alleen door die session_start() lijkt wel of de pagina blijft hangen(continue laden) zoals Frank al aangaf waarschijnlijk een lus.
Ik ben verder niet zo heel erg bekend met php maar ik doe mijn best. Hoe krijg ik dit werkend?
 
- SanThe -

- SanThe -

05/11/2014 15:11:50
Quote Anchor link
Zet dit bovenin je script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
?>
 
Roland Braat

Roland Braat

05/11/2014 15:16:05
Quote Anchor link
De enigste error die ik krijg is dat hij geen verbinding met de database kan krijgen.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

05/11/2014 17:07:28
Quote Anchor link
Misschien makkelijker om even te vertellen hoe je mappen zijn opgebouwd:

Voorbeeldje: (Mag ook met een screendump)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
root website: /var/www/html
    |
    |- crmi_000001
    |- crmi_000002
    |- crmi_000003
    |- modules
        |
        |- module A
        |    |
        |    | - config.inc.php
        |- module B
etc
 
Roland Braat

Roland Braat

05/11/2014 23:11:11
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
root website: /var/www/portal
    | instances  
      |- crmi_000001 - website met o.a config.inc.php
          | Contacten
          | Afbeeldingen
      |- crmi_000002 - website met o.a config.inc.php
          | Contacten
          | Afbeeldingen
      |- crmi_000003 - website met o.a config.inc.php
          | Contacten
          | Afbeeldingen
    | modules
      | module A
          |config met hierin o.a db.inc.php ( deze moet de config.inc.php laden uit de crmi mappen )
      | module B
      | module C
    | Style
      | images
      - style.css
etc
Gewijzigd op 05/11/2014 23:18:17 door Roland Braat
 
- SanThe -

- SanThe -

05/11/2014 23:48:17
 
Frank Nietbelangrijk

Frank Nietbelangrijk

06/11/2014 01:18:31
Quote Anchor link
Goed, de websites moeten weten waar de modules te vinden zijn. Nu wil je het ook andersom: de modules moeten weten waar de website te vinden is.
Dit vraagt absoluut om een nieuwe module die er voor gaat zorgen dat er absolute paden beschikbaar komen. Laten we deze module_x noemen.

/var/www/portal/crmi_000001/config.inc.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

// definieer het CRMI nummer
define('CRMI', 1);

include_once '../modules/module_x/bootstrap.inc.php';

?>


/var/www/portal/modules/module_a/db.inc.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

include_once '../module_x/bootstrap.inc.php';

?>


/var/www/portal/modules/module_x/bootstrap.inc.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

// bepaal de <root> directory door vanaf de plek waar dit script staat $dirUpwards directories omhoog te gaan.
function getAbsoluteRoot($dirUpwards)
{

    $arr = explode('/', str_replace('\\', '/', __DIR__));
    for($i = 0 ; $i < $dirUpwards ; $i++)
        array_pop($arr);
    return implode('/', $arr);
}


// bepaal de absolute directory naar de <root> ( bijvoorbeeld /var/www/portal )
define('BASE_DIR', getAbsoluteRoot(2));

// als CRMI al gedefinieerd is dan kunnen we nu ook het pad naar de gebruikte CRMI bepalen:
if(defined('CRMI'))
    define('CRMI_DIR', BASE_DIR . '/crmi_' . str_pad(CRMI, 6, '0', STR_PAD_LEFT));


// enkel om te testen:
echo 'echo uit bootstrap.inc.php:<br>
BASE_DIR: '
.BASE_DIR.'<br>';
if(defined('CRMI_DIR'))
    echo 'CRMI_DIR: '.CRMI_DIR.'<br>';
echo '<br>';

?>


let er op dat je include_once gebruikt voor de bootstrap!
Gewijzigd op 06/11/2014 01:21:30 door Frank Nietbelangrijk
 
Roland Braat

Roland Braat

07/11/2014 11:47:56
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php

// definieer het CRMI nummer
define('CRMI', 1);

include_once '../modules/module_x/bootstrap.inc.php';

?>

die 1 die moet ik nu iedere keer automatisch aanpassen aan de instance map. Dus komt die uit map 2 dan maak ik daar nummer 2 van etc.


Kan dat nummer ook autmatisch aangepast worden? Dat nummer staat ook in de url. Bijv. instances/crmi_000123 ?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

// bepaal de <root> directory door vanaf de plek waar dit script staat $dirUpwards directories omhoog te gaan.
function getAbsoluteRoot($dirUpwards)
{

    $arr = explode('/', str_replace('\\', '/', __DIR__));
    for($i = 0 ; $i < $dirUpwards ; $i++)
        array_pop($arr);
    return implode('/', $arr);
}


// bepaal de absolute directory naar de <root> ( bijvoorbeeld /var/www/portal )
define('BASE_DIR', getAbsoluteRoot(2));

// als CRMI al gedefinieerd is dan kunnen we nu ook het pad naar de gebruikte CRMI bepalen:
if(defined('CRMI'))
    define('CRMI_DIR', BASE_DIR . '/crmi_' . str_pad(CRMI, 6, '0', STR_PAD_LEFT));


// enkel om te testen:
echo 'echo uit bootstrap.inc.php:<br>
BASE_DIR: '
.BASE_DIR.'<br>';
if(defined('CRMI_DIR'))
    echo 'CRMI_DIR: '.CRMI_DIR.'<br>';
echo '<br>';

?>

de echo geeft terug:
BASE_DIR: /var/www/vt_portal
CRMI_DIR: /var/www/vt_portal/crmi_00001
tussen vt_portal en crmi_000001 hoort nog een map instances te staan dus iets gaat er nog mis

EDIT:
De map heb ik opgelost. Nu nog het de juiste crmi_map selecteren
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
define('CRMI_DIR', BASE_DIR .'/instances'. '/crmi_' . str_pad(CRMI, 5, '0', STR_PAD_LEFT));
?>
Gewijzigd op 07/11/2014 13:03:40 door Roland Braat
 
Frank Nietbelangrijk

Frank Nietbelangrijk

07/11/2014 18:12:33
Quote Anchor link
Hoi Roland,

Ik ken heel het systeem niet waar je mee werkt maar ergens zal natuurlijk bepaald zijn welk CRMI nummer bij welke klant hoort. Waarschijnlijk ergens in de/een database tabel opgeslagen denk ik? Lijkt me het beste om je aan de 'afspraken' te houden...

Anders zou je weer de functie explode kunnen gebruiken om een pad in delen op te splitsen en deze delen in een array te zetten. Zoiets dus: (niet getest)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// maak een array met alle delen van het pad
$arr = explode('/', '/var/www/portal/instances/crmi_000123/index.php');

// laat ons even de array zien voor de duidelijkheid
echo '<pre>';
print_r($arr);
echo '</pre>';

// lus door elk deel van de array
foreach($arr as $part)
{

    // als dit deel begint met 'crmi_' dan het nummer eruit pakken
    if(substr($part, 0, 4) == 'crmi_'))
        echo 'CRMI: ' . intval(substr($part, 5));
}

?>
Gewijzigd op 07/11/2014 18:13:41 door Frank Nietbelangrijk
 
Roland Braat

Roland Braat

10/11/2014 11:53:44
Quote Anchor link
Dit is wat ik tot nu toe heb.
bootstrap.inc.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
// bepaal de <root> directory door vanaf de plek waar dit script staat $dirUpwards directories omhoog te gaan.'.$_SESSION['db'].'
function getAbsoluteRoot($dirUpwards)
{

    $arr = explode('/', str_replace('\\', '/', __DIR__));
    for($i = 0 ; $i < $dirUpwards ; $i++)
        array_pop($arr);
    return implode('/', $arr);
}


// bepaal de absolute directory naar de <root> ( bijvoorbeeld /var/www/portal )
define('BASE_DIR', getAbsoluteRoot(2));

// als CRMI al gedefinieerd is dan kunnen we nu ook het pad naar de gebruikte CRMI bepalen:
if(defined('CRMI'))
    define('CRMI_DIR', BASE_DIR .'/instances'. '/' . str_pad($_SESSION['db'], STR_PAD_LEFT). '/');


// enkel om te testen:
echo '<br>echo uit bootstrap.inc.php:<br>
BASE_DIR: '
.BASE_DIR.'<br>';
if(defined('CRMI_DIR'))
echo 'CRMI_DIR: '.CRMI_DIR.'<br>';
?>

De echo CRMI_DIR geeft terug: /var/www/vt_portal/instances/de juiste crmi nummer/
Dus dit lijkt me al goed

In mijn bestand db.inc.php bovenaan de volgende code
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
 include_once 'bootstrap.inc.php';
?>


En in mijn config.inc.php die in de instance mappen staan. heb ik bovenaan dit toegevoegd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
session_start(); //zonder deze is de link niet goed van de CRMI_DIR
// definieer het CRMI nummer

define('CRMI', 1 ); // het getal 1 word nergens voor gebruikt, maar als ik dit weglaat dan doet deze niks
include_once '../../VTCRM/modules/bootstrap.inc.php';
?>

Moet ik nu in de db.inc.php nog apart de config.inc.php include die in de instance map staat? Hoe doe ik dat?
Op dit moment word die nog niet aangeroepen.
 
Roland Braat

Roland Braat

13/11/2014 16:35:07
Quote Anchor link
Kan iemand me nog verder helpen?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.