[PHP] is_file() functie werkt niet

Pagina: 1
Acties:
  • 161 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
Een heel vreemd (sadly zelfs basic) probleem kwam ik tegen tijdens het coden van een simpel template-based systeem voor een project, namelijk dat de functie is_file() helemaal geen output levert. Nix, nada, null.

Ik roep de functie als volgt aan:
code:
1
2
3
4
5
6
7
8
9
10
11
if(is_file($s.'menu.txt')){

print('<div class="ads" id="ads">
         <font class="menuitem">');

include($s.'menu.txt');

print('</font>
       </div>');

}

Het stuk code in de if-routine wordt niet uitgevoerd, terwijl als ik de include statement buiten de if-routine haal, ($s.'menu.txt') wel gewoon geinclude en afgedrukt wordt.

Ook een debugprint als
code:
1
print(is_file($s.'menu.txt'));

levert geen output op.

Mis ik iets mbt. 'regular files'?

Disclaimer:
1. de search van GoT time-out bij een zoekopdracht naar "is_file" en/of "is_file php",
2. de FAQ geen uitsluitsel geeft,
3. Google mij ook niet verder helpt dan bekrompen manuals, en
4. ook de manual niet duidelijk genoeg is mbt. 'regular files', open ik dit topic

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 20-09 21:53
Ik mis nog wat informatie zoals:
1. Werk je op een Windows of Linux platform?
2. Doe eens een echo $s.'menu.txt'. Hoe zit je padverwijzing er dan uit?
3.
edit:
o ja de PHP versie die je draait kan ook van belang zijn


Als de is_file() functie niets teruggeeft krijg je dus gewoon een lege string terug wat neerkomt op FALSE.

[ Voor 15% gewijzigd door pjonk op 29-12-2004 12:43 ]

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
JonkieXL schreef op woensdag 29 december 2004 @ 12:35:
1. Werk je op een Windows of Linux platform?
1. Apache/2.0.52 (Win32) PHP/4.3.9 Server at 192.168.1.203 Port 80
JonkieXL schreef op woensdag 29 december 2004 @ 12:35:
2. Doe eens een echo $s.'menu.txt'. Hoe zit je padverwijzing er dan uit?
Dan krijg ik logischerwijze alleen
code:
1
01menu.txt

terug, wat klopt, want dat zou in dit geval ook de correcte verwijzing zijn naar de file. Nogmaals, simpelweg includen zonder is_file verificatie werkt wel

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 07:32
Misschien kan je beter controleren op het GEHELE pad van de file ? dus niet alleen in de current dir. Ik weet namelijk niet hoe jouw directory indeling er uit ziet en welke files waar geinclude worden. Dit kan namelijk nog wel es verwarrend zijn.

Acties:
  • 0 Henk 'm!

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
sorted.bits schreef op woensdag 29 december 2004 @ 13:02:
Misschien kan je beter controleren op het GEHELE pad van de file ? dus niet alleen in de current dir. Ik weet namelijk niet hoe jouw directory indeling er uit ziet en welke files waar geinclude worden. Dit kan namelijk nog wel es verwarrend zijn.
Dat heb ik nét geprobeerd tijdens dat jij je post aan het tikken was. Op een of andere manier werkt 't dan nóg niet. :r
Thnx voor de suggestie though

[ Voor 4% gewijzigd door Scyth op 29-12-2004 13:05 ]

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Scyth schreef op woensdag 29 december 2004 @ 12:43:
terug, wat klopt, want dat zou in dit geval ook de correcte verwijzing zijn naar de file. Nogmaals, simpelweg includen zonder is_file verificatie werkt wel
wellicht zit die file wel in je include path maar niet in de huidige directory?
maar het beste is om het volledige path te gebruiken zodat je zeker weet dat je op de juiste plek zit te kijken :)

Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 20-09 21:53
Erkens schreef op woensdag 29 december 2004 @ 13:05:
[...]

wellicht zit die file wel in je include path maar niet in de huidige directory?
maar het beste is om het volledige path te gebruiken zodat je zeker weet dat je op de juiste plek zit te kijken :)
Grote kans dat dit je probleem is en volledige paden gebruiken is idd veiliger :). Ik gebruik zelf altijd ongeveer de volgende constructie.
PHP:
1
2
3
4
define('ROOT',  $_SERVER['DOCUMENT_ROOT']);
if(is_file(ROOT . '/path1/path2/' . $s. 'menu.txt')){
   // etc.
}

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • Scyth
  • Registratie: Juli 2001
  • Laatst online: 16-03-2024

Scyth

Fat finger, three beer

Topicstarter
* Scyth hugs JonkieXL (en de rest natuurlijk)


PHP:
1
define('ROOT',  $_SERVER['DOCUMENT_ROOT']);

was de oplossing. Het probleem zat erin dat in PHP de php niet aan zichzelf kan refereren met een IP ofzo.

PHP:
1
2
3
4
5
//Dit werkt niet:
is_file('http://192.168.1.203/blaaaat/templates/01menu.txt');

//Dit werkt wél:
is_file(ROOT.'/blaaaat/templates/01menu.txt');

[ Voor 14% gewijzigd door Scyth op 29-12-2004 13:36 ]

Dell Studio XPS 16
Project: BavBierSub 1.0 BavBierSub 2.0


Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 07:32
Joh, is_file is volgens mij een call op je file-system en gaat niet werken via URL's.

Acties:
  • 0 Henk 'm!

Verwijderd

sorted.bits schreef op woensdag 29 december 2004 @ 13:41:
Joh, is_file is volgens mij een call op je file-system en gaat niet werken via URL's.
Wat hij zei.

Bovendien is de natuurlijke waarde van een False boolean in PHP een lege string ('', God knows why), dus is het logisch dat het echo'en van de is_file() geen uitvoer oplevert.

[ Voor 4% gewijzigd door Verwijderd op 29-12-2004 13:43 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op woensdag 29 december 2004 @ 13:43:
Bovendien is de natuurlijke waarde van een False boolean in PHP een lege string ('', God knows why), dus is het logisch dat het echo'en van de is_file() geen uitvoer oplevert.
offtopic:
nee, false is geen lege string, maar een waarde zonder waarde ;)
PHP:
1
echo false===''?'true':'false';

dit geeft de string "false" terug, waarmee bewezen is dat false niet een string is :)

En om even volledig te zijn:
PHP:
1
2
3
4
5
6
7
echo is_string(false)?'true':'false';
echo is_int(false)?'true':'false';
echo is_float(false)?'true':'false';
echo is_numeric(false)?'true':'false';
echo is_array(false)?'true':'false';
echo is_object(false)?'true':'false';
echo is_bool(false)?'true':'false';

Het is dus gewoon een boolean en niks anders, echter een lege string evalueerd wel naar false, vandaar dat je vaak nog het type wilt checken met de triple= :)

Acties:
  • 0 Henk 'm!

Verwijderd

Okee, minpuntje voor mij.

Maar waar ik het in mijn naïeviteit over had is als je een boolean echo't. Ze hádden daar mooi 'true' of 'false' kunnen echo'en, maar in plaats daarvan krijg je het karakter '1' voor true, of niets voor false.

Misschien was het iets te kort door de bocht van me om te zeggen dat de false DAAROM gelijk is aan een lege string. In de uitvoer zie je het verschil echter niet, en ik blijf het belachelijke uitvoer vinden.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op woensdag 29 december 2004 @ 14:13:
Okee, minpuntje voor mij.

Maar waar ik het in mijn naïeviteit over had is als je een boolean echo't. Ze hádden daar mooi 'true' of 'false' kunnen echo'en, maar in plaats daarvan krijg je het karakter '1' voor true, of niets voor false.

Misschien was het iets te kort door de bocht van me om te zeggen dat de false DAAROM gelijk is aan een lege string. In de uitvoer zie je het verschil echter niet, en ik blijf het belachelijke uitvoer vinden.
doorgaands wil je nooit een boolean in je uitvoer, want technisch gezien is dat 1 bitje :P
Zodra je echter zo'n boolean toch naar de uitvoer gooit dan convert PHP hem naar iets wat altijd terug te converten is naar een boolean en dat is dus niet een string 'true' of 'false' ;)
Vaak wil je een boolean alleen voor debug redenen outputten, en ik gebruik dan altijd boolean?'T':'F' werkt prima voor mij :)

Acties:
  • 0 Henk 'm!

Verwijderd

Ah, dat is het natuurlijk.

Stom van me.

Bedankt voor de verlichting Erkens B)

Acties:
  • 0 Henk 'm!

Verwijderd

één kleine toevoeging, wat ik altijd doe als ik "niks" terugkrijg, is naast de echo of print ook gettype($bla) te echoen, dan had je gelijk gezien dat het een boolean was...

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

Nog beter is het om var_dump te gebruiken. Je krijgt dan namelijk type en waarde in 1 keer en voor een boolean krijg je dan ook netjes true, false of null te zien.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Erkens:
doorgaands wil je nooit een boolean in je uitvoer, want technisch gezien is dat 1 bitje :P
Da's technisch gezien ook onzin, een boolean is een concept, dat heeft helemaal niets met bits te maken.

Anyhow, de verklaring die je geeft klopt wel, maar het is wel belachelijk dat een boolean niet gewoon een 0 of een 1 oplevert. Ook als string evalueren die namelijk als resp. false en true.

PHP:
1
2
3
4
5
6
7
8
$some_string = array ( '0', '1' );
foreach ( $some_string as $str )
   printf ( 
      "%s as %s evaluates %s\n",
      $str,
      gettype ( $str ),
      $str ? 'true' : 'false'
   );
0 as string evaluates false
1 as string evaluates true
Verder pwnz var_dump print_r, print en echo bigtime, aangezien var_dump niet alles naar string "cast" en ook het type gewoon opgeeft.
PHP:
1
2
3
4
5
6
7
$arr = array (
   '', 's',       //string
   0, 1,          //int
   true, false,   //boolean
   null           //null
);
var_dump ( $arr );

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
array(7) {
  [0]=>
  string(0) ""
  [1]=>
  string(1) "s"
  [2]=>
  int(0)
  [3]=>
  int(1)
  [4]=>
  bool(true)
  [5]=>
  bool(false)
  [6]=>
  NULL
}


edit:
Spuit 11 @WormLord :X

[ Voor 9% gewijzigd door drm op 30-12-2004 14:09 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1