« 1 2 »
Autor Zpráva
Kos112567
Profil
Ahoj,
opět Vás prosím o radu - zkouším vytvořit webové stránky, kde každý se může registrovat a přihlásit. Mám horní menu a tam mám tlačítko Příhlásit se, které přesměruje na formulář přihlášení, po úspěšném loginu se vrátím zpět na index.php - tady byl rád, aby už nebylo tlačítko příhlášení, ale konkrétní uživatelské jméno (vím, jak vypsat uživatelské jméno, ale nevím odstranit tlačítko Přihlášení). Bude to v podstatě fungovat jako tady na webu - přijdu sem a úspěšně se přihlásím, v tu chvíli mi zmizí přihlašovací formulář a objeví se moje přezdívka + tlačítko Odhlásit (které bych tam také chtěl).

Díky za odpovědi
Keeehi
Profil
www.pehapko.cz/zakladni-kurz/10-podminky
Kos112567
Profil
Chápu, že to bude nějaká podmínka, ale úplně nevím jak vytvořit na základě php podmínky to, že se takové tlačítko zobrazí či nikoliv


Něco mě napadlo - budu mít dvě identické stránky až na ty tlačítka a pokud bude uživatel přihlášen, tak se mu zobrazí jiná stránka, než když nebude příhlášen?
Keeehi
Profil
Ne, budeš mít jednu stránku a ty tlačítka budeš zobrazovat dynamicky.
if (/*podminka*/) {
    echo '<a href="prihlaseni.php">Přihlásit</a>';
} else {
    echo '<a href="odhlaseni.php">Odhlásit</a>';
}

Nechápu, jak jsi zvládl vytvořit přihlášení, když toto nezvládneš. To jsi to někde okopíroval a absolutně netušíš, co to dělá, že? Tak se připrav na to, že to asi moc bezpečné nebude.
Kos112567
Profil
Ne, já jsem to totiž dělal trošku jinak - já jsem totiž určitou stránku nezobrazil, dokud se ten člověk nepřihlásí. Tady jsem si nebyl tak jistý, protože chci aby on tu stránku viděl a jenom se mu tam měnily ty tlačítka
Kos112567
Profil
Můžu se tě ještě zeptat? Jakým způsobem mám vypsat tu přezdívku?

Respektive nechám si jí z databáze vypsat takto -
echo htmlspecialchars($_SESSION['uzivatel_jmeno']);

Ale nevím, jak jí mám zabalit to nějakého html, abych mohl jí nastylovat...
Keeehi
Profil
Kos112567:
Respektive nechám si jí z databáze vypsat takto
Tohle ale není výpis z databáze ale session. To je rozdíl.

Pro escapování HTML bys měl použít
htmlspecialchars($s, ENT_QUOTES);

Ale nevím, jak jí mám zabalit to nějakého html, abych mohl jí nastylovat.
Možností je spousta
echo '<span>'.htmlspecialchars($_SESSION['uzivatel_jmeno']).'</span>';

<span><?php echo htmlspecialchars($_SESSION['uzivatel_jmeno']); ?></span>
Kos112567
Profil
Máš pravdu, blbě jsem se vyjádřil :)

Díky moc za pomoc
Kos112567
Profil
Můžu tě ještě poprosit o radu?

Vytvářím pod články sekci s komentáři a chci se nejdříve připojit k tabulce nkniha (má 4 sloupce - ID, datumvlozeni, autor a text).

Takto mám udělané spojení s db

$spojeni = Db::connect('127.0.0.1', 'sokolmilicincz1', 'root', ''); //pripojeni k db
(používám wrapper)
dále funkci
function zabezpec($retezec)
{
    global $spojeni;
    return mysqli_real_escape_string($retezec,$spojeni);
}

A ještě

<?php
    mysqli_query("INSERT INTO nkniha VALUES (NULL, CURDATE(), '"
        .zabezpec($_POST['jmeno'])."', '"
        .zabezpec($_POST['vzkaz'])."')",$spojeni);
    ?>
    <form action=" ." method="post">
        Vaše jméno:<br>
        <input type="text" name="jmeno" maxlength="30" size="30"><br>
        Váš vzkaz:<br>
        <textarea name="vzkaz" rows="7" cols="50" wrap="soft"></textarea><br>
        <input type="submit" value="Poslat zprávu">
    </form>

Pokud toto uložím, na stránce mi to vyhodí chybu:

Notice: Undefined index: jmeno in C:\xampp\htdocs\zwa - project\index.php on line 94
Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\zwa - project\index.php on line 39
Notice: Undefined index: vzkaz in C:\xampp\htdocs\zwa - project\index.php on line 95
Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\zwa - project\index.php on line 39
Warning: mysqli_query() expects parameter 1 to be mysqli, string given in C:\xampp\htdocs\zwa - project\index.php on line 95

Jestli to chápu správně, tak ta proměnná $spojeni mi tam nějak dělá problém (expects 1 to be mysqli, null given)?
Lonanek
Profil
První a třetí chyba říká, že proměnné nejsou definovány - formulář je volán před jeho vyplněním (nikde není patrné, že je testováno stisknutí tlačítka SUBMIT, tedy odeslání formuláře - alespoň z části zaslaného kódu)
Druhá, čtvrtá a pátá chyba jsou pak z části ovlivněny výše uvedenou chybou a také tím, že parametr (proměnná) $spojení je v příkazech mysqli uváděna na prvním místě. Tedy např.:
mysqli_real_escape_string($spojeni, $retezec);

nebo
mysqli_query($spojeni, "INSERT INTO nkniha VALUES (NULL, CURDATE(), '" . zabezpec($_POST['jmeno']) . "', '" . zabezpec($_POST['vzkaz']) . "')");

viz. mysqli_query.
Kos112567
Profil
Lonanek:
První a třetí chyba říká, že proměnné nejsou definovány - formulář je volán před jeho vyplněním (nikde není patrné, že je testováno stisknutí tlačítka SUBMIT, tedy odeslání formuláře - alespoň z části zaslaného kódu)

Nejsem si úplně jist, jak to přesně myslíš - formulář by přece měl být volán před jeho vyplněním...? nebo ne?

Tu druhou část jsem opravil.
Lonanek
Profil
Kos112567:
Nejsem si úplně jist, jak to přesně myslíš - formulář by přece měl být volán před jeho vyplněním...? nebo ne?
To klidně může, ale podle naznačeného úryvku kódu se také hned zapisuje do databáze bez ohledu na to, zda byl formulář vyplněn či nikoliv.

Vaše řešení:
...
<?php
mysqli_query ...
...
?>

HTML
...

vhodnější řešení:
...
<?php
if (isset($_POST['jmeno']) AND isset($_POST['vzkaz']))  // test zda existuji vstupni promenne
{
  mysqli_query ...
  ...
}
?>

HTML
...
Kos112567
Profil
Ok, nicméně stále mi to úplně nefunguje.

Po stisku tlačítka mi to stejně zahlásí, že proměnné nejsou definovány (i když jsem textboxy vyplnil)...
Lonanek
Profil
Prosím o celý kód bez citlivých údajů (hesla, atd...)
Kos112567
Profil
<?php

require('Db.php');
$spojeni = Db::connect('127.0.0.1', 'sokolmilicincz1', 'root', ''); //pripojeni k db

session_start();

if (isset($_GET['clanek'])) //zobrazeni clanku
    $url = $_GET['clanek'];
else
    $url = 'uvod';

$clanek = Db::queryOne('
        SELECT *
        FROM clanky
        WHERE url=?
', $url);

if (!$clanek) //pokud se nenalezne clanek, tak 404
{
    if ($url != 'chyba')
    {
        header('Location: index.php?clanek=chyba');
        exit();
    }
    else
        die('Nebyl nalezen chybovy clanek');
}

if (isset($_GET['odhlasit']))
{
    session_destroy();
    header('Location: index.php');
    exit();
}
function zabezpec($retezec)
{
    global $spojeni;
    return mysqli_real_escape_string($spojeni, $retezec);
}
?>

<!DOCTYPE html>
<html lang="cs-cz">

    <head>
        <meta charset="utf-8" />
        <meta name="description" content="<?= htmlspecialchars($clanek['popisek']) ?>" />
        <meta name="keywords" content="<?= htmlspecialchars($clanek['klicova_slova']) ?>" />
        <link rel="stylesheet" href="styl.css" type="text/css"/>
        <link rel=stylesheet href="style_blue.css" id=css>
        <link rel=stylesheet href="print.css" media="print">
        <title><?= htmlspecialchars($clanek['titulek']) ?></title>
        <script src="js/rozklikavaci_menu.js"></script>
        <script src="js/switcher.js"></script>
        <script src="js/change_color.js"></script>
    </head>
    <body>
    <header>
            <div id="logo"><img src="obrazky/sokolMale.png" alt="logo"></div>
            <nav>
                <ul>
                    <li class="aktivni"><a href="index.php">Domů</a></li>
                    <li><a href="sport.php">Sport</a></li>
                    <li><a href="kultura.php">Kultura</a></li>
                    <li><a href="fotogalerie.php">Fotogalerie</a></li>
                    <li><a href="dokumenty.php">Dokumenty</a></li>
                    <li><a href="historie.php">Historie</a></li>
                    <?php
                    if (!isset($_SESSION['id'])) {
                        echo '<a href="prihlaseni.php" class="login">Přihlášení</a>';
                    } else {
                        echo '<a href="index.php?odhlasit" class="login">Odhlásit</a>';
                        echo '<a href="#" class="login">'.htmlspecialchars($_SESSION['uzivatel_jmeno']).'</a>';
                    }
                    ?>
                </ul>
            </nav>
        </header>
    
        <article>
            <div id="centrovac">
                <header>
                    <h1><?= htmlspecialchars($clanek['titulek']) ?></h1>
                </header>
            
                <section>
                    <?= $clanek['obsah'] ?>
                </section>
                <div class="cistic"></div>
            </div>
        </article>
    <?php
    if (isset($_POST['jmeno']) AND isset($_POST['vzkaz'])) {
        mysqli_query($spojeni, "INSERT INTO nkniha VALUES (NULL, CURDATE(), '"
            .zabezpec($_POST['jmeno'])."', '"
            .zabezpec($_POST['vzkaz'])."')");
    }
    ?>
    <form action=" ." method="post">
        Vaše jméno:<br>
        <input type="text" name="jmeno" maxlength="30" size="30"><br>
        Váš vzkaz:<br>
        <textarea name="vzkaz" rows="7" cols="50" wrap="soft"></textarea><br>
        <input type="submit" value="Odeslat">
    </form>
    <footer>
            <a href="prihlaseni.php">Administrace</a>
        </footer>
    </body>
</html>
Lonanek
Profil
Odkud máte kód?
Co je v Db.php?
Kos112567
Profil
Něco vymýšlím sám a část dělám podle tutoriálu na web. stránce itnetwork.

Db.php je wrapper -

<?php

class Db
{
    /**
     * @var PDO Databázové spojení
     */
    private static $connection;

    /**
     * @var array Výchozí nastavení ovladače
     */
    private static $options = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES cp1250",
        PDO::ATTR_EMULATE_PREPARES => false,
    );

    /**
     * Připojí se k databázi pomocí daných údajů
     * @param string $host Název hostitele
     * @param string $database Název databáze
     * @param string $user Uživatelské jméno
     * @param string $password Heslo
     */
    public static function connect($host, $database, $user, $password)
    {
        if (!isset(self::$connection)) {
            $dsn = "mysql:host=$host;dbname=$database";
            self::$connection = new PDO($dsn, $user, $password, self::$options);
        }
    }

    /**
     * Spustí dotaz a vrátí PDO statement
     * @param array $params Pole, kde je prvním prvkem dotaz a dalšími jsou parametry
     * @return \PDOStatement PDO statement
     */
    private static function executeStatement($params)
    {
        $query = array_shift($params);
        $statement = self::$connection->prepare($query);
        $statement->execute($params);
        return $statement;
    }

    /**
     * Spustí dotaz a vrátí počet ovlivněných řádků. Dále se předá libovolný počet dalších parametrů.
     * @param string $query Dotaz
     * @return int Počet ovlivněných řádků
     */
    public static function query($query) {
        $statement = self::executeStatement(func_get_args());
        return $statement->rowCount();
    }

    /**
     * Spustí dotaz a vrátí z něj první sloupec prvního řádku. Dále se předá libovolný počet dalších parametrů.
     * @param string $query Dotaz
     * @return mixed Hodnota prvního sloupce z prvního řádku
     */
    public static function querySingle($query) {
        $statement = self::executeStatement(func_get_args());
        $data = $statement->fetch();
        return $data[0];
    }

    /**
     * Spustí dotaz a vrátí z něj první řádek. Dále se předá libovolný počet dalších parametrů.
     * @param string $query Dotaz
     * @return mixed Pole výsledků nebo false při neúspěchu
     */
    public static function queryOne($query) {
        $statement = self::executeStatement(func_get_args());
        return $statement->fetch(PDO::FETCH_ASSOC);
    }

    /**
     * Spustí dotaz a vrátí všechny jeho řádky jako pole asociativních polí. Dále se předá libovolný počet dalších parametrů.
     * @param string $query Dotaz
     * @return mixed Pole řádků enbo false při neúspěchu
     */
    public static function queryAll($query) {
        $statement = self::executeStatement(func_get_args());
        return $statement->fetchAll(PDO::FETCH_ASSOC);
    }

    /**
     * Umožňuje snadné vložení záznamu do databáze pomocí asociativního pole
     * @param string $table Název tabulky
     * @param array $data Asociativní pole, kde jsou klíče sloupce a hodnoty hodnoty
     * @return int Počet ovlivněných řádků
     */
    public static function insert($table, $data) {
        $keys = array_keys($data);
        self::checkIdentifiers(array($table) + $keys);
        $query = "
            INSERT INTO `$table` (`" . implode('`, `', $keys) . "`)
            VALUES (" . str_repeat('?,', count($data) - 1) . "?)
        ";
        $params = array_merge(array($query), array_values($data));
        $statement = self::executeStatement($params);
        return $statement->rowCount();
    }

    /**
     * Umožňuje snadnou modifikaci záznamu v databázi pomocí asociativního pole
     * @param string $table Název tabulky
     * @param array $data Asociativní pole, kde jsou klíče sloupce a hodnoty hodnoty
     * @param string $condition Řetězec s SQL podmínkou (WHERE)
     * @return mixed
     */
    public static function update($table, $data, $condition) {
        $keys = array_keys($data);
        self::checkIdentifiers(array($table) + $keys);
        $query = "
            UPDATE `$table` SET `".
            implode('` = ?, `', array_keys($data)) . "` = ?
            $condition
        ";
        $params = array_merge(array($query), array_values($data), array_slice(func_get_args(), 3));
        $statement = self::executeStatement($params);
        return $statement->rowCount();
    }

    /**
     * Vrátí poslední ID posledního záznamu vloženého pomocí INSERT
     * @return mixed Id posledního záznamu
     */
    public static function getLastId()
    {
        return self::$connection->lastInsertId();
    }

    /**
     * Ošetří string proti SQL injekci
     * @param string $string Řetězec
     * @return mixed Ošetřený řetězec
     */
    public static function quote($string)
    {
        return self::$connection->quote($string);
    }

    /**
     * Zkontroluje, zda identifikátory odpovídají formátu identifikátorů
     * @param array $identifiers Pole identifikátorů
     * @throws \Exception
     */
    private static function checkIdentifiers($identifiers)
    {
        foreach ($identifiers as $identifier)
        {
            if (!preg_match('/^[a-zA-Z0-9\_\-]+$/u', $identifier))
                throw new Exception('Dangerous identifier in SQL query');
        }
    }
}
Lonanek
Profil
Tak musíte upravit i ostatní dotazy:
mysqli_real_escape_string($string) => Db::quote($string)
mysqli_query() => Db::insert($tabulka, $data) - array $data Asociativní pole, kde jsou klíče sloupce a hodnoty hodnoty

<form action=" ." method="post"> => <form action="" method="post">

Snad jsem toho více nepřehlédl.
Kos112567
Profil
Ok, insert mi nefungoval, tak jsem místo toho nahradil query - mám to tedy takto:

if (isset($_POST['autor']) AND isset($_POST['obsah'])) {
        Db::query('
                                INSERT INTO nkniha (autor,datumvlozeni, obsah)
                                VALUES (?, CURRENT_DATE(), ?)
                        ', zabezpec($_POST['autor']), zabezpec($_POST["obsah"]));
        $_SESSION['id'] = Db::getLastId();
        $_SESSION['uzivatel_jmeno'] = $_POST['autor']; //asociativni pole
        $_SESSION["uzivatel_email"] = $_POST['obsah'];
        header('Location: index.php');

Ještě poslední věc - snažil jsem se do toho zakomponovat ještě navíc datum vložení, nicméně takto to nefunguje - do db se mi zapisuje pouze ten datum, ale už ne hodnoty. Bez toho data to jinak funguje v pořádku :)
Lonanek
Profil
CURRENT_DATE() => DATE()

Před použitím Db::insert je vhodné naplnit pole daty.
Toto by mělo fungovat:
$data_insert = array(
  "autor" => zabezpec($_POST['autor']),
  "datumvlozeni" => DATE("Y-m-d H:i:s"),
  "obsah" => zabezpec($_POST["obsah"])
);
Db::insert("nkniha", $data_insert);
nebo
$data_insert['autor'] = zabezpec($_POST['autor']);
$data_insert['datumvlozeni'] = DATE("Y-m-d H:i:s");
$data_insert['obsah'] = zabezpec($_POST["obsah"]);

Db::insert("nkniha", $data_insert);
Kos112567
Profil
A ten query (jak jsem ho používal já), tak na to není moc vhodný?

Toto
        if (isset($_POST['autor']) AND isset($_POST['obsah'])) {
            $data_insert['autor'] = zabezpec($_POST['autor']);
            $data_insert['datumvlozeni'] = DATE("Y-m-d H:i:s");
            $data_insert['obsah'] = zabezpec($_POST["obsah"]);
            Db::insert("nkniha", $data_insert);
      }

mi zapisuje vždy dva záznamy a navíc mi to také nepředává to jméno a text - pouze datum
Lonanek
Profil
Názvy polí (autor, obsah) přesně souhlasí s databází?
Kos112567
Profil
Ano, je to tabulka nkniha, která má pole id, autor, datumvlozeni a obsah
Lonanek
Profil
No musí být prázdné, pokud jste také patřičně nezměnil názvy položek formuláře. Původně jste uváděl jmeno, vzkaz viz: [#15] Kos112567
Kos112567
Profil
Ano, <textarea> se jmenuje vzkaz (tak jak jsem postoval ten kód), ale v databázi mám sloupec obsah
Lonanek
Profil
Pak musíte uvést správné položky $_POST
$data_insert['autor'] = zabezpec($_POST['jmeno']);
$data_insert['obsah'] = zabezpec($_POST["vzkaz"]);
nebo je ve formuláři přejmenovat tak aby jste v tom v budoucnu neměl hokej a nedivil se, proč do autora přenášíte jméno a do obsah vzkaz

To, že to funguje se můžete přesvědčit.

Pokud přejmenujete názvy prvků ve formuláři, pak také musíte upravit podmínku, nebo pojmenovat odesílací tlačítko a to vyhodnocovat.
Kos112567
Profil
Já prostě nevím, kde by mohla být chyba :/

<textarea> se tedy již jmenuje obsah, ale do databáze se mi vždy zapíše NULL

Viz printscreen databáze zde a printscreen kódu zde

V té podmínce je také "obsah", ne "vzkaz"
Lonanek
Profil
teď to nezapisuje nic, že?
V kódu máte uvedeno v podmínce $_POST['vzkaz'], přejmenujte na $_POST['obsah'].
Kos112567
Profil
Nene, tam je také již obsah, ten příspěvek jsem pak editoval
Lonanek
Profil
Kos112567:
printscreen kódu zde
ale tady to máte zelené na černém.
Co tedy platí?
« 1 2 »

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: