Autor Zpráva
kuba95
Profil
Zdravím,
mám script, který mi vypisuje všechny názvy souborů ze složky a potom je uloží do html souboru. V tom scriptu se snažím dostat do složky $d, jejíž název je do scriptu posílán funkcí post. Mě se ale ta složka neotevře.

Script na generování:

<?php 

$d = $_POST['slozka'] ; 
$nadpis = $_POST['nadpis'] ;
$title = $_POST['title'] ;
$endline = "\n" ; 
 
 $dir = opendir ( $d ); 
 
 $output = '<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'.$endline; 
$output .= '<html xmlns="http://www.w3.org/1999/xhtml">'.$endline;
$output .= '<head>'.$endline;
$output .= '<title>';
$output .= $title;
$output .= '</title>'.$endline;
$output .= '<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">'.$endline;
$output .= '    <script src="../js/prototype.js" type="text/javascript"></script>'.$endline;
$output .= '    <script src="../js/scriptaculous.js?load=effects,builder" type="text/javascript"></script>'.$endline; 
$output .= '    <script src="../js/lightbox.js" type="text/javascript"></script>'.$endline;
$output .= '<style type="text/css">'.$endline;
$output .= '    body{ color: #333; font: 13px Verdana, sans-serif;    }'.$endline;
$output .= '</style>'.$endline;
$output .= '</head>'.$endline;
$output .= '<body>'.$endline;
$output .= '<center><font face="Verdana, Arial, Helvetica, Sans-Serif" size="+1"><b>'.$endline;
$output .= $nadpis.$endline;
$output .= '</b></font></center>'.$endline;
$output .= '<br />'.$endline;

 while($e = readdir($dir)) 
 { 
 if($e!='.' && $e!='..') 
 { 
 $output .= '   <a href="'.$e.'" rel="lightbox[roadtrip]"><img src="thumbs/'.$e.'" alt="" /></a>'.$endline; 
 } 
 } 
 $output .= '<br />'.$endline; 
 $output .= '</body>'.$endline; 
 $output .= '</html>'.$endline; 

 //code to write the $output to a file 
print_r($output);
$f =fopen("z.html", "w");
fwrite($f, $output);
fclose($f);
?>

Tímto souborem tam posílám název složky:

<html>
<head>
<meta http-equiv="Content-Language" content="cs">
<title>Zadání</title>
</head>

<form action="gen.php" method="post">
Složka:<br />
<input name="slozka" type="text" /><br />

Nadpis:<br />
<input name="nadpis" type="text" /><br />
Title:<br />
<input name="title" type="text" /><br />

<input type="submit" value="Odeslat" />
<input type="reset" />

</form>
</body>
</html>

Prosím poraďte někdo... Za všechny odpovědi předem děkuji...
TomasJ
Profil
Zkus místo while($e = readdir($dir)) dát while(($e = readdir($dir))!==false).
Pokud ani tak nepůjde, zkus ještě
scandir()
Ale pozor, tam se zadává to $d (cesta ke složce).

EDIT: Opraveno na upozornění od Tori.
Tori
Profil
kuba95:
Pokud je chybně zadaná cesta (název složky), tak by opendir měla vypsat chybu (že složka neexistuje, nebo není přístupná) a vrátit false. Píše vám to nějakou chybovou hlášku?

TomasJ
while(($e = readdir($dir))===true).
Tohle selže naprosto vždy. readdir vrací řetězec nebo false, takže má být while(($e = readdir($dir)) !== false)
TomasJ
Profil
Tori:
Hmm... Já myslel, že if(x!==false) a if(x===true) je to samé. Zajímavé, že mně to šlo...
Tori
Profil
TomasJ:
Možná jste použil obyčejné porovnání? x == true by tady prošlo, ale === porovnává i typ. Nicméně může se stát, že budu mít soubor s názvem složeným z nul, proto je lepší ověřovat !== false (stejně jako např. u strpos).
"00000" == false  // true
"0000" === false  // false
kuba95
Profil
Tori:
Píše vám to nějakou chybovou hlášku?

Ne, nic mi to nepíše, prostě to vezme soubory ze složky, ve které je ten script a ne z té, kterou tam pošlu pomocí post
TomasJ
Profil
kuba95:
Už jsi zkoušel co jsem psal ve [#2]? Taky to nešlo?
kuba95
Profil
Já se všem omlouvám, tento problém vůbec nenastal... Jenom jsem to špatně vyzkoušel...

Nastal mi ale jiný problém. Vypíše to všechny fotky ze složky, ale nejsou abecedně seřazeny... Snažil jsem se tam někam dát Sort($e); ale pořád mi to vypisovalo nějaký chyby...


TomasJ:

Jj, teď jsem to vyzkoušel, ale nic jinýho se nestalo...
Davex
Profil
kuba95:
Vypíše to všechny fotky ze složky, ale nejsou abecedně seřazeny...
Tak použij scandir(), jak ti radil [#2] TomasJ.
kuba95
Profil
Davex:
Tak použij scandir(), jak ti radil [#2] TomasJ.
Když tam dam scandir, tak mi to napíše tohle:

Fatal error: Maximum execution time of 20 seconds exceeded in ............
Davex
Profil
kuba95:
A nahradil jsi i ten readdir() načítáním hodnot z pole, které vrátí scandir()?
kuba95
Profil
takhle jsem to udělal:

 while(($e = scandir($d))!==false) 
 { 
 if($e!='.' && $e!='..') 
 { 
Davex
Profil
kuba95:
Zkus nahlédnout do dokumentace PHP co funkce vrací jako návratovou hodnotu a zamyslet se, jak by se s tím dalo dále pracovat (malá nápověda: foreach).
kuba95
Profil
Díky za radu... vzhledem k tomu, že s PHP moc neumim, tak jsem zkusil tohle:
  while($ep = scandir($d))
 foreach($ep as $e) 
 { 
 if($e!='.' && $e!='..') 
 { 

a hle! Pokrok... Už mi to nepíše tamtu hlášku, ale tuto: Fatal error: Allowed memory size of 50331648 bytes exhausted (tried to allocate 49545230 bytes) in ............

Šel by tento problém vyřešit jiným hostingem??
Alphard
Profil
Jaký problém chcete řešit s hostingem, vaši neznalost php? :-)
scandir() funguje jinak než readdir(), dávat ho jako podmínku do while cyklu je naprostá neznalost.
$ep = scandir($d);
foreach($ep as $e) 
kuba95
Profil
Alphard:
Díky mnohokrát... Už to funguje

Jaký problém chcete řešit s hostingem, vaši neznalost php? :-)
Asi jo... spíš neznalost angličtiny. Myslel jsem že mi to říká, že hosting mi nedá tolik paměti, kolik potřebuju...

dávat ho jako podmínku do while cyklu je naprostá neznalost.
Ano, v PHP zatím moc znalý nejsem...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: