config.inc.php uit de juiste map laden
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)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
global $sid;
session_start();
$sid = md5(session_id());
echo $_SESSION['db'];
?>
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?
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.....
Uit het hele verhaal dat ivo verteld is denk ik het belangrijkste om kennis te gaan maken met __DIR__
Ik had gehoopt dat het iets simpels was.
Nog tips waar ik wat meer info vandaan kan halen over DIR_ behalve google?
Code (php)
1
2
3
4
5
2
3
4
5
<?php
session_start();
require_once($_SERVER['DOCUMENT_ROOT'].'/instances/'.$_SESSION['db'].'/config.inc.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.
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)
1
2
3
4
2
3
4
<?php
session_start()
include_once($_SERVER['DOCUMENT_ROOT'].'/instances/'.$_SESSION['db'].'/config.inc.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?
De enigste error die ik krijg is dat hij geen verbinding met de database kan krijgen.
Voorbeeldje: (Mag ook met een screendump)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
| 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
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)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
// definieer het CRMI nummer
define('CRMI', 1);
include_once '../modules/module_x/bootstrap.inc.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
/var/www/portal/modules/module_x/bootstrap.inc.php
Code (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
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>';
?>
// 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
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
// definieer het CRMI nummer
define('CRMI', 1);
include_once '../modules/module_x/bootstrap.inc.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)
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
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>';
?>
// 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)
Gewijzigd op 07/11/2014 13:03:40 door Roland Braat
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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));
}
?>
// 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
bootstrap.inc.php
Code (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
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>';
?>
// 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
En in mijn config.inc.php die in de instance mappen staan. heb ik bovenaan dit toegevoegd:
Code (php)
1
2
3
4
5
6
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';
?>
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.
Kan iemand me nog verder helpen?