Autor Zpráva
TomasJ
Profil
Dobrý den.

Nejsem zrovna začátečník, ale něco se mi občas taky nepovede.
A proto píšu o radu.
Potřeboval jsem si udělat Download souborů, pomocí proměnné(ID) např.
www.adresa.cz/download.php?id=2 , nebo samotnou stránku, kde by byly vypsány soubory, a po kliknutí na některý, by se začal stahovat (já osobně mám radši variantu tuto z důvodu zabezpečení, které je pro mě touto cestou jednodušší):

<form method="post" action="download.php"> 
<input type="radio" name="id" value="1">Soubor 1<br>
<input type="radio" name="id" value="2">Soubor 2<br>
<input type="hidden" name="prava" value="ano">
<input type="submit" value="Stáhnout">
</form>


stránka download.php(u ní mám problém)

mám např.
<?php
if($_POST['prava']=="ano" && $id>0) //zkontroluji, zda ma uzivatel prava, a ID souboru neni mensi nez 0
{
....
}

tady bych potřeboval otevřít soubor a jeho obsah bych chtěl vložit do arraye...
Soubor se jmenuje, dejme tomu paths.txt a obsah by vypadal nějak takto:

"cesta_k_souboru_1.mp3",
"cesta_k_souboru_2.mp3"


Jednoduše bych potřeboval obsah vložit do arraye tak aby vypadal array takto:
$cesty = Array("cesta_k_souboru_1.mp3","cesta_k_souboru_2.mp3");


stačilo by aby platilo, že
$cesty[0] == "cesta_k_souboru_1.mp3"
a
$cesty[1] == "cesta_k_souboru_2.mp3"

Dále jsem k tomu potřeboval přiřadit jména a to by byl soubor names.txt a vypadal by obdobně
jako ten paths.txt ale místo adres k souborům by byly názvy ... jakože:

"jmeno souboru 1",
"jmeno souboru 2"


Ty názvy bych si ale zvládl přiřadit...
Snad jste pochopili co mám na mysli a předem děkuji za vyřešení tohoto mého problému.
Raňajka
Profil *
Snad tě nakopnu. Obsah souboru example.txt:
prvni_soubor_nazev.mp3,druhy_soubor_nazev.mp3
$soubory_pole = explode(',', file_get_contents('example.txt'));

$soubory_pole nyní obsahují názvy souborů. $soubory_pole[0] = prvni_soubor_nazev.mp3, $soubory_pole[1] = druhy_soubor_nazev.mp3.
Joker
Profil
file() - načte soubor po řádcích do pole.
TomasJ
Profil
Raňajka:

Děkuju ale ono je možné, že až budu dělat k souborům jména tak v názvu pro soubor může být obsažena
čárka... může obsahovat čárku a pak by se jméno rozdělilo v půlce. Ale děkuju za snahu :)

Joker:

Takže je lepší když vymažu čárky, z toho obsahu souboru a dám každou adresu na nový řádek? je třeba u toho použít za každou adresou \n pro nový řádek?
Joker
Profil
TomasJ:
Takže je lepší když vymažu čárky, z toho obsahu souboru a dám každou adresu na nový řádek?
Aha, jestli to už máte oddělené čárkami, tak asi raději přes explode, viz Raňajka.
Mně z té ukázky přišlo, že máte každé jméno na novém řádku.
TomasJ
Profil
Joker:

No to už je jedno jestli bude na novém řádku nebo ne... Každopádně explode použít nemohu u toho druhého
souboru, který budu dělat... neboli names.txt a tam by se mohla vyskytnout čárka 2x ...

Třeba takto:

Název k Souboru 1, Interpret - Skladba,
Název k Souboru 2, Interpret - Skladba


Prostě mi nepřijde funkce explode() jako dobrá volba... Všiml jsem si že hodně lidí používá právě tuto funkci
k definování typu souboru, podle koncovky... třeba:

$soubor = explode(".", $path);//v tomto případě mám na mysli že $path = $REQUEST_URI; nebo třeba přímo načtená adresa k souboru(že by si to načetlo název z toho example.txt ...


a pak jen použijí někam do textu:
echo "Soubor je typu ".$soubor[1];


Jenže v tomto je problém, protože cesta k souboru může obsahovat . (teček) více a pak by byla pozice [1] třeba
v půlce názvu. To by pak mohlo vyhodnotit typ jako .dvd kdyby název byl: Moje.dvd.4gb.iso ...
Pro tohle používám filetype(); ale to tu rozebírat nebudu...
Snad jste pochopil, proč chci použít to Vámi zmiňované file();
Joker
Profil
TomasJ:
tam by se mohla vyskytnout čárka 2x
No, musíte mít nějaký jednoznačný způsob oddělení. I když nechcete všechny části, přesto může funkce explode být užitečná- pokud to bude: soubor, skladba, soubor, skladba,... prostě si jen vezmete každou druhou položku.
Horší to je, pokud by se čárka mohla vyskytovat i někde v popisu a podobně... pak jí musíte nějak escapovat nebo použít jiný oddělovač, jinak ten soubor automaticky nezpracujete.

Všiml jsem si že hodně lidí používá právě tuto funkci k definování typu souboru (...)
Ano, to co uvádíte je špatně. Jak logicky špatně, tak i vcelku nesmyslné použití explode().
1. Přípona není text mezi první a druhou tečkou, ale text za poslední tečkou
2. Není třeba rozsekat název souboru podle teček, takže není nutné používat explode. Na zjištění textu za poslední tečkou stačí substr + strpos.
TomasJ
Profil
Joker:
No radši bych vyzkoušel tu fci file(); ...
Jen jsem chtěl vědět zda má být za textem \n aby funkce začla číst znovu, další řádek ...
TomasJ
Profil
A ještě bych ocenil kdyby byl někdo tak laskavý a napsal mi jaké parametry jsou pro file() nutné ...
Stačí jen
$soubor = file('example.txt');
?
Joker
Profil
TomasJ:
Jen jsem chtěl vědět zda má být za textem \n aby funkce začla číst znovu, další řádek
Ano.

A ještě bych ocenil kdyby byl někdo tak laskavý a napsal mi jaké parametry
Od toho je přece manuál, stačí tady v kódu kliknout na zvýrazněný název funkce.
edit: Plus jsem na manuál odkazoval už v #3
TomasJ
Profil
Joker:
Děkuji za radu s tím použitím funkce file();, vše funguje jak má. Moc děkuji.

„Jen jsem chtěl vědět zda má být za textem \n aby funkce začla číst znovu, další řádek“
Ano.

Zkoušel jsem to s \n i bez ... zjistil jsem že tam \n vůbec být nemusí, naopak ještě se pak tváří, že patří k cestě souboru.

No takže jak jsem to vyřešil(pro ty, kteří budou chtít načítat obsah stejným způsobem jako já):

Struktura souboru, ze kterého mají být načteny adresy (pojmenuji example.txt ... nečekaně):

cesta_k_soubou_1.mp3
cesta_k_souboru_2.mp3


Teď samotný extrémně dlouhý(ironicky) kód:
<?php
$cesty_k_souborum = file('example.txt');
?>


to je vše.

Abych zjistil, zda funguje správně přidal jsem ke kódu ještě tento a nechal jsem vypsat všechny řádky s pomocí funkce for()
<?php
for($a=0;$a<strlen($cesty_k_souborum);$a++)
{
echo "Řádek číslo ".$a+1. " - Obsah řádku: ".$cesty_k_souborum[$a]."<br>"; // to $a+1 je kvůli tomu aby se nevypsal řádek číslo 0 (drobnost)
}
?>


Výsledek mi opravdu ukázal všechny řádky...
Takže Děkuji Jokerovi za dobrou radu, ale i Raňajka za snahu.
Snaha se přece taky cení.
Moc děkuji.

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:

0