Minulla on pieni probleema require_once:n kanssa. Projektin pääkansiossa "staffchat_dev" on tiedosto "config.php". Pääkansion alla kansiossa "include" on (hassusti nimetty) tiedosto "top.php", joka sisällyttää require_once - lauseella yläkansion tiedoston:
require_once ( "../config.php" );
Tulkki on kuitenkin sitä mieltä, että tiedostoa ei ole olemassa:
[14-Dec-2012 05:12:31] PHP Warning: require_once(../config.php) [<a href='function.require-once'>function.require-once</a>]: failed to open stream: No such file or directory in /home7/ohjelmoi/public_html/staffchat_dev/include/top.php on line 2 [14-Dec-2012 05:12:31] PHP Fatal error: require_once() [<a href='function.require'>function.require</a>]: Failed opening required '../config.php' (include_path='.:/usr/lib64/php:/usr/lib/php:/usr/share/pear') in /home7/ohjelmoi/public_html/staffchat_dev/include/top.php on line 2
Uskon kyllä tulkkia, mutta en ymmärrä, mistä se etsii tiedostoa. PHP:n dokumentaatiossa lukee
https://www.php.net/manual/en/function.include.
If a path is defined — whether absolute (starting with a drive letter or \ on Windows, or / on Unix/Linux systems) or relative to the current directory (starting with . or ..) — the include_path will be ignored altogether. For example, if a filename begins with ../, the parser will look in the parent directory to find the requested file.
Tuon mukaan (jos käsitin oikein) include_path:lla ei siis ole tämän kanssa mitään tekemistä, ja tiedostoa etsitään yläkansiosta sisällyttävään tiedostoon nähden. Voiko ongelma olla silti PHP:n asetuksissa?
Kiitosta vaan :)
Onko tiedosto kirjoitettu merkilleen config.php, eikä esim. Config.php?
Onkos tuo include/top.php -muuten liitetty jollain toisella skriptillä? Eli todennäköisesti viittaus menee siksi mönkään, kun php-tulkki ajaakin skriptiä esim. suoraan "oikeassa" hakemistossa, eikä tuolla "include"-hakemistossa!
Ihan merkilleen lowercasena.
Suhteelliset polut ovat suhteellisia työhakemistoon (current working directory) nähden. Se taas määräytyy sen mukaan, missä pääohjelma sijaitsee. Eli siis periaatteessa selaimen osoiterivillä näkyvän skriptin suhteen, mikäli et ole käyttänyt rewritejä.
P.S. Sinun täytyy ehdottomasti opetella debuggaamaan koodiasi. Tämä ongelma olisi ratkennut yksinkertaisesti tulostamalla senhetkinen polku.
Annan polkuasiasta vielä sekavan esimerkin: Käyttäjä lataa tiedoston juuri/a/a.php, jossa on rivi include("../b/c/c.php"), jossa on rivi include("../b.php"). Viimeksi mainittu rivi viittaa silloin tiedostoon juuri/a/../b.php eli yksinkertaisesti juuri/b.php. Kuitenkin jos käyttäjä lataisi suoraan sivun juuri/b/c/c.php, aivan sama include-rivi viittaisikin tiedostoon juuri/b/b.php.
Ongelman voi välttää käyttämällä absoluuttisia polkuja:
require_once(__DIR__."/../config.php");
Niinpä tietysti, jotenkin unohdin tuon näkökulman... Kiitti :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.