Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:
Funkce, kterou se snažíš použít je dostupná pouze pro registrované uživatele. Buďto se přihlas nebo si zdarma vytvoř nový účet.

Diskusia – 3. diel - Formulár a výpis dát z databázy do tabuľky v PHP

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
Petr Polášek:18.2.2018 8:34

Ahoj, mám dotaz ohledně tohoto

        foreach ($uzivatele as $u)
{
        echo('<tr><td>' . htmlspecialchars($u['jmeno']));
        echo('</td><td>' . htmlspecialchars($u['prijmeni']));
        $datum = date("d.m.Y", strtotime($u['datum_narozeni']));
        echo('</td><td>' . htmlspecialchars($datum));
        echo('</td><td>' . htmlspecialchars($u['pocet_clanku']));
        echo('</td></tr>');
}

Konkrétně $datum. Proč to musím znovu upravovat, když už jsem ho přece jednou do tohoto tvaru dal?

if ($_POST)
                {
                        $datum = date("Y-m-d H:i:s", strtotime($_POST['datum_narozeni']));
                        Db::query('
                                INSERT INTO uzivatele (jmeno, prijmeni, datum_narozeni)
                                VALUES (?, ?, ?)
                        ', $_POST['jmeno'], $_POST['prijmeni'], $datum);

                        echo('<p>Byl jste úspěšně zaregistrován.</p>');
                }

Předpokládám, že to je kvůli převedení na náš formát datumu a kvůli tohoto H:i:s?

Editované
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovedá na Petr Polášek
Jan Lupčík:18.2.2018 9:18

V tom prvním to vypisuješ, tedy dáváš to do tvaru 18.02.2018. V tom druhém to ukládáš do databáze a ta to nepřelouská jinak než 2018-02-18 09:18:35.

Odpovedať
TruckersMP vývojář
Avatar
Jiří Čeřovský:17.3.2018 14:03

Ahoj,

krásný článek. Jednoduše napsaný, ale zároveň je v něm plno informací. Vše jsem zvládl, ale mám jeden dotaz. Chtěl bych na stránce nechat zadat uživatele, podle kterého kritéria se má databáze seřadit, ale nemůžu přijít na to, jak to udělat. Pravděpodobně bude kámen úrazu v použití Db:queryAll a Db:query. Jedno je pro čtení a druhé pro zápis. Kód mám následující:

<form method="post" action="kina.php">
Seřadit dle:<input type="radio" name="seradit" value="vek" checked="chec­ked"><br />
<input type="submit" value="Odeslat" />
</form>
<?php
require_once('Db­.php');
Db::connect('127­.0.0.1', 'kyvadloorg', 'root', '');
if ($_POST)
{

echo($_POST['se­radit']);
$kina = Db::queryAll('
SELECT *
FROM uzivatele
ORDER BY ?
', $_POST['seradit']);

Při použit tohoto kódu mi se mi nic neseřadí. Můžete mi, prosím Vás, někdo pomoci?

Děkuju

Avatar
Odpovedá na Jiří Čeřovský
Dominik Gavrecký:17.3.2018 14:16

Ak si dumpneš to query čo ti to vráti ?

Odpovedať
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovedá na Jiří Čeřovský
Jan Lupčík:17.3.2018 14:21

Ahoj,

nechci hned nějak buzerovat, ale příště pro vložení kódu použij tag [ code ] (bez mezer), abychom se v tvém kódu mohli lépe orientovat. Děkuji. :)

Hlavní kámen úrazu je to, že otazníky se dají použít pouze pro hodnoty, ne pro názvy sloupečků. Tvé seřazení tedy nebude fungovat. Budeš si muset vytvořit nějakou rozbalovací nabídku, kam dáš na výběr, podle čeho se to má řadit, a poté budeš zjišťovat, zda-li to uživatel nijak neupravil (ochrana proti MySQL injekci). Poté ten název sloupečku vložíš do dotazu.
Druhá možnost (a i ta lepší) je vytvořit si opět rozbalovací nabídku, kam dáš opět na výběr, podle čeho se mají ty položky řadit. Ty položky v seznamu budou mít nějakou hodnotu; nějaké ID. Podle toho ID budeš v kódu zjišťovat, o co jde, a podle něj spustíš vybraný dotaz, takže nikam nebudeš nic dosazovat. ;)

Snad ti má odpověď pomohla. :)

Odpovedať
TruckersMP vývojář
Avatar
Odpovedá na Jan Lupčík
Jiří Čeřovský:17.3.2018 17:55

Skvělé, to mě nenapadlo. Jak jednoduché :)

Avatar
Odpovedá na Jan Lupčík
Jiří Čeřovský:17.3.2018 18:11

Ale vyřešilo mě to jen částečně, kdybych například chtěl, aby si uživatel zaškrtal parametry, dle kterých si chce vyfiltrovat výsledek (jako je tomu například v různých e-shopech), tak tento postup nemůžu použít. Co pak s tím?

Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovedá na Jiří Čeřovský
Jan Lupčík:18.3.2018 17:58

Ahoj,

jde použít to první řešení, co jsem psal. Tedy:

... Budeš si muset vytvořit nějakou rozbalovací nabídku, kam dáš na výběr, podle čeho se to má řadit, a poté budeš zjišťovat, zda-li to uživatel nijak neupravil (ochrana proti MySQL injekci). Poté ten název sloupečku vložíš do dotazu.

Místo rozbalovací nabídky dáš checkboxy a poté budeš mít pole, kde budeš mít povolené hodnoty. Zkontroluješ, jestli uživatel něco neupravil, a vložíš sloupečky do dotazu.

Odpovedať
TruckersMP vývojář
Avatar
lafleur.aa
Člen
Avatar
lafleur.aa:4.9.2018 17:35

Zdravím všechny PHP nadšence. Narazil jsem na problém a to takový, že mám databázovou tabulku, která obsahuje ID, TITULEK a OBSAH, který se vypisuje pomocí queryAll do tabulky na web. Mohl by mi někdo poradit, jak vypsat všechna data, ale oddělit jednotlivé skupiny dat například pomocí <hr> ?
Pro lepší představu zde dám příklad, jak by měl výpis vypadat. Předem děkuji za každou radu.
<code>
<h2>TITULEK</h2>
<p>OBSAH</p>
<hr>
<h2>TITULEK</h2>
<p>OBSAH</p>
</code>

Avatar
Tereza -
Člen
Avatar
Tereza -:15.12.2018 14:19

Dokud jsem se řídila návody, vše šlo celkem dobře, jenže pak jsem se pokusila vytvořit jinou databázi a jiný registrační formulář a nastal problém :D

<body>

<h1>Registrace uživatele</h1>

<?php

require_once('Db.php');
Db::connect('127.0.0.1', 'ks_test', 'root', '');
if ($_POST)
{
    $datum = date("Y-m-d H:i:s", strtotime($_POST['datum_narozeni']));
    Db::query('
                                INSERT INTO postavy (jmeno, prijmeni, datum_narozeni, popis, charakteristika, zivotopis)
                                VALUES (?, ?, ?)
                        ', $_POST['jmeno'], $_POST['prijmeni'], $datum, $_POST['popis'], $_POST['charakteristika'], $_POST['zivotopis'] );


    echo('<p>Byl jste úspěšně zaregistrován.</p>');
}
?>

                <form method="post">
                        Jméno:<br />
                        <input type="text" name="jmeno" /><br />
                        Příjmení:<br />
                        <input type="text" name="prijmeni" /><br />
                        Datum narození:<br />
                        <input type="text" name="datum_narozeni" /><br />
                        Popis:<br>
                        <textarea name="popis"></textarea><br>
                        Charakteristika:<br>
                        <textarea name="charakteristika"></textarea><br>
                        Životopis:<br>
                        <textarea name="zivotopis"></textarea><br>
                        <input type="submit" value="Registrovat" /><br>
                </form>

        </body>

Po odeslání formuláře dojde k zobrazení této chyby:
*Registrace uživatele
Warning: PDO::prepare(): SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 1 in C:\xampp\htdoc­s\ks_databaze\Db­.php on line 60

Fatal error: Uncaught Error: Call to a member function execute() on boolean in C:\xampp\htdoc­s\ks_databaze\Db­.php:61 Stack trace: #0 C:\xampp\htdoc­s\ks_databaze\Db­.php(71): Db::executeSta­tement(Array) #1 C:\xampp\htdoc­s\ks_databaze\in­dex.php(23): Db::query('\r\n ...', 'Jm\xC3\xA9no', 'P\xC5\x99ijmen\xC3\xAD', '2005-05-11 00:0...', 'Popis', 'Charakteristika', '\xC5\xBDivotopis') #2 {main} thrown in C:\xampp\htdoc­s\ks_databaze\Db­.php on line 61*

Přikládám ještě screen daného úseku z db.php(jde o stejný soubor, co jsem si stáhla, předpokládám, že pro víc sloupců tabulky tam bude potřeba změnit nastavení, ale příliš se v tom nevyznám)

/**
 * 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ů
 */
Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 104.