Autor Zpráva
Powerack
Profil
Zdravím, mám takový problém. Jsem začátečník a tak sekám chyby jednu za druhou a asi se tu uvidíme celkem často.

Potřebuji předávat řetězec z index.php pomocí url souboru show.php. Momentálně to mám vyřešeno následovně:

<a href="show.php?soubor=clanky/-prvni.html">Prvni</a>
<a href="show.php?soubor=clanky/-druhy.html">Druhy</a>


a v souboru show.php mám tento kód:

<?PHP
$document = file_get_contents($_GET['soubor']);
$lines = explode ("\n", $document);
foreach ($lines as $newline){
echo $newline . '';
}
?>

což ale nevyhovuje mým potřebám. Rád bych předával pouze samotný název souboru bez cesty a přípony. Všechny soubory jsou v adresáři clanky. Databázi a WP nemám rád a nehodlám ani dál používat.
N71
Profil *
Tvůj program obsahuje tři chyby ve čtyřech instrukcích. A první je dokonce hrubá.

Nechceš si přečíst napřed pár nějakých publikací o PHP? Návrhový vzor pro načítání obsahu podle URL parametrů v nich určitě bude zastoupen.
Powerack
Profil
N71:
Nechceš mi náhodou poradit správný zápis? Už jsem psal, že jsem začátečník. Pomohl by mi i kód celého řešení namísto upozorňování na chyby, které jsi ani nespecifikoval.

Mimochodem jak je možné, že při volání to normálně funguje? Mám to takhle naostro na webu a problém žádný.
Tomášeek
Profil
Powerack:
Už jsem psal, že jsem začátečník.
Správný moment otevřít učebnici/tutoriál.

Pokud pominu nebezpečnost (neošetření) tvého řešení, pak nechápu ani jeho logiku. Načtu si do proměnné obsah souboru, rozeberu ho na řádky a každý řádek pak samostatně vypíšu? Jako fakt? Hledáš místo toho include. Pak tam máš nešotření proměnné (zkus si otevřít show.php bez parametru).

Pokud je stránek pár, pak nejsnažší na pochopení (a i bezpečné) bude asi toto.

<a href="show.php?soubor=prvni">Prvni</a>
<?php
if (isset($_GET['soubor'])) {
    switch ($_GET['soubor']) {
        // zde si nadefinuj jednotlive stranky k zobrazeni
        case 'prvni':
        case 'druhy':
        case 'treti':
            include 'clanky/' . $_GET['soubor'] . '.html'; // zadne dalsi osetreni neni treba, retezce jsou definovane a ciste
            break;
        default:
            // v URL je pozadavek na neexistujici soubor, nebo soubor, ktery sice existuje, ale nechces ho zobrazit
            // bud include '404.html' nebo cokoliv jineho, napr. ignorance pozadavku a nezobrazeni niceho (pak je default vetev k nicemu a netreba ji uvadet).
    }
}
?>

a asi se tu uvidíme celkem často.
Být začátečník není omluva, pokud neprojevíš dostatek snahy. Fakt si ale do začátku poříď knihu, nebo přečti nějaké základy, třeba pehapko.cz.
Powerack
Profil
Tomášeek:
Odpověď na otevření show.php máš tady: prntscr.com/r3mmjx

Zdroják: prntscr.com/r3mom5

A pochopitelně to zkouším napřed v domácích podmínkách, než to pustím do světa...

Není zbytečné definovat stránky dvakrát, když je volám z index.php nebo show.php? V obou souborech je stejné menu, liší se jen zobrazením defaultní stránky s články, tzn index.php vyhledá a vypíše seznam-clanku.html, který je vlastně textový soubor s několika málo html příkazy na odsazení textu a odkazy na články. Každý článek je pak stejně osekaný html (bez kódování, bez hlavičky, bez těla - protože to už v sobě má stejně, jako volání stylu jeden z dříve jmenovaných souborů). Rád bych to udělal ještě lépe, aby index byl co možná nejmenší a data se načítala do každé části webu z jiného zdroje. Ale to už bych toho asi chtěl trošku moc a rovnou mohl zůstat u WP. Ten mi ale co se rychlosti načítání nevyhovuje, už je to přeplácané všemožnými pluginy atd a do administrace lezu 10 vteřin. To radši toto... Jen vyřešit stránkování a podobné věci.
Powerack
Profil
Tak nakonec jsem na to šel cestou příkazu include, jak radil Tomášeek. Možná je to, ehm, trochu nepraktické, ale výsledný index vypadá takto:

<!doctype html>
<html>
<head>
<title>Název stránek</title>
<meta charset="utf-8" />
<!--[if IE]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link rel="stylesheet" href="data/style.css" type="text/css" />
</head>
<body>
<div id="pagewidth">
<div id="header" align="center"><img src="data/logo.png">
<div align="center">
<?php
include "./data/hlavicka.html"
?>
</div>
<p></p></div>




<div id="wrapper" class="clearfix">
<div id="twocols">
<div id="maincol">


<?php
if (empty($_GET['clanek'])) {
    $file = "./data/seznam-clanku.html";
    } else {
    $file = "./clanky/" . rawurlencode($_GET['clanek']) . ".html";
}
if (!file_exists($file)) {
    $file = "./data/404.html"; // Při chybě je jasné, co se stane.
}
include $file;
?>


</div>

<div id="rightcol" align="center"> <h2>Odkazy</h2> 
<?PHP
include "./data/odkazy.html"; //Pravý "sidebar" s menu.
?>
</div>
</div>


<div id="leftcol" align="center"> <h2>Reklama</h2>
<?PHP
include "./data/reklama.html"; // Levý "sidebar" s reklamou.
?>
</div>
</div>


<div id="footer"><center><strong><a href="http://mikro.powerack.cz" target="_blank">&copy2020 Powerack</a></strong></center>
<?php
include "./data/paticka.html" //Patička tu není celá, ten odkaz se mi tam prostě nechtělo nacpat.
?>

</div>
</div>
</body>
</html>

Já vím, že je v tom ještě dost chyb, ale funguje to :-) Nerad se zbavuju svých návyků a tam, kde nechci dělat styl a chci mít obsah zarovnaný na střed prostě používán <center>Obsah</center>.

Možná by bylo dobré převést stávající html v include do php, ale teď řeším jiný problém a to stránkování. Jak jsem řekl, WP a tedy ani databáze mi na hosting už nesmí. Napadá někoho, jak stránkovat například po pěti článcích a jak je případně formátovat?
N71
Profil *
Include není vhodný konstrukt pro vkládání statického obsahu (bude se vyhodnocovat jako PHP bez ohledu na koncovku souboru). V tomto případě radši readfile().
Funkce rawurlencode() neslouží k sanitaci cest ve filesystemu (je na prametry a části URL). V tomto případě radši basename().

Opravdu si pořiď nějakou literaturu. Je to dobře míněná rada, ušetří ti spoustu času i problémů. PHP je jazyk velmi tolerantní k chybám a špatným postupům, není vhodný pro samouky bez teoretických znalostí.
Keeehi
Profil
Powerack:
O databázích máš falešné předsudky. Ano, Wordpress bývá pomalý protože když si tam někdo naseká tunu různých pluginů, tak to ani jinak dopadnout nemůže. Pomalost WP je daň za jeho univerzálnost, kde si jakýkoli neprogramátor může vytvořit svůj web. Ale databáze za to nemůže. Když si budeš psát správné dotazy sám, bude to lítat že ani nebudeš vědět jak.
Powerack
Profil
N71:
Tedy že to zpracuje vše jako PHP mi opravdu nevadí. Spousta souborů v tom adresáři má PHP obsah, takže je to naopak žádoucí. Kontrolování existence souborů a tím znemožnění spuštění jiného skriptu by možná mohl být problém. Ale jak jsem řekl, netrápí mně to. Není to žádný firemní web, jen můj osobní kousek místa na webu, takže proč by mně mělo trápit, že mi na něm bude někdo chtít spouštět skripty nebo ho napadnout. Vše mám zálohované, databázi to nemá, nikam se nepřihlašuje. Tak na co další zbytečnosti takové... :-)

Keeehi:
Mám web běžící na WP, dokonce několik takových. Vždy jsem měl rád jednoduchá řešení a tím, že jsem přešel z HTML na WP, jsem dost zlenivěl a místo abych se učil dál, jsem si vyťukával články v TinyMCE. S tím je konec :-D Univerzálnost WP mi může být putna. Dostanu z něj všechny články a ten web i s databází půjde pryč. Beztak mi tam lezli hlavně spamboti. Takhle budou mít po ptákách.
Tomášeek
Profil
Powerack:
Vždy jsem měl rád jednoduchá řešení a tím, že jsem přešel z HTML na WP, jsem dost zlenivěl a místo abych se učil dál, jsem si vyťukával články v TinyMCE. S tím je konec
Tak good luck třeba s takovou banalitou, jako je stránkování :-)
Keeehi
Profil
Powerack:
Ale jo, to chápu že se ti nelíbí wordpress. Ovšem stále nějak neruším, co ti vadí na databázi?
Powerack
Profil
Tomášeek:
Stránkování nebude potřeba, tolik článků, abych tím zaplnil třeba 200 řádků na stránku opravdu nenapíšu. Mám už rozdělen obsah na měsíce, teď ještě hrávám články.

Zajímalo by mně něco takového, jako je čtení obsahu souborů a podle toho, co je na začátku řádku, nebo třeba pokud je někde určitý symbol ASCII na to místo nacpat tag. Předpokládám, že uzavřené tagy se nepočítají (i v HTML to tuším je tak, že uzavřený tag, tedy jen </tag> jako by neexistoval), takže stačí myslitelné nastrkat za text.

Keeehi:
Řekněme že je to tak, co tabulka nebo položka v ní, to zdržení. A já chci mít web opravdu rychlej. Tabulka se prohledává, soubor se vypíše celý naráz téměř bez zdržení. Navíc při takovém nízkém objemu dat asi nemá smysl do toho cokoliv cpát ne? Velikost webu bez obrázků je asi 150 kB... S obrázky 480 MB.
Tomášeek
Profil
Powerack:
i v HTML to tuším je tak, že uzavřený tag, tedy jen </tag> jako by neexistoval
Eh? Cože? Krom základů PHP si nastuduj základy HTML.

Tabulka se prohledává, soubor se vypíše celý naráz téměř bez zdržení.
Načtení souboru bude téměř vždy pomalejší, než nalezení záznamu z databáze. Můžeš si to změřit.
Keeehi
Profil
Řekněme že je to tak, co tabulka nebo položka v ní, to zdržení.
No, ani ne. Nebo přesněji, ne tak jak si ty myslíš. Jedna určitá položka se dá najít v logaritmickém čase. Což přibližně znamená, že kdyby tabulka měla milion záznamů, zkontroluje se jich asi tak 20. Což není mnoho. Naopak soubory ve složce se prohledávají sekvenčně. Takže pokud bys jich tam měl milion (což nepůjde, jelikož by se to nelíbilo souborovému systému) tak na načtení jednoho z nich bys v průměru potřeboval projít jména 500 000 z nich. Další věcí je uložiště. Databáze je na běžícím stroji uložená v paměti, která je řádově násobně rychlejší než pevný disk. Klasické pevné disky mají odezvu řádově 5-10ms. RAM tak 15ns. Což je tak tisíckrát méně. Doufám, že je z toho vidět že databáze vůbec pomalé být nemusí. Jasně, dá se to výkonově zmršit špatným návrhem tabulek, ale to už není chyba databáze ale programátora.
Důležité je však říci, že v reálu to je ještě trochu jinak. Ono do toho vstupuje spousta jiných vlivů. Jako například, zda ten webhosting používá klasické HDD nebo SSD, co tam je za souborový systém (každý má jinou režii), databáze mají zase nějakou režii při přípravě dotazu a je toho mnohem a mnohem více. Důležité je, jak to nakonec trvá v reálu. A reálně dotazy do databáze mi běhají tak za 1ms ty primitivní a do 10ms ty trochu složitější. Za tak krátkou dobu nejsi fyziologicky schopný ani mrknout okem. Takže myslím, že výkon databází je na tak dobré úrovni, že tě vůbec nemusí trápit, jak rychlé jsou a jestli jsou rychlejší a nebo pomalejší než soubory.
Powerack
Profil
Tak to řeknu jednoduše. WP a jakékoliv tabulky prostě NECHCI.

Nudí mně pořád dokola vysvětlovat proč. Hledám tu pomoc s určitými problémy, ne poučení o tom, co je podle vás lepší.
Přišel jsem sem, protože mně zajímají řešení problémů bez tabulek a dalších zbytečností kolem.

Na testovacím webu si hraji s editory, které by se daly použít bez databáze. Chci dát návštěvníkům možnost se projevit.
V úvahu připadají dva, které to umožňují: ckeditor a tinymce. Ale jak z nich dostat data do souboru?
Postupoval jsem dle tutoriálů na youtube - obvykle jde o návody pro starší verze, ale měly by fungovat.
tinymce bylo větší zlo, tak jsem sáhnul po ckeditor 4. Máte s tím někdo zkušenosti?
Na webu sice je něco na způsob návodu, ale když se to pokusím implementovat, vyhodí to na mně chybu:

Undefined index: editor in C:\xampp\htdocs\mikro\komentare\napsat.html on line 19

Přitom kód by měl být přesně dle návodu takovýto:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="./data/ckeditor/ckeditor.js"></script>
</head>

<body>

<form>
<center><textarea id="editor"></textarea></center>
<center></center>
</form>
<script>
CKEDITOR.replace('editor')
</script>

<?php
    $editor_data = $_POST[ 'editor' ];
?>

</body>
</html>

Tohle by mělo vypsat obsah do stránky, ale nedělá to nic. Uložit to pochopitelně také nejde.
N71
Profil *
Keeehi:
Naopak soubory ve složce se prohledávají sekvenčně.
Pokud hledáš podle názvu, tak ne. Běžné filesystémy indexují soubory v adresářích pomocí vyvážených binárních (nebo podobných) stromů. Bude to asi pomalejší než vytažení záznamu z DBMS, ale ne o tolik.

Powerack:
Tak to řeknu jednoduše. WP a jakékoliv tabulky prostě NECHCI.
Liboli. Proč teda lezeš na fóra pro pomoc? Zahrab se do těch svých bastlů, k tomu nikoho nepotřebuješ.
Tomášeek
Profil
Powerack:
obvykle jde o návody pro starší verze, ale měly by fungovat.
Podle čeho soudíš? Implementace může být odlišná.

Tohle by mělo vypsat obsah do stránky
Nemělo. $_POST['editor'] není definovaná, neexistuje. Říká ti to i chybová hláška. Tak kde je problém, čemu na ní nerozumíš?

Jinak doplním, že kromě této jedné syntaktické chyby vidím v tom kódu více chyb logických, proč to nezobrazuje nic. Minimálně 3, přičemž každá z nich způsobuje, že se nic nevypíše. A se ti něco podaří vypsat, tak si zkus refreshnout, nevidím, že bys text někam ukládal, jen se ho snažíš (na mnoho způsobů blbě) vypsat.
Powerack
Profil
Mezitím, co jste mně tu kritizovali pro mé názory (jistě oprávněně :-D) jsem si to napsal sám.

<?php
    if(isset($_POST['textdata']))
    {
        $data=$_POST['textdata'];
        $fp = fopen('komentare/podclanek-srot.html', 'a+');
        fwrite($fp, $data);
        fclose ($fp);
    }
?>

Díky za pomoc. Vlastně ne, díky sobě a panu gůglovi :-D

Spíš mi poraďte, jak ten samý soubor, pokud existuje, do toho formu nacpat.
lionel messi
Profil
Powerack:
Vlastně ne, díky sobě a panu gůglovi

Tak ti teda prihodím jeden tip pre pána Gůgla. Prečítaj si niečo o atomicite operácií v PHP, funkcii flock a podobne, pretože tvoj kód vôbec nerieši situáciu keď jeden užívateľ zavolá fopen, druhý užívateľ vzápätí na ten istý súbor fwrite a vzápätí prvý užívateľ svoj fwrite.

Dobrý článok v češtine napísal aj Jakub Vrána Různé způsoby psaní kódu, teba bude najväčšmi zaujímať časť od poslednej ukážky kódu.
Powerack
Profil
To se nikdy nestane.
lionel messi
Profil
Powerack:
To se nikdy nestane.

Nechcem byť drzý, ale úprimne si ma pobavil, pretože som iba načrtol tipy, ako to spraviť lepšie v rámci ukladania do súborov. Zdá sa mi, že týmto ďalšia debata stráca zmysel.
Keeehi
Profil
Powerack:
Už je to delší dobu, ale byl tady taky jeden takový expert, jako jsi ty. Věděl stejné nic, jako ty, ale na všechno měl strašně vyhraněný názor a vždy věděl co je úplně nejlepší, i když to byla úplná krávovina. Také chtěl optimalizovat výkon své aplikace pomocí souborů a databáze odmítal, protože on to přeci ví nejlépe. Uměl toho o trochu více než ty, ale ne o moc. Na jméno si dnes ale bohužel nevzpomínám. Hodně mi ho však připomínáš. Až si říkám, jestli to náhodou nejsi ty a nevrátil jsi se. Pokud je to tak měl by ses nad sebou zamyslet, protože tvé znalosti jdou od desíti k pěti. Ať je to tak nebo tak, dopadne to stejně. Pokud razantním způsobem nezměníš svůj přístup, prostě tě tu postupně začnou všichni ignorovat a ty půjdeš otravovat někam jinam.

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