Informaticasite van het Lauwers College te Buitenpost                 © R.J. van der Beek
 

Hoofdstuk 19. PHP en MySQL

19.3. De inhoud van een map laten zien


Stel je voor dat je de namen van alle bestanden in een bepaalde map wilt laten zien (als je bijvoorbeeld gelegenheid geeft bestanden te uploaden dan weet je zelf niet welke bestanden er in die map staan), en de naam van die map is UPLOADMAP, hoe doe je dat dan ? Dat lees je hier onder

  19.3.1. De inhoud van een map laten zien

De code om de inhoud van de map UPLOADMAP te laten zien is zo:

<?php 
$d=opendir("UPLOADMAP"); 
while ($bestanden=readdir($d) )
	{
	$bnaam="UPLOADMAP/".$bestanden;
	if (is_file($bnaam) )
		{ print ("$bestanden<br>"); }
	}
closedir($d);
?>

$d=opendir("UPLOADMAP"); betekent dat de map UPLOADMAP wordt geopend om de namen van de bestanden er uit te lezen en $d is de aanwijzer, die bijhoudt tot hoever de inhoud van de map is gelezen.

$bestanden=readdir($d) betekent dat de naam van het eerstvolgende bestand in de map UPLOADMAP wordt gelezen, en $bestanden bevat die naam

Als diezelfde opdracht nog eens komt wordt het eerstvolgende bestand gelezen.

Als je dus de opdracht
while ($bestanden=readdir($d) )
{ ......................}
geeft dan wordt net zo lang doorgegaan met het lezen van namen van bestanden tot ($bestanden=readdir($d) ) false wordt, dus tot er geen bestanden meer zijn.
De naam van het bestand wordt steeds opgeslagen in de variabele $bestanden

$bnaam="UPLOADMAP/".$bestanden; heeft tot gevolg dat in de variabele $bnaam de naam plus het pad is opgeslagen

Er wordt gecontroleerd of het wel echt een bestand is met if (is_file($bnaam) ) (want het zou ook de naam van een map kunnen zijn, en ook . en .. komen voor als namen van mappen in de directory-lijst.)

En als het een bestand is wordt de naam op het scherm afgedrukt door de opdracht print ("$bestanden<br>"); en die namen komen allemaal onder elkaar doordat er <br> achter $bestanden staat.

  19.3.2. Klikbare html-documenten laten zien

Stel je voor dat je de namen van alle html-bestanden in een bepaalde map wilt laten zien, en wel zo dat als je er op klikt de pagina getoond wordt, en de naam van die map is UPLOADMAP (want daarin staan de bestanden die door bezoekers geupload zijn), dan kun je dat zo doen:

<?php 
$d=opendir("UPLOADMAP"); 
while ($bestanden=readdir($d) )
	{
	$bnaam="UPLOADMAP/".$bestanden;
	if (is_file($bnaam) and eregi(".htm",$bnaam) )
	   { print ("<A href=\"$bnaam\" target=\"_blank\">$bestanden</A><br>"); }
	}
closedir($d);
?>

Zoals je ziet is er weinig verschil met het vorige script.
Er zijn twee verschillen:
eregi(".htm",$bnaam) is true als in de bestandsnaam .htm voorkomt, dus als het een html-document is. Alleen die bestanden worden dus getoond.

Er staat in plaats van: { print ("$bestanden<br>"); }
nu:
{ print ("<A href=\"$bnaam\" target=\"_blank\">$bestanden</A><br>"); }

Als $bestanden = TEST.HTM , dan is $bnaam = UPLOADMAP/TEST.HTM, en dan levert dat in het laatste geval de volgende code op:
<A href="UPLOADMAP/TEST.HTM" target="_blank">TEST.HTM</A><br>
en dat betekent dat TEST.HTM als hyperlink getoond wordt! En doordat er <br> achter staat komt de volgende hyperlink er onder, op de volgende regel.

  19.3.3. De inhoud van een map in tabelvorm laten zien

Bij de vorige scripts werden de namen van de bestanden allemaal onder elkaar afgedrukt.
Als je veel bestanden hebt is het overzichtelijker als je ze in tabelvorm hebt, en dan bijv. drie naast elkaar.
Dat kun je op de volgende manier bereiken:

<?php 
print("<table width=100% border=0><tr>");
$i=0;
$d=opendir("UPLOADMAP"); 
while ($bestanden=readdir($d) )
	{
	$bnaam="UPLOADMAP/".$bestanden;
	if (is_file($bnaam) )
        	{
		$i++;
		if ( (($i-1)/3)==round(($i-1)/3) )
			{
			print ("</tr><tr>");
			}
		{ print ("<td width=33%>$bestanden<td>"); }
	}
closedir($d);
print("</td></table> <br>");
?>

We zijn uitgegaan van het eerste script, waarbij de bestanden niet als hyperlink getoond worden.
Het tweede script kun je natuurlijk op dezelfde manier aanpassen.

We zijn begonnen met de opdracht:
print("<table width=100% border=0><tr>");
Dan wordt het begin van de tabel aangekondigd, en <tr> geeft het begin van de eerste regel van die tabel aan.

Als je drie bestanden per rij wilt dan moet het aantal bestanden dat al geweest is worden bijgehouden en dat gebeurt met de variabele $i. Die geven we bij de start de waarde 0

Als het vierde bestand moet worden afgedrukt dan moet dat op de volgende rij.
Als $i de waarde 4 heeft dan is (($i-1)/3)==round(($i-1)/3) true.
(en trouwens ook als $i=7, 10, 13 enz.
Dan wordt er in de code tussengevoegd: </tr><tr>
En dat geeft het einde van de rij aan en het begin van de volgende rij.

Verder moet de naam van het bestand tussen <td width=33%> en <td> om aan te geven dat het in de volgende cel geplaatst moet worden.