[PHP] include in function, include niet.. of ander probleem?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Cheater
  • Registratie: Januari 2001
  • Laatst online: 18-09 13:39
Ik heb een functie gemaakt die eerst controleert of een bestand bestaat, en vervolgens het included. Mocht de file niet bestaan dan krijgt die persoon een melding, en wordt een email verstuurd naar de webmaster, met alle benodigde informatie.

PHP:
1
2
3
4
5
6
7
8
function check_and_include($file) {
  if (file_exists($file)) {
    include($file);
  } else {
    echo "Het bestand dat voor deze pagina vereist is, is niet aanwezig.";
    send_error_mail("File does not exist");
  }
}
En dan doe ik dit:

index.php
PHP:
1
2
3
4
<?
check_and_include("variablen.php");
check_and_include("laat_vars_zien.php"); // bestandsnaam is effe als vb.
?>
variablen.php
PHP:
1
2
3
<?
$blaat = "test";
?>
laat_vars_zien.php
PHP:
1
2
3
<?
echo $blaat;
?>


Ik krijg echter geen output...
En ik denk dat dit komt omdat ik een include IN een functie doe.
als ik de check_and_includes in index.php verander in gewoon include()
dan werkt het goed.

Ik zou echter niet weten hoe dat komt, misschien iets met return waarde? Ik wil wel graag van deze leuke functie gebruik kunnen blijven maken.

[ Voor 8% gewijzigd door Cheater op 14-10-2004 11:37 ]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Volgens mij zit je met scope-problemen. In de php-manual wordt wel uitgelegd wat scope is en ik neem aan dat ook uitgelegd wordt in welke scope de variabelen die via een include binnen een functie worden gedaan terecht komen.

Als je het perse zo wilt doen, doe dan zoiets:
$GLOBALS['blaat'] = "waarde";

en later

echo $GLOBALS['blaat'];

[ Voor 22% gewijzigd door ACM op 14-10-2004 11:48 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Wat je hier beter kunt gebruiken is een eigen functie die fouten afhandelt. Zie de Error Handling and Logging Functions. Kijk ook eens naar de mogelijkheden van error_log.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 14 oktober 2004 @ 11:54:
Wat je hier beter kunt gebruiken is een eigen functie die fouten afhandelt. Zie de Error Handling and Logging Functions. Kijk ook eens naar de mogelijkheden van error_log.
..??

http://nl3.php.net/manual/nl/language.variables.scope.php

Zit idd in de scope.

Acties:
  • 0 Henk 'm!

Verwijderd

Ja, natuurlijk zit de fout in de scope. En daar kom je niet zomaar omheen. ACM's suggestie werkt alleen als je die functie vanuit de globale scope aanroept.

Er is dus geen oplossing als je die check_and_include functie vanuit een functie of een method aanroept. En wat je dan dus beter kunt doen, is gewoon proberen te includen. Als je een eigen error handler hebt, kun je ervoor kiezen om dan een nette foutmelding terug te geven en/of een e-mail te sturen, etcetera.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 14 oktober 2004 @ 11:59:
[...]

Ja, natuurlijk zit de fout in de scope.
Vraag dan niet of iemand weet hoe het komt dat het niet werkt..? :/


Nouja, misschien snap ik je niet helemaal goed. Op de php site staat over include():
When a file is include()ed, the code it contains inherits the variable scope of the line on which the include() occurs. Any variables available at that line in the calling file will be available within the called file. If the include() occurs inside a function within the calling file, then all of the code contained in the called file will behave as though it had been defined inside that function.
Dus je wilt include feitelijk anders gebruiken dan waarvoor hij gemaakt is. Ik zou dan geen errorhandler maken voor de fouten van include(), maar ik zou een eigen include functie maken die checked of het bestand bestaat.
met is_file(), fopen(), eval(). ofzo.

[ Voor 34% gewijzigd door Verwijderd op 14-10-2004 14:16 . Reden: verkeerde knop+quote ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik wéét wat er in de manual staat over include.
When a file is include()ed, the code it contains inherits the variable scope of the line on which the include() occurs.
Dus als je je include regel binnen een functie zet, krijg je het niet voor elkaar om in die include iets te doen met de scope waarin je eigen functie hebt aangeroepen.
Any variables available at that line in the calling file will be available within the called file.
Binnen de functie check_and_include is alléén de variabele $file aanwezig, omdat die variabele als argument wordt meegegeven.

Als je nu naar de post van de topicstarter kijkt, zie je dat de variabelen die worden geset in variablen.php terecht komen binnen de scope van die functie. Zodra de functie wordt verlaten, zijn die variabelen weg.

Direct daarna wordt met de check_and_include functie het bestand laat_vars_zien.php geinclude. Maar weer was er bij het aanroepen van de check_and_include alleen de variabele $file binnen die scope aanwezig.
If the include() occurs inside a function within the calling file, then all of the code contained in the called file will behave as though it had been defined inside that function.
Ja, en laat dat dus exact het probleem zijn van de topicstarter. Eigenlijk wil ie dus dat alles in de globale scope plaatsvindt. Maar als je het doet op mijn manierTM dan roep je gewoon direct de standaard php include "functie" aan waar je maar wilt. Eventuele foutmeldingen moet je gewoon afvangen.

[edit]
Naar aanleiding van jouw edit:
Vraag dan niet of iemand weet hoe het komt dat het niet werkt..? :/
Ik vroeg helemaal niets. Ik gaf alleen suggesties.
Dus je wilt include feitelijk anders gebruiken dan waarvoor hij gemaakt is. Ik zou dan geen errorhandler maken voor de fouten van include(), maar ik zou een eigen include functie maken die checked of het bestand bestaat.
met is_file(), fopen(), eval(). ofzo.
Tja, je kunt ook geheel je eigen server-side scripting engine gaan schrijven. Mijn suggestie werkt vrijwel altijd als je wilt dat er user-friendly error messages worden gegeven en als je wilt dat de webmaster wordt ingelicht. Ik vraag me af wat er beter is aan het voor iedere functie die foutmeldingen kan geven een wrapper functie te schrijven. Dat lijk mij eerlijk gezegd nogal dom. Vandaar mijn suggesties.

[ Voor 23% gewijzigd door Verwijderd op 14-10-2004 14:28 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 14 oktober 2004 @ 14:09:
[...]

Vraag dan niet of iemand weet hoe het komt dat het niet werkt..? :/
Je haalt Cheater en CHeatah door elkaar denk ik. :P

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op 14 oktober 2004 @ 14:33:
[...]Je haalt Cheater en CHeatah door elkaar denk ik. :P
Hehehhehe.. idd! :) 8)7
Dacht dat TS een error handler wilde gaan schrijven omdat hij het probleem niet anders wist op te lossen, vandaar mijn suggestie.
sorry Cheatah :o
Pagina: 1