Autor Zpráva
martanius
Profil
Zdravím, mám takový problém. Hned ze začátku řeknu že jsem v PHP úplný začátečník, sice jsem již měl tu čest s podobným programovacím jazykem jako PHP, ale přímo v PHP jsem ještě nic moc nedělal.

Mám na webu písmena od A do Z a chtěl bych to, že když někdo klikne třeba na A tak se mu zobrazí odkazy na .html soubory ze složky pages podle abecedy, takže například takto :

Abba
Acer
Adidas
Afrika
Antilopa

atd....

Vyhledávání jsem zkoušel, ale nic z témat co jsem našel mi moc nepomohlo. Zatím jsem se dozvěděl jen to, že se na to používá funkce scandir() a je třeba mít PHP 5+, když jsem to tedy zkusil objevil se mi error "undefined function scandirt()", potm jsem to tedy ještě zkoušel přes funkci opendirt(), kteá by prý měla fungovat i na starších verzích PHP, ale u ní se mi objevila spousta hlášek jako je :

Warning: OpenDir: Invalid argument (errno 22) in c:\apache\htdocs\index.php on line 3

Warning: Supplied argument is not a valid Directory resource in c:\apache\htdocs\index.php on line 4

Warning: Supplied argument is not a valid Directory resource in c:\apache\htdocs\index.php on line 4

a takhle to pokračuje dalších x řádků.

Ta funkce vypadá takto :

<?php
$dir = "/pages";
$dh  = opendir($dir);
while (false !== ($filename = readdir($dh))) {
    $files[] = $filename;
}

sort($files);

print_r($files);

rsort($files);

print_r($files);

?>


Děkuji za pomoc :)
juriad
Profil
"undefined function scandirt()"
Je tam překlep v názvu funkce scandir. Pokud skutečně máš tak staré PHP, máš nějaký důvod, neupgradovat? Verzi PHP zjistíš třeba:
<?php echo 'Current PHP version: ' . phpversion(); ?>

Cesta, kterou zadáváš funkci opendir nejspíš má být jen "pages", aby to našlo adresář c:\apache\htdocs\pages. S tím lomítkem to totiž nejspíš hledá c:\pages.
Tato chyba pak způsobí, že se ten adresář neotevře a to způsobí ty další chyby.
Micruss
Profil
Dej to lomítko $dir = "pages/"; (nakonec) jinak taky nechápu, proč tam máš "scandirT"
martanius
Profil
Jo, sry, to scandirT byl jen muj preklep.

Jen, ted me napadlo jestli chci pouzit tu spravnou funkci. Rád bych totiž aby to ve výsledku vypadlo jako tohle :

http://www.kfilmu.net/dvdobaly.php?sekce=vyber&pismeno=a, takový seznam s hypertextovými odkazy.

Děkuji za odpovědi.
juriad
Profil
foreach (scandir('pages') as $file) { # ve $file bude název souboru
  # tyto tři řádky zajistí, že se nebudou zobrazovat soubory . a .. na Linuxu
  # na Windows asi chceš podobnou podmínku pro Thumb.db
  if ($file == '.' || $file == '..') {
    continue;
  }
  # chceš vypsat odkaz <a href="/pages/$file">$file</a>
  echo "<a href=\"/pages/$file\">$file</a>"; # proč zpětná lomítka? Protože uvozovky.
}
martanius
Profil
Super, děkuji.

Ještě kdyby se to nepojmenovalo podle názvu souboru, ale podle té hodnoty v <title> u nalezeného souboru ?

Tzn. že když se ve složce pages nacházejí třeba HTML soubory

auto
autodráha

tak by ten hypertextový odkaz nebyl pojmenován auto.html a autodráha.html, ale podle <title>název</title> u každého souboru ? Potřeboval bych totiž aby tam byla diakritika a mezery.

Mockrát děkuji za odpovědi :)
Keeehi
Profil
Místo scandir("pages") použijte glob("pages/a*").

EDIT: koukám, že se dotaz změnil, nebo jsem to špatně přečetl.
if (substr($file,-5) == ".html") {
    $data = file_get_contents($file);
    preg_match('~<title>(.*?)</title>~i',$data,$matches);
    if (!empty($matches[1])) {
        $name = $matches[1];
    } else {
        $name = $file;
    }
} else {
    $name = $file;
}

echo "<a href=\"/pages/$file\">$name</a>";
martanius
Profil
Můžu poprosit o celý script ? Nějak mi to nejde, buď dělám něco špatně a nebo nevím kam mám ten script vnořit.
Keeehi
Profil
Je to náhrada za řádek 8 v scriptu co posílal juriad v [#5].
juriad
Profil
martanius:
To není úplně dobrý nápad; musel bys prečíst každý soubor a vytáhnout z něj kus textu. Při větším počtu souborů to může být dost výkonově náročné.

  $content = file_get_contents($file);
  if (preg_match('#<title>(.*)</title>#i', $content, $title)) {
          $title = $title[1]; # nalezen; zajímá nás ta část, kterou jsme si označili závorkami
  } else {
          $title = $file; # nenalezen; název souboru postačí
  }
  echo "<a href=\"$file\">$title</a>";

Ale nejsem si jistý, že je to, co chceš. Pokud chceš mít stránku pro každý film, tak se to řeší tak, že se vytvoří jediná stánka a ta zobrazuje informace o tom filmu, který dostane jako parametr. Nevzniká tedy soubor pro každý film zvlášť.


Keeehi:
Nejspíš přeskakuješ. :) K písmenkům se teprve dostaneme. martanius napřed potřebuje zprovoznit obyčejný výpis souborů.
A v tom globu rovnou můžeš kontrolovat koncovku souboru; a asi by to chtělo rozšířit na [aA] (ignorování velikosti) a zobecnit na $_GET['pismeno'] s nějakou ochranou.

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: