Autor Zpráva
krupis
Profil
Ahoj,
mám vytvořenou velmi jednoduchou návštěvní knihu, která ukládá příspěvky do databáze (tabulka kniha_navstev má sloupce: datum, jmeno a zapis). Do diskuze mohou přispívat pouze přihlášení uživatelé. Můj cíl je dosáhnout toho, aby pokud je uživatel přihlášený jako admin, mohl přímo na stránkách vyzamat jednotlivé příspěvky. Zatím jsem dospěl ke 2ma věcem. První je, že jsem přidal tabulce přihlášeného uživatele sloupec "jeadmin". Pokud má toto pole hodnotu 1 (uživtel je admin), zobrazí se u příspěvku "vymazat příspěvek".
if  ($_SESSION['jeadmin']==1)
               {
                   echo "<tr><td><a href='/~xkrus06/vymazat_prispevek.php'>Vymazat příspěvek</a></td></tr>";
                }

Teď ovše, nevím, jaký by měl být obsah souboru, na který odkazuju (vymazat_prispevek.php) respektive jaký poslat sql příkaz do databáze.
Další věcí, kterou bych měl myslím zavést, je přidání sloupce "id" také do tabulky pro příspěvky.
Joker
Profil
krupis:
Další věcí, kterou bych měl myslím zavést, je přidání sloupce "id" také do tabulky pro příspěvky.
To určitě, protože s tímhle návrhem fakt nevím, jak chcete určit, který příspěvek chtěl administrátor vlastně smazat.
krupis
Profil
Ok, id k příspěvku přidáno. Mohl byste mi, prosím, poradit nějaký lepší postup, jak zajistit vymazání jednotlivých příspěvků. Uvádím pro kompletnost kód návštěvní knihy. Děkuji
if (isset($_SESSION['username']))
                          {
                            $db_spojeni = mysqli_connect
                               ('localhost','xkrus06','RualewtEo','xkrus06','3306');
                               
                            if (!$db_spojeni)
                               {
                                 echo "připojení se nepodařilo";
                                 exit();
                               }
                            $objekt_vysledku = mysqli_query($db_spojeni, "SET NAMES 'cp1250'");
                            if (!$objekt_vysledku)
                            {
                            echo "poslání příkazu se nepodařilo";
                            exit();
                            }
                            
                            if (isset($_POST['zprava']))
                            {
                            $sql_prikaz = 
                              "INSERT INTO kniha_navstev(id,datum,jmeno,zapis) "
                              ."VALUES('',NOW(),'"
                              .mysqli_real_escape_string($db_spojeni,$_SESSION['username'])
                              ."','"
                              .mysqli_real_escape_string($db_spojeni,$_POST['zprava'])
                              ."')"
                              ;
                              
                              $objekt_vysledku = mysqli_query($db_spojeni, $sql_prikaz);
                              
                              if (!$objekt_vysledku)
                              {
                               echo "Poslání příkazu se nezdařilo";
                               exit();
                              }
                              echo "Nový zápis byl přidán do knihy návštěv.<br>";
                            }
                            
                            $objekt_vysledku = mysqli_query($db_spojeni,
                               'SELECT * FROM kniha_navstev ORDER BY datum DESC LIMIT 0, 10');
                              
                              if(!$objekt_vysledku)
                              {
                              echo "Poslání příkazu se nezdařilo.";
                              exit();
                            
                              }
                            
                            while ($radek = mysqli_fetch_array($objekt_vysledku))
                            {
                            echo '<hr />';
                            echo '<table>';
                            echo '<tr><td><b>Datum a čas:</b></td><td> ',$radek['datum'],'</td></tr>';
                            echo '<tr><td><b>Napsal:</b></td><td> ',$radek['jmeno'],' </td></tr>';
                            echo '<tr><td><b>Příspěvek:</b></td><td> ',$radek['zapis'],'</td></tr>';
                            if  ($_SESSION['jeadmin']==1)
                               {
                                 echo "<tr><td><a href='/~xkrus06/vymazat_prispevek.php'>Vymazat příspěvek</a></td></tr>";
                               }
                            echo '</table>';
                            }
                            echo '<hr />';
                            
                            
                            mysqli_free_result($objekt_vysledku);
                            
                            if(!$db_spojeni)
                            mysql_close($db_spojeni);
                            
                            
                       echo '<form name="kniha" action="" method="post">';
                       echo '<b>Vaše zpráva do návštěvní knihy:</b><br>';
                       echo '<textarea name="zprava" rows="5" cols="30"></textarea><br>';
                       echo '<br>';
                       echo '<input type="submit" value="Odeslat zprávu">';
                       echo '</form>';
                            
                           }
                        else 
                        {
                        echo "<p>Musíte se <a href='/~xkrus06/loginform.php'>přihlásit</a>, abyste mohli přidávat příspěvky do návštěvní knihy!</p>";
                        echo "<p>Pokud ještě nemáte uživatelské údaje, <a href='/~xkrus06/registerform.php'>zaregistrujte se</a>!</p>";
                        }                            
                             
                          ?>

Bertram
Profil
Skript vymazat_prispevek.php musí vědět jaký příspěvek má odstranit.
  echo "<tr><td><a href='/~xkrus06/vymazat_prispevek.php?id=".$radek['id']."'>Vymazat příspěvek</a></td></tr>";
pcmanik
Profil
krupis:
Zjavne zacinas v php, mas to dost neprehladne.

1. Pripajanie k DB oddel ako funkciu, najlepsie si to supni do samostatneho suboru napr. funkcie.php a ten potom pouzivaj.
2. 68 - Uzatvaras spojenie s mysql a pritom mas vytvorene spojenie cez mysqli. Naviac ukoncovanie spojenia nieje potrebne. - 67, 68 mozes kludne zmazat
3. 65 - Zbytocnost, nakolko tahas len velmi malo udajov
4. 7 - 9 Kludne ti staci die() Nemusis to robit takto komplikovane. To iste aj pri 13 - 15
5. 31 - 37 Pri nesplneni podmienky sa pouziva else, ty si to tam len tak hodil.
6. Ked uz pouzivas mysqli, tak pouzi prepare statement. Nebudes potom musiet escapovat znaky.
7. 53 - 55 Na spajanie retazcov sa pouziva bodka a nie ciarka.
8. 71 - 76, 81 - 82 Namiesto takeho mnozstva echo to spoj do jedneho echo.
krupis
Profil
Bertram:
Jak zmínil pcmanik, s PHP opravdu začínám. Mohu se teda zeptat, jak bude potom vypadat obsah souboru vymazat_prispevek.php?
Něco jako:
$objekt_vysledku = mysql_query("DELETE FROM kniha_navstev WHERE id='$radek['id']'");

???
Joker
Profil
krupis:
jak bude potom vypadat obsah souboru vymazat_prispevek.php?
Za prvé by se mělo ověřit, jestli uživatel skutečně smazat příspěvek může.
Jinak by kdokoliv mohl použít odkaz (adresa webu)/vymazat_prispevek.php?(id které chci vymazat) a smazal by příspěvek.

Dál se vezme $_GET["id"] (to je hodnota toho ?id=…), mělo by se ověřit, že to je číslo (aby zadáním ID třeba „0 or 1=1“ smazat všechny příspěvky) a bylo by fajn se administrátora ještě zeptat, jestli příspěvek skutečně chce smazat (aby nešlo ten odkaz vložit na nějaké nevinně vypadající tlačítko, poslat administrátorovi a ten by pak jen koukal, co vlastně smazal).
Čili by bylo dobré vložit ještě mezifázi: Zkontrolovat, zda uživatel má právo, zda příspěvek existuje, zeptat se „Opravdu chcete smazat?“
Uživatel by dal OK a teď je potřeba vhodným způsobem předat informaci, že uživatel potvrdil smazání daného příspěvku.
Pak se ověří že na to má právo a zavolá se ten DELETE SQL dotaz
krupis
Profil
Joker:
Super, mockrát díky. Ještě uvádím kód, který řeší ověření admina a sql příkaz. Existenci příspěvku a "opravdu chcete smazat" si už dodělám. Téma vyřešeno.
$id=$_GET['id'];
    if($_SESSION['jeadmin']==1)
          {                                        
             $objekt_vysledku = mysqli_query($db_spojeni,
             "DELETE FROM kniha_navstev WHERE id='$id'");
           }
     else
            {
               echo "<i>Nemáte právo mazat příspěvky</i>";
            }
Bertram
Profil
Ještě bych dodal, že ten tvůj kód budeš mockrát upravovat, protože ideální není, ikdyž jsi na sebe právem hrdý.
Jako první bych se například vystříhal tomu radikálnímu ukončování ve stylu exit, nebo rozdělit kód do více souborů atd.
A také si neustále pleteš mysql a mysqli což mě přivádí k tomu nejdůležitějšímu a to k tomu, že by jsi se měl začít poočku dívat co je to to OOP

PS: Až teď jsem si uvědomil to tykání,jsem tu poměrně krátce, jak je to s tím na tomto fóru
Snad promineš,ale přepisovat to už nebudu :-)
pcmanik
Profil
A pozri si nieco o zabezpeceni...
Lamicz
Profil
Bertram:
ihmo na OOP má času dost...
Bertram
Profil
Lamicz:
poočku->stejně to tak dopadne :-)

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: