Autor Zpráva
Tomáš123
Profil
Zdravím,
Chcel by som na svojej stránke umožniť pridávanie informácii bez nutnosti prístupu k súborom webu, avšak mám problém so základnou funkčnosťou...Ako by vyzeral skript, ktorého jedinou úlohou je po stlačení tlačítka zobraziť text z textového poľa na danom mieste? Nechcem od nikoho celý zabezpečený kód! Zaujíma ma vlastnými slovami vysvetlená problematika fungovania, či nejaký kvalitný internetový zdroj, ktorý som sám nenašiel...

Vopred veľmi pekne ďakujem za odpovede.
Joker
Profil
Tomáš123:
Skript ten nový text uloží do nějakého úložiště (databáze, soubor) a zobrazovací skript data z toho úložiště zobrazí na příslušném místě.
Tomáš123
Profil
Joker:
Skript ten nový text uloží do nějakého úložiště
Takže napríklad jedným skriptom pomocou metódy POST uložím text do nejakého textového súboru...

zobrazovací skript data z toho úložiště zobrazí na příslušném místě.
...pomocou include?
juriad
Profil
Raději než include použij:
echo htmlspecialchars(file_get_contents('soubor.txt'));

Do souboru se ukládá pomocí funkce file_put_contents.
Joker
Profil
Tomáš123:
„Skript ten nový text uloží do nějakého úložiště“
Takže napríklad jedným skriptom pomocou metódy POST uložím text do nejakého textového súboru...
Je to možné tak udělat.

„zobrazovací skript data z toho úložiště zobrazí na příslušném místě.“
...pomocou include?
V té nejprimitivnější variantě by to fungovalo, ale je to bezpečnostní riziko, protože include provede i případný PHP kód vložený do toho souboru.
Kód podle juriad [#4] by šel použít pro vstup od návštěvníků, zabrání se interpretování HTML značek (třeba vstup „<div>“ zobrazí text „<div>“, místo aby otevřel HTML značku <div> a tím nejspíš rozhodil celý zbytek stránky).
Kdyby to mělo být třeba pro správce webu s možností zadávat i HTML, šlo by vynechat to htmlspecialchars. Zadání správného vstupu by pak bylo na zodpovědnosti toho, kdo text píše.
Tomáš123
Profil
juriad:
Raději než include použij:
Nefunguje mi to... Nikdy som s tým nepracoval a tak som skúsil vytvoriť testovací súbor, ktorý obsahuje iba jediný príkaz:
<?php
    echo htmlspecialchars(file_get_contents('file.txt'));
?>

...pričom súbor 'file.php' je na tej istej úrovni...

Joker:
V té nejprimitivnější variantě by to fungovalo, ale je to bezpečnostní riziko,
Samozrejme nebudem na internete publikovať stránky s takýmto zabezpečením... Iba som chcel pochopiť problematiku a vytvoriť jednoduchý príklad.
Joker
Profil
Tomáš123:
Nefunguje mi to
To znamená co? Co to dělá/nedělá? Vypíše to nějakou chybu?
Nechte v nastavení PHP na testovacím počítači vypisovat všechny chyby, nebo na začátek skriptu dejte
ini_set('display_errors', '1');
error_reporting(-1);

Poznámka, toto nastavení je jen pro vývoj, ne pro ostrý provoz.
Tomáš123
Profil
Joker:
Co to dělá/nedělá?
Aj po úprave:
<?php
    ini_set('display_errors', '1');
    error_reporting(-1);
    echo htmlspecialchars(file_get_contents('file.txt'));
?>
...skript stále mlčí a nič nevypisuje (ani chybovú hlášku ani obsah)...

Joker, juriad:
Čítal som obsah juriadovho [#4] odkazu, no nepochopil som, ako to funguje a ako pomocou toho môžem uložiť text do súboru... Napísali by ste mi, prosím, jednoduchý príklad?
Tomáš123
Profil
Joker:
Trochu som sa s tým pohral, výsledok je dostupný na adrese http://www.iamampersand.hostujem.sk/

Mám však dva problémy:
1.) Jeden príspevok stále nahradí druhý;
2.) Neexistuje história... Za normálnych okolností by tam bol príspevok natvrdo a navždy pridaný...
Marschmallow
Profil
Tomáš123:
Zkus tohle: komentare.zip :)
Tomáš123
Profil
Marschmallow:
Ďakujem, niečo také som potreboval, nie je to zložité a je tam zachytené jadro funkčnosti. Snáď si z toho niečo zoberiem :-)
Tomáš123
Profil
Ahoj, opäť mám problém... Toto je môj PHP súbor, ktorého hlavnou úlohou je uložiť získané údaje do textového súboru data.txt. Skript je skoro identický s ukážkou, ktorú poslal Marschmallow a vyzerá takto:
<?php
$name = htmlspecialchars($_POST['name']);
$text = htmlspecialchars($_POST['text']); 
$data = file_get_contents('data.txt');
file_put_contents('data.txt', 'Name: '.$name.'<hr>'.$text.'<hr>'.$data);
?>
1.) Hodnoty sa posielajú metódou POST;
2.) Hodnoty atribútov name v formulári a spracovaní sa zhodujú;
3.) Súbor data.txt existuje;
4.) Problém je v ukladaní do súboru data.txt.

Vidíte tam niekde chybu?

Ďakujem za pomoc :-)
Tomáš123
Profil
Po tom, čo som pôvodný Marschmallowov súbor vložil na hosting, nefungoval (presnejšie povedané, neukladal dáta do textového súboru)...Skúsil som teda svoje súbory z hostingu vložiť na localhost a čudujte sa svete, všetko pracuje ako má... Máte s takýmto správaním skúsenosti? Mám si zriadiť nový hosting ak chcem, aby mi to fungovalo?

Ďakujem za prípadné odpovede.
jenikkozak
Profil
Tomáš123:
Mám si zriadiť nový hosting ak chcem, aby mi to fungovalo?
Jistě ne. Napsání takového skriptu zabere maximálně pár desítek minut. Škoda peněz za další hosting.
Marschmallowo řešení může vypadat lákavě, protože ti ho naservíroval až pod nos, ale zas tak geniální to není. Takže půjdeme trošku těžší, ale zato spolehlivější cestou. A sice tou, že si přečteme Jokerovy a juriadovy příspěvky a zkusíme s jejich pomocí vytvořit vlastní řešení.
Tomáš123
Profil
jenikkozak:
Takže půjdeme trošku těžší, ale zato spolehlivější cestou.
Teda mi pomôžete poskladať lepší skript?

A sice tou, že si přečteme Jokerovy a juriadovy příspěvky a zkusíme s jejich pomocí vytvořit vlastní řešení.
Príspevky som si prečítal ešte raz a zastavil som sa na nepochopení funkcie file_get_contens... Viete mi na nejakom jednoduchom príklade vysvetliť ako táto funkcia funguje a ako sa zapisuje do kódu?

Na prvom príklade som nepochopil zvýraznené riadky:
<?php
$file = 'people.txt';
// Open the file to get existing content
$current = file_get_contents($file);
// Append a new person to the file
$current .= "John Smith\n";
// Write the contents back to the file
file_put_contents($file, $current);
?>

1.) Prečo tá bodka pred "="?;
- Prečo /n na konci riadku?;
2.) Prečo je v zátvorke ($file, $current)? Prečo nestačí iba $file? Veď ide o prepísanie pôvodného súboru...Alebo tento riadok hovorí: „Prepísanie súboru $file súborom $current“?

Možno som to nepochopil správne, ale príklad mi hovorí:
1.) Skript otvorí súbor;
2.) Skript načíta obsah súboru;
3.) Skript pridá do súboru nový riadok;
4.) Skript uloží pozmenený obsah;

Ak by som chcel niečo podobné s komentármi, ako by to pracovalo, nie je to zbytočná okľuka najprv súbor načítať, upraviť, uložiť? V súčasnosti mi skript iba pridáva riadky do súboru...

Dal by sa tento komentárový systém vytvoriť pomocou ukladania do poľa (array)?

Keďže som položil dosť veľa otázok, chcem poďakovať každému, kto aspoň jednu zodpovie...
juriad
Profil
1) .= je operátor připojení; jde v zásadě o zkratku za
$current = $current . "John Smith\n";
Jde v zásadě o obdobu operátoru += pro přičítání.

"\n" je znak nového řádku. Obecně zpětné lomítko následované písmenem v kontextu uvozovkového řetězce je náhrada za speciální znak.


2) Ta funkce potřebuje dva parametry - soubor do kterého bude ukládat a řetězec, který má uložit.


Ve skutečnosti funkce file_get_contents provede:
1) otevře soubor, jehož jméno dostane jeko svůj první (obvykle jediný parametr)
2) načte obsah souboru
3) zavře soubor
4) vrátí načtený obsah

Funkce file_put_contents provede:
1) vytvoří prázdný otevřený soubor, jehož název dostane jako první parametr, pokud neexistuje
nebo, pokud existuje, ho otevře a jeho obsah odstraní
2) zapíše do otevřeného souboru nový obsah, který dostane jako druhý parametr
3) zavře soubor

Tedy ten skript přečte obsah souboru, který uloží do proměnné $current.
Pak k tomu zapamatovanému obsahu připojí na konec "John Smith <a odřádkování>".
Zapíše nový obsah do souboru, čímž původní obsah přepíše.
jenikkozak
Profil
Tomáš123:
Z tvých dotazů mám pocit, že jsi vynechal základy PHP. Bez jejich znalosti se moc daleko nedostaneš. Začít můžeš četbou webu pehapko.cz.
Kubo2
Profil
Tomáš123:
Možno som to nepochopil správne, ale z príklad mi hovorí: (...)
Pochopil si to úplne správne.

V súčasnosti mi skript iba pridáva riadky do súboru...
To je jeho náplňou.

nie je to zbytočná okľuka najprv súbor načítať, upraviť, uložiť?
Je, aj preto existuje tretí parameter funkcie file_put_contents( ).

<?php

// názov súboru, s ktorým pracujeme
$file = 'people.txt';

// nový človek do súboru
$new = "John Smith\n";

// zapíšeme nový riadok do súboru
file_put_contents($file, $new, FILE_APPEND); 

Prečo tá bodka pred "="?;
Samotné rovnítko = je takzvaný operátor priradenia tj. nahradí obsah premennej (ľavý operand) výsledkom výrazu na pravej strane.
Rovnítko s bodkou .= pre ním je odvodenina operátoru pre spájanie reťazcov (samotná bodka .), ktorý namiesto prepísania pôvodného textového obsahu v premennej na ľavej strane ku koncu tohoto reťazca pripojí reťazec, ktorý je výsledkom výrazu na pravej strane a vzniknutý reťazec uloží do premennej.

- Prečo /n na konci riadku?;
Nie /n, ale \n. Nazýva sa to úniková sekvencia (escape sequence). Bola zavedená pre zápis špeciálnych znakov do reťazca. Za spätné lomítko je možné napísať sekvenciu (postupnosť) znakov, ktoré sa podľa príslušných pravidiel vyhodnotia ako nejaký znak, ktorý má v danom kontexte špeciálny význam.

\n však na v PHP nie je dobrý príklad, pretože zapísať
$novýRiadok = "\n";
je takmer ekvivalentné k
$novýRiadok = "
";

Lepším príkladom preto budú úvozdovky ohraničujúce reťazec.
$úvodzovka = """; spôsobí chybu.
$úvodzovka = "\""; uloží do premennej $úvodzovka zloženú úvodzovku (úniková sekvencia \" sa nahradí znakom zloženej úvodzovky ").

Prečo je v zátvorke ($file, $current)? Prečo nestačí iba $file?
Prvý argument je názov súboru do ktorého sa zapisuje, druhým argumentom je nový obsah tohoto súboru. V programovaní sa nemôžeš spoliehať na to, že si interpret/prekladač/behové prostredie programu bude niečo domýšľať a spoliehať sa na to v niektorých exotických prípadoch, keď je to možné, ale nie nevyhnutné, nie je dobrá programátorská praktika.

Dal by sa tento komentárový systém vytvoriť pomocou ukladania do poľa (array)?
Tento nápad som pochopil po svojom a musím teda odpovedať, áno, dalo by sa to nasimulovať. Ale to by bolo celkovo o dosť zložitejšie, minimálne do takej úrovne, že abstrakciu by si si zatiaľ nevedel napísať sám.
Tomáš123
Profil
juriad:
Ďakujem za vysvetlenie, mám však ešte jednu otázku: Ako by som mohol pomocou funkcie file_get_contens a file_put contens vytvoriť komentárový systém? Skúsim napísať v bodoch môj nesčítaný pohľad na vec:
1.) Vyplním a odošlem HTML formulár;
2.) Na strane servera sa pre pohodlnejšiu manipuláciu hodnoty odoslané formulárom priradia do premenných;
3.) Napíše sa podmienka, ktorá zistí, či boli formulárové polia vyplnené;

3. true:
3.1.) Skript načíta súbor, do ktorého sa majú komentáre ukladať;
3.2.) Neviem ako do súboru pridá nový reťazec;
3.3.) Uloží a nahradí pôvodný súbor;
3.4.) Pomocou htmlspecialchars alebo jednoducho pomocou include sa vypíše obsah súboru, v ktorom sú uložené komentáre.

3. flase
3.1.) Vypíše sa chybová hláška, poprípade zobrazí formulár...

jenikkozak:
Z tvých dotazů mám pocit, že jsi vynechal základy PHP.
Nejaké základy mám, ale darmo, že niečo viem, keď to neviem použiť vo vlastnom skripte.

Kubo2:
Lepším príkladom preto budú úvodzovky ohraničujúce reťazec.
Asi neviem všetky základy, ale o tomto som vedel...iba som nevedel, že lomítko pred n sa tiež vzťahuje do tejto kategórie...

Ale to by bolo celkovo o dosť zložitejšie, minimálne do takej úrovne, že abstrakciu by si si zatiaľ nevedel napísať sám.
Takže tadiaľto cesta nevedie...
Tomáš123
Profil
Vyrobil som si skript (ak sa to tak dá nazvať):
<?php
    $name = ($_POST['name']);
    $text = ($_POST['text']);
    $file = ('data.txt');
    $new .= $text;
    file_put_contents($file, $new, FILE_APPEND);
?>
<?php include 'index.php';?>

Ako tak funguje, teda vypíše do stránky to, čo napíšem do textového poľa pre komentár, ale hádže poznámku o nedefinovanej premennej $new. Je mi jasné, že je nedefinovaná, ale ako ju mám definovať? A ako mám upraviť skript, aby zobral aj meno?

Kubo2:
file_put_contents($file, $new, FILE_APPEND);
Čo je úlohou zvýraznenej časti kódu?

Ešte doplňujem, že ani táto verzia skriptu na hostingu nefunguje rovnakým spôsobom ako predtým.
jenikkozak
Profil
Tomáš123:
Nejaké základy mám
Nepochybně. Ale očividně ne v PHP. Pročti si tu učebnici.

Čo je úlohou zvýraznenej časti kódu?
Říká, že máš zkusit kliknout na ten odkaz a podívat se, jestli tam není ten parametr funkce popsán. Určitě je.
Kubo2
Profil
Tomáš123:
hádže poznámku o nedefinovanej premennej $new. Je mi jasné, že je nedefinovaná, ale ako ju mám definovať?
Operátor pre spájanie reťazcov (.=) funguje tak, že si z premennej uvedenej na ľavej strane operácie vezme/prečíta jej obsah, pripojí na jeho koniec reťazec na pravej strane operácie a celé to uloží do premennej na ľavej strane. PHP ti vypisuje poznámku preto, lebo nenašlo v pamäti nijakú premennú s identifikátorom new a teda nemá z nej ako čítať.

V nejakom ozajstnom programovacom jazyku by ti to neprešlo ani prekladom, ale PHP ti namiesto hodnoty tej premennej iniciatívne podstrčí špeciálnu hodnotu null, vypíše poznámku o použití nedefinovanej premennej, premennú definuje a inicializuje ju hodnotou vzniknutou zo spojenia null a reťazca na pravej strane operácie (null nemá žiadny efekt).

Túto chybu najlepšie odstrániš inicializovaním premennej pred jej prvým použitím tj. čítaním jej hodnoty:

<?php
$new = ""; // alebo $new = null;
// ...
$new .= $text;

alebo použitím operátora priradenia namiesto operátora pre spájanie reťazcov:

<?php
// ...
$new = $text;

alebo použitím rovno premennej $text namiesto inicializácie ďaľšej premennej $new.

<?php
file_put_contents($file, $text, FILE_APPEND);

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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