[PHP] Bestand buiten root-dir werkt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 20-09 17:02
Ik heb een complete site gemaakt op localhost, en heb 'm vandaag geupload naar m'n host. Ik loop alleen tegen een probleem op. Als ik een script buiten de huidige directory probeer te includen werkt dat gewoon niet.
Deze code geeft een lege pagina:
PHP:
1
2
3
4
5
6
<?
$file='testfolder/file.php';
if(file_exists($file)){
    require('$file');
}
?>


Deze code ( +die() ) geeft een error:
PHP:
1
2
3
4
5
6
<?
$file='testfolder/file.php';
if(file_exists($file)){
    require('$file') or die('');
}
?>


error:
code:
1
2
3
Warning: main(1): failed to open stream: No such file or directory in /usr/home/ws/[user]/[site]/www/testdoc.php on line 4

Fatal error: main(): Failed opening required '1' (include_path='.:/usr/local/lib/php') in /usr/home/ws/[user]/[site]/www/testdoc.php on line 4


Bij require heb ik hetzelfde probleem. Op internet was er iemand met een soortgelijk probleem, en hij kon het probleem oplossen door een absoluut pad te maken door het toevoegen van
PHP:
1
$file=$_SERVER['DOCUMENT_ROOT'] . 'testfolder/file.php';

Maar dat werkt niet bij mij. Bovendien ben ik niet zo blij met deze oplossing omdat ik dan een aardig aantal regeltjes code aan moet passen.

Op Localhost (Windows XP,apache1, PHP4) werkt alles, net als op m'n locale webserver(Debian Linux Sarge, apache2, PHP4). De host (Unix-variant, apache2, PHP4) werkt voor geen meter.

Wie helpt?

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 19:39
php.net kan je vertellen dat een variabele in een string tussen enkele quotes niet geparsed wordt. Je probeert dus een bestand met de naam $file te includen.

Ik vind het dan ook vreemd dat je eerste voorbeeld geen error zou geven en het tweede wel. Nog vreemder is dat je beweert dat het bij jou lokaal wel werkt.

Acties:
  • 0 Henk 'm!

  • Paul C
  • Registratie: Juni 2002
  • Laatst online: 14:02
Probeer dit eens:
PHP:
1
2
3
4
5
6
<?
$file='testfolder/file.php';
if(file_exists($file)){
    require($_SERVER['DOCUMENT_ROOT'] . $file);
}
?>


en ga dit eens lezen:
http://us3.php.net/types.string

Acties:
  • 0 Henk 'm!

  • Mafkees
  • Registratie: Oktober 2003
  • Niet online
Ik ben sowieso geen voorstander van variabelen tussen quotes. Variabelen en strings gaan tussen dubbele quotes zoals je dat ook vaak doet in talen als Java en C++ waar je ook geen variabelen tussen quotes zet.. Niet netjes vind ik:

PHP:
1
2
$foo = 'test';
echo "Doet de test het? $foo ... Ja!";


Netter vind ik om daar

PHP:
1
2
$foo = "test";
echo "Doet de test het? " . $foo . " ... Ja!";


van te maken :)

Acties:
  • 0 Henk 'm!

  • rrrandy
  • Registratie: Juli 2005
  • Laatst online: 27-06 13:00
Zitten er misschien hoofdletters in de dir of de bestandsnaam?

Windows is vindt het allemaal prima, Linux/Unix systemen doen daar wel moeilijk over (terecht overigens).

Acties:
  • 0 Henk 'm!

  • Equator
  • Registratie: April 2001
  • Laatst online: 09-09 15:29

Equator

Crew Council

#whisky #barista

Mafkees schreef op donderdag 26 oktober 2006 @ 09:19:
Ik ben sowieso geen voorstander van variabelen tussen quotes. Variabelen en strings gaan tussen dubbele quotes zoals je dat ook vaak doet in talen als Java en C++ waar je ook geen variabelen tussen quotes zet.. Niet netjes vind ik:

PHP:
1
2
$foo = 'test';
echo "Doet de test het? $foo ... Ja!";


Netter vind ik om daar

PHP:
1
2
$foo = "test";
echo "Doet de test het? " . $foo . " ... Ja!";


van te maken :)
Netter: Ja
Leesbaarder: Nee (is mijn menig :) )

Ik probeer zo min mogelijk te echo'en maar een string opbouwen met variabelen erin doe ik zo:
PHP:
1
2
$var1 = "een willekeurig stukje tekst";
$string = "Dit geeft de output van {$var1} weer";

Vooral in het opbouwen van queries is dit veel leesbaarder :)
Wellicht dat hier ook nadelen aanzitten maar volgens mij is het voor de parser zo makkelijker te achterhalen wat een variabele is.
doeternietoe schreef op woensdag 25 oktober 2006 @ 23:47:
Ik heb een complete site gemaakt op localhost, en heb 'm vandaag geupload naar m'n host. Ik loop alleen tegen een probleem op. Als ik een script buiten de huidige directory probeer te includen werkt dat gewoon niet.
Deze code geeft een lege pagina:
PHP:
1
2
3
4
5
6
<?
$file='testfolder/file.php';
if(file_exists($file)){
    require('$file');
}
?>
Zo dus :)
PHP:
1
2
3
4
5
6
<?
$file='testfolder/file.php';
if(file_exists($file)){
    require($file);
}
?>

[ Voor 4% gewijzigd door Equator op 26-10-2006 10:34 ]


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 20-09 17:02
Sorry dat ik jullie op het verkeerde been heb gezet, maar die twee quotes stonden er in de originele code niet. Ik kon niet knippen en plakken omdat ik deze vraag stelde vanaf een andere pc, en heb dus gewoon een stom foutje gemaakt.

Hoe dan ook, ook met (volgens mij) juiste code heb ik het probleem.

Deze code: (copy+paste :P )
PHP:
1
2
3
4
5
6
<?
$file='includes/connection.php';
if(file_exists($file)){
    require($file) or die('');
}
?>


Geeft deze error:
code:
1
2
3
Warning: main(1): failed to open stream: No such file or directory in /usr/home/ws/user/site/www/pagina.php on line 4

Fatal error: main(): Failed opening required '1' (include_path='.:/usr/local/lib/php') in /usr/home/ws/user/site/www/pagina.php on line 4


Als ik de die() verwijder, krijg ik een volledig leeg script, naar het lijkt zelfs zonder de juiste headers, want ik krijg in Firefox zo'n 'download dit bestand'-schermpje.

Edit: en met lege pagina bedoel ik ook helemaal leeg. Ik zie dan ook geen spoor van het bestand wat geinclude had moeten worden.

[ Voor 6% gewijzigd door doeternietoe op 26-10-2006 11:40 ]


Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 20-09 17:02
niemand?

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Mafkees schreef op donderdag 26 oktober 2006 @ 09:19:
PHP:
1
2
$foo = "test";
echo "Doet de test het? " . $foo . " ... Ja!";

van te maken :)
Of:
PHP:
1
2
$foo = "test";
printf("Doet de test het? %s ... Ja!", $foo);

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Mafkees schreef op donderdag 26 oktober 2006 @ 09:19:
PHP:
1
2
$foo = "test";
echo "Doet de test het? " . $foo . " ... Ja!";
Nog netter imo :


PHP:
1
2
$foo = 'test';
echo 'Doet de test het? ' . $foo . ' ... Ja!';


Als je toch geen variabelen in je quotes zet, parse ze dan ook niet. Is sneller ook.

Acties:
  • 0 Henk 'm!

  • Observer
  • Registratie: April 2001
  • Laatst online: 16:24
doeternietoe schreef op donderdag 26 oktober 2006 @ 11:35:
Geeft deze error:
code:
1
2
3
Warning: main(1): failed to open stream: No such file or directory in /usr/home/ws/user/site/www/pagina.php on line 4

Fatal error: main(): Failed opening required '1' (include_path='.:/usr/local/lib/php') in /usr/home/ws/user/site/www/pagina.php on line 4
De server heeft als include_path '.:/usr/local/lib/php' staan en jij wil bestanden includen uit '/usr/home/ws/user/site/www'. Volgens mij wordt de huidige directory ook automatisch opgenomen in het include_path, maar ik kan me vergissen.

Als oplossing kan je OF je webroot toevoegen aan de include_path (in php.ini)
OF zorgen dat je het volledige directory pad voor de te includen bestandsnaam zet :
code:
1
include("/usr/home/ws/user/site/www/testdir/testfile.php");


OF een relatief pad vanaf het bestand waar je de inlude doet naar het te includen bestand:
code:
1
include(dirname(__FILE__)."/testdir/testfile.php");

There are 10 kinds of people in the world: those that understand binary and those that don't


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 13:59

DexterDee

I doubt, therefore I might be

Ik denk niet dat het relevant is voor jou, maar als je Linux host 'SELinux' heeft aanstaan (Security Enhanced Linux) dan kan apache (en dus PHP) niet standaard buiten de webroot lezen. Ook niet als dit bestand onder de shell wel lees/schrijfbaar is door de apache user. Een chmod naar apache:apache helpt dus niks in dit geval.

De oplossing bij SELinux is het kenbaar maken aan SELinux dat bepaalde directories/files gelezen mogen worden door de webserver. Dit doe je met het volgende commando:

chcon -R -h -t httpd_sys_content_t /pad/naar/files_buiten_de_webroot

Waarbij -R alles recursief aanpast, -h de symbolic links meeneemt en -t aangeeft dat je de security descriptors wil aanpassen.

Omdat ik uit jouw verhaal opmaak dat je juist wel in de webroot files aan het includen bent gaat bovenstaande niet op, lijkt me. Ik liep hier echter zelf een keer tegenaan en het duurde even voordat ik het gevonden had. Dus iedereen die ik hiermee kan helpen, bij deze :)

Klik hier om mij een DM te sturen • 3245 WP op ZW

Pagina: 1