Vraag & Antwoord

Webprogrammeren & scripting

[PHP] variable pikken uit $file

8 antwoorden
  • ik heb een script die een map controleert en alle aanwezige bestanden in een <option> lijstje zet. Nu heb ik het idee om ipv de bestandsnaam, een variable(naam) uit dat bestand te halen. Dat bestand bevat (onderandere) [code:1:dfcfb08aea]<? php global $cfg; $cfg['configfile']['name']='COD server'; ?> [/code:1:dfcfb08aea]Het lukt me om die var uit te lezen, maar hij neemt voor het hele lijstje dezelfde variable, of eigenlijk, hij leest de variable van $file 1 keer, en laat die vervolgens op die waarde staan, terwijl hij $file wel bijwerkt. Hij moet eigenlijk voor elke keer dat er een item wordt neergezet opnieuw die var lezen. $file is namelijk een configbestand die bepaald hoe de pagina eruitziet. Het script dat ik gebruik voor het uitlezen van de directory is: [code:1:dfcfb08aea]<html> <head></head> <body> <?php //****************************************************************************** function getConfig() { global $config; $cfg_path="pub/configs/"; if (isset($_GET['config']) && !preg_match("/\\.\\./",$_GET['config']) && is_file($cfg_path.$_GET['config'])) $config=$_GET['config']; else $config = "cfg-default.php"; return $cfg_path.$config; } //****************************************************************************** require(getConfig()); //****************************************************************************** if ($handle = opendir('pub/configs/')) { while (false !== ($file = readdir($handle))) { if (!preg_match("/^\\./",$file)) { //echo "$file\n"; $config_file[]=$file; } } closedir($handle); } //****************************************************************************** if (count($config_file)>1) { asort($config_file); ?> <form action="vsp.php?mode=web" method="post" enctype="multipart/form-data" name="optionform" id="optionform"> <? $query_str=$_SERVER['QUERY_STRING']; $query_str=preg_replace("/&config=[^&]*/i",'',$query_str); ?> <select name="configselect" id="configselect"> <? foreach($config_file as $num => $file) { //echo "$file\n"; ?> <option <? if ($GLOBALS['config']=="$file") echo "selected";?> value="<? print $file; ?>" ><? include_once("$file"); print $cfg['configfile']['name'];?> (<? print $file; ?>)</option><? } ?> </select> </form> <? } ?> </body> </html>[/code:1:dfcfb08aea] Hij controleerd de variable(naam) op 1 van de laatste regels. [b:dfcfb08aea]Weet iemand misschien hoe ik dit kan oplossen?[/b:dfcfb08aea]
  • anyone? Wat is er onduidelijk?
  • Wellicht zit de fout in deze regel: [quote:0e7e381b7c] <option <? if ($GLOBALS['config']=="$file") echo "selected";?> value="<? print $file; ?>" ><? [b:0e7e381b7c]include_once[/b:0e7e381b7c]("$file"); print $cfg['configfile']['name'];?> (<? print $file; ?>)</option><? } ?>[/quote:0e7e381b7c] Omdat de het bestand "cfg-default.php" (of de met de querystring meegegeven config variabele) reeds geinclude is middels een require. Daarna zeg je nog eens include_once("cfg-default.php") en werkt niet omdat 'ie al eens is toegevoegd. Volledige onderbouwing hiervan kon ik zo snel niet vinden, maar ik heb het even getest en het blijkt te kloppen. Dus... om een lang verhaal kort te maken: verander include_once door include Verander deze regel: [code:1:0e7e381b7c] <option <? if ($GLOBALS['config']=="$file") echo "selected";?> value="<? print $file; ?>" ><? include_once("$file"); print $cfg['configfile']['name'];?> (<? print $file; ?>)</option><? } ?>[/code:1:0e7e381b7c] Hierin: [code:1:0e7e381b7c] <option <? if ($GLOBALS['config']=="$file") echo "selected";?> value="<? print $file; ?>" ><? include("$file"); print $cfg['configfile']['name'];?> (<? print $file; ?>)</option><? } ?>[/code:1:0e7e381b7c]
  • dank je voor het meedenken. Ik heb het geprobeert, maar haalt helaas niets uit... (require werkt al helemaal niet)
  • Heb je dit ergens online staan zodat we kunnen zien wat de uitvoer is van je script? Uit je uitleg begrijp ik niet precies wat je wilt en willicht dat een online voorbeeld meer duidelijk maakt. Ook zou ik persoonlijk deze regel option <? if ($GLOBALS['config']=="$file") echo "selected";?> value="<? print $file; ?>" ><? include_once("$file"); print $cfg['configfile']['name'];?> (<? print $file; ?>)</option><? } ?> Volledig in PHP mode schrijven ipv steeds te switchen tussen HTML en PHP. Persoonlijk zou ik trouwens altijd <?php ipv enkel <? gebruiken. Dit omdat short_open_tags niet altijd op on staan :)
  • Bedankt voor je tips. Je kan op bepaalde momenten het script zien. Ik draai het op een lokaal webservertje, en die is niet altijd aan... als je het per sé wil zien: [url]http://213.134.230.168/hgLAN/vsp-core/vsp.php?mode=web[/url] of [url]http://213.134.230.168/hgLAN/vsp-core/checkdir.php[/url] voor puur en alleen dit script (vsp.php includes checkdir.php). Die zit er op het moment zo uit:[code:1:4711d4de63]<?php require(getConfig()); //****************************************************************************** function getConfig() { global $config; $cfg_path="pub/configs/"; if (isset($_GET['config']) && !preg_match("/\\.\\./",$_GET['config']) && is_file($cfg_path.$_GET['config'])) $config=$_GET['config']; else $config = "cfg-default.php"; return $cfg_path.$config; } //****************************************************************************** if ($handle = opendir('pub/configs/')) { while (false !== ($file = readdir($handle))) { if (!preg_match("/^\\./",$file)) { //echo "$file\n"; $config_file[]=$file; } } closedir($handle); } //****************************************************************************** if (count($config_file)>1) { asort($config_file); $query_str=$_SERVER['QUERY_STRING']; $query_str=preg_replace("/&config=[^&]*/i",'',$query_str); echo "<select name=\"configselect\" id=\"configselect\">"; foreach($config_file as $num => $file) { echo "<option "; if ($GLOBALS['config']=="$file") echo "selected "; echo "value=\"". $file ."\" >"; include("$file"); echo $cfg['configfile']['name']." (".$file.")"."</option>"; } echo "</select>"; } else { echo getConfig(); } ?>[/code:1:4711d4de63]Het idee is: Dit script kijkt welke bestanden zich bevinden in "pub/configs/" in deze opsomt in een option-lijst. Al die bestanden hebben een code in zich waarin een naam staat die ik ze meegeef.[code:1:4711d4de63]$cfg['configfile']['name']='Standaard server';[/code:1:4711d4de63] of [code:1:4711d4de63]$cfg['configfile']['name']='W:ET server';[/code:1:4711d4de63] of [code:1:4711d4de63]$cfg['configfile']['name']='COD server';[/code:1:4711d4de63] Deze naam wordt boven in dat bestand global gemaakt.[code:1:4711d4de63]global $cfg;[/code:1:4711d4de63]Vervolgens moet mijn script die naam eruitplukken en echoén, bij elk bestand($file) de naam die in erin wordt aangegeven.
  • Hmmm... Ik heb hem hier getest, en met wat aanpassingen kreeg ik hem aan het werk. Misschien zat het hem toch ergens anders in. Zo werkte 'ie (naar mijn mening): [code:1:51d01464bc]<html> <head></head> <body> <?php $cfg_path = 'c:/web/test/dir/'; //****************************************************************************** function getConfig() { global $cfg_path; if (isset($_GET['config']) && !preg_match("/\\.\\./",$_GET['config']) && is_file($cfg_path.$_GET['config'])) $config=$_GET['config']; else $config = "cfg-default.php"; return $cfg_path.$config; } //****************************************************************************** require(getConfig()); //****************************************************************************** $config_file = array(); if ($handle = opendir($cfg_path)) { while (false !== ($file = readdir($handle))) { if (!preg_match("/^\\./",$file)) { $config_file[]=$file; } } closedir($handle); } //****************************************************************************** if (count($config_file)>1) { asort($config_file); ?> <form action="vsp.php?mode=web" method="post" enctype="multipart/form-data" name="optionform" id="optionform"> <? $query_str=$_SERVER['QUERY_STRING']; $query_str=preg_replace("/&config=[^&]*/i",'',$query_str); ?> <select name="configselect" id="configselect"> <? foreach($config_file as $num => $file) { //echo "$file\n"; ?> <option <? if ($GLOBALS['config']=="$file") echo "selected";?> value="<? print $file; ?>" ><? include($cfg_path . $file); print $cfg['configfile']['name'];?> (<? print $file; ?>)</option><? } ?> </select> </form> <? } ?> </body> </html>[/code:1:51d01464bc]
  • hmm, jou humble opinion klopt niet helemaal. Bij mij werkt ie nog niet...[code:1:f1ef835859]Warning: main(cfg-default.php) [function.main]: failed to open stream: No such file or directory in e:\apacheserver\Apache\htdocs\hgLAN\vsp-core\checkdir2.php on line 19 Fatal error: main() [function.require]: Failed opening required 'cfg-default.php' (include_path='.;C:\php5\pear') in e:\apacheserver\Apache\htdocs\hgLAN\vsp-core\checkdir2.php on line 19[/code:1:f1ef835859] [b:f1ef835859]EDIT1:[/b:f1ef835859] Hij werkt wel. wat er nou precies aan scheelde heb ik niet door, maar het werkt. Hartstikke bedankt... [b:f1ef835859]EDIT2:[/b:f1ef835859] Hoe kan ik voorkomen dat hij de naam van een andere weergeeft als een bestand er zelf geen heeft?

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.