NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 3 - Formulář a výpis dat z databáze do tabulky v PHP

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
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?

Editováno 18.2.2018 8:35
 
Odpovědět
18.2.2018 8:34
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá 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.

Odpovědět
18.2.2018 9:18
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

 
Odpovědět
17.3.2018 14:03
Avatar
Odpovídá na Jiří Čeřovský
Dominik Gavrecký:17.3.2018 14:16

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

Odpovědět
17.3.2018 14:16
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
Odpovídá 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. :)

Odpovědět
17.3.2018 14:21
TruckersMP vývojář
Avatar
Odpovídá na Jan Lupčík
Jiří Čeřovský:17.3.2018 17:55

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

 
Odpovědět
17.3.2018 17:55
Avatar
Odpovídá 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?

 
Odpovědět
17.3.2018 18:11
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá 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.

Odpovědět
18.3.2018 17:58
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>

 
Odpovědět
4.9.2018 17:35
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ů
 */
 
Odpovědět
15.12.2018 14:19
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 104.