Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Daniel Vítek:

Zdravím mám zase jeden problémek :D
vytvářím web,zaměřený na vtipy - potřebuji rozřazení do kategorií...
pridat.php (hlavičku vypustím)

<h2>Přidat vtip !</h2>
  <form action="pridej.php" method="post">
  <textarea name="vtip" rows="20" cols="60"></textarea>
  Tvoje username <input type="text" maxlength="15" name="username"><br>
  <select title="Vyber...">
  <option name="kategorie" value="../vtipy/kategorie/blondynky/blondynky.txt">Blondýnky</option>
  <option name="kategorie" value="../vtipy/kategorie/doktori/doktori.txt">Doktoři</option>
  <option name="kategorie" value="../vtipy/kategorie/opilci/opilci.txt">Opilci</option>
  <option name="kategorie" value="../vtipy/kategorie/pocitace/pocitace.txt">Počítače</option>
  <option name="kategorie" value="../vtipy/kategorie/policejni/policejni.txt">Policejní</option>
  <option name="kategorie" value="../vtipy/kategorie/programatori/programatori.txt">Programátoři</option>
  <option name="kategorie" value="../vtipy/kategorie/skola/skola.txt">Škola</option>
  <option name="kategorie" value="../vtipy/kategorie/urednici/urednici.txt">Úředníci</option>
  <option name="kategorie" value="../vtipy/kategorie/zvirata/zvirata.txt">Zvířata</option>
  <option name="kategorie" value="../vtipy/kategorie/ostatni/ostatni.txt">Ostatní</option>
  </select> <input type="submit" name="odeslat" value="Přidej !">

  </form>

pridej.php

<?php
$file = $_POST['kategorie'];
if (isset($_POST['odeslat']))
{
        $fo = fopen($file, "a");

        if (fwrite($fo, '<font style="text-align: center;">************************************</font>' . $_POST['vtip'] . '<br>By ' . $_POST['username']))
                echo ('Vtip úspěšně přidán !');
        else
                echo (' Vtip nepřidán,někde nastala chyba...:(');

        fclose($fo);
}
?>

a error při (ne)vložení

Warning: fopen(): Filename cannot be empty in /home/users/birdsoftware/bobikpage.cz/sub/vtipy/service/login/pridej.php on line 12 Warning: fwrite() expects parameter 1 to be resource, boolean given in /home/users/birdsoftware/bobikpage.cz/sub/vtipy/service/login/pridej.php on line 14 Vtip nepřidán,někde nastala chyba...:( Warning: fclose() expects parameter 1 to be resource, boolean given in /home/users/birdsoftware/bobikpage.cz/sub/vtipy/service/login/pridej.php on line 19

..hlavičku jsem odřízl takže není možné si odpočítat řádky...
první error zde

$fo = fopen($file, "a");

druhý zde

if (fwrite($fo, '<font style="text-align: center;">************************************</font>' . $_POST['vtip'] . '<br>By ' . $_POST['username']))

třetí zde

fclose($fo);

předem dík...

 
Odpovědět 3.7.2012 20:24
Avatar
Kit
Redaktor
Avatar
Odpovídá na Daniel Vítek
Kit:

Jsi nepoučitelný šílenec. Takový web ti bude fungovat možná pár dní a někdo ti ho rozbije. Proč nepoužiješ databázi? S ní to bude jednodušší, rychlejší a bezpečnější.

Abych byl konkrétní: Nechat si poslat v parametru jméno souboru, do kterého se bude v zápětí zapisovat, je sebevražda.

Nahoru Odpovědět 3.7.2012 20:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Kit
Daniel Vítek:

a když už tak je to moje stránka,ne tvoje. já říkám že pro mě je SQL těžké. ty se to možná naučíš za 2 dny,ale já ne ! tak zkus taky trochu myslet...

 
Nahoru Odpovědět 3.7.2012 20:47
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Kit
Daniel Vítek:

kdybych chtěl hodnocení webu tak to dám do kritiky,jenže já to dal na fórum,protože chci poadit

 
Nahoru Odpovědět 3.7.2012 20:48
Avatar
Odpovídá na Daniel Vítek
David Jančík [sczdavos]:

Prostuduj si sekci PHP ;)
Pokud nemáš dobrý důvod k tomu dělat něco špatně, tak dej přednost správnému řešení a jak ti Kit již několikrát pokynul, použij databázi. Ušetříš se mnohým trablím a zjistíš, že práce s ní je velmi jednoduchá a efektivní :)

Nahoru Odpovědět 3.7.2012 20:52
Čím více času dostaneš, tím méně ho máš.
Avatar
jindral
Redaktor
Avatar
Odpovídá na Daniel Vítek
jindral:

Musím ale s Kitem souhlasit, dá se to obejít a nedělá to potom dobře i z hlediska bezpečnosti

Nahoru Odpovědět 3.7.2012 20:52
129x pád = 219x úspěch
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Daniel Vítek
Drahomír Hanák:

Tady bych souhlasil s Kitem. Databáze v PHPčku (třeba MySQL) jsou tak strašně jednoduché, že je úplně triviální je používat. Myslím, že je dost zřejmé, proč nepředávat parametrem jméno souboru, do které budeš zapisovat... Zkus se podívat jen na definice funkcí v PHP začínajících mysql_*. Většinou předáváš pár jasných parametrů. Pokud bys potřeboval pomoct s databází, vždycky se tu můžeš zeptat a někdo ti poradí, ale na tohle používat soubory je celkem sebevražda.

 
Nahoru Odpovědět 3.7.2012 20:54
Avatar
Kit
Redaktor
Avatar
Odpovídá na Daniel Vítek
Kit:

Už jsme tady probrali několikrát, jak je nutné použití funkce htmlspecialchars() při generování HTML z textu od uživatele a přesto to ignoruješ.

Ta kritika byla konstruktivní. Představ si, že by někdo jako název souboru dal "cervik.php" a jako text vtipu dal exploit. A máš nechtěného admina.

Však nemusíš použít SQL databázi.

Aspoň si ošetři ta vstupní pole. Je úplně zbytečné do "kategorie" dávat cestu k souboru, tu si přece doplníš v aplikaci po provedení basename() a příponu také.

Ten soubor se ti neotevřel, protože tu cestu máš chybně.

A chybí ti header('Location: ...') na konci skriptu pridej.php. Ale to už jsme také probírali.

Nahoru Odpovědět 3.7.2012 21:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Tato diskuze byla označena moderátorem jako nekonstruktivní a myslíme si, že nemá pro veřejnost příliš vysokou hodnotu. Členy můžete samozřejmě stále oslovit soukromě a to formou zpráv nebo chatu.

Zobrazeno 9 zpráv z 9.