IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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: Výpis produktů s tlačítkem na stránce

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Matěj Kábrt:4.9.2019 14:08

Ahoj všem zkušenějším,
jsem zde nový a teprve se učím programování v PHP. Podle návodu zde na webu jsem si zkusil naprogramovat neobjektivní redakční systém, pouze pro moje účely a procvičení :-) . Bohužel jsem se zde zasekl na jednom problému, který nevím jak odstranit.
Potřebuji, aby při výpisu produktů (článků) se spolu s tím vypsalo i tlačítko "sklad -1", které má za úkol odebrat 1 ks ze skladu, bez nutnosti editace produktu (viz. screen). Celý produkt vypisuji pomocí funkce "foreach", kde by také mělo dle mého být dané tlačítko. Ale nemohu přijít na to, jak ho tam dostat a následně zadat jeho funkci.

Zkusil jsem: Zkoušel jsem tlačítko do funkce zadat následovně:

foreach ($zbozi as $produkt)
                                        {
                                                echo('<tr><td><h2>'
                                                               . htmlspecialchars($produkt['nazev']) . '</a><br /><font color="grey" size="2">'
                                                               . htmlspecialchars($produkt['katalog_cislo']) .
                                                        '</font></h2> Dostupné množství:<b><font color="red">' . htmlspecialchars($produkt['mnozstvi']));
                                                echo('</b></font>');
                                                ?>
                                                <form method="post">
                                                    <input type="submit" value="Sklad -1" name="sklad1">
                                                </form>
                                                <?php
                                                echo('<br />');
                                                        echo(' <a href="editor.php?url=' . htmlspecialchars($produkt['url']) . '">Editovat</a>
                                                                           <a href="zbozi.php?odstranit=' . htmlspecialchars($produkt['produkt_id']) . '">Odstranit</a>
                                                                ');
                                                echo('</td></tr>');
                                        }

Bohužel se mi nedaří uzavřít <form> a pravděpodobně z tohoto důvodu při zadání $_POST['sklad1'] je vypsaná chyba: Undefined index: sklad1

Dále jsem zkoušel zadat tlačítko jednoduše do funkce pomocí echo(); ale taky bez výsledku. viz kód zde:

foreach ($zbozi as $produkt)
                                        {
                                                echo('<tr><td><h2>'
                                                               . htmlspecialchars($produkt['nazev']) . '</a><br /><font color="grey" size="2">'
                                                               . htmlspecialchars($produkt['katalog_cislo']) .
                                                        '</font></h2> Dostupné množství:<b><font color="red">' . htmlspecialchars($produkt['mnozstvi']));
                                                echo('</b></font>');
                                                echo(' <input type="submit" value="Sklad -1" name="sklad1">');
                                                echo('<br />');
                                                        echo(' <a href="editor.php?url=' . htmlspecialchars($produkt['url']) . '">Editovat</a>
                                                                           <a href="zbozi.php?odstranit=' . htmlspecialchars($produkt['produkt_id']) . '">Odstranit</a>
                                                                ');
                                                echo('</td></tr>');
                                        }

Díky moc všem za jakoukoliv radu :-P

Chci docílit: Funkční tlačítko na odebrání 1ks ze skladu, při vypsání produktu na stránce v PHP.

 
Odpovědět
4.9.2019 14:08
Avatar
Milan Turyna
Tvůrce
Avatar
Milan Turyna:4.9.2019 19:20

Undefined index error se ti zobrazuje většinou kvůli tomu že pracuješ s proměnná která není vyplněná a nebo neexistuje. Tudíž aby se ti nezobrazoval tento error, pracuj s proměnnou jen pod podmínkou

f(isset($_POST['sklad1'])) {}

Co se týče toho co děláš.. přijde mi že se snažíš o eshop, pokud ano, radil bych ti začít od znova a tentokrát se neřídit redakčním systémem a místo toho si vytvořit systém podle sebe a problémama který se vyskytnou se učit, a radit zde na fórum, jinak doporučuji ti přejít na PDO aspoň z mého hlediska je přehlednější a jednodušší. Pokud by jsi použil PDO tak by připojení s dotazem vypadalo takto:

$host = "blabla";
 $port = "3306";
 $user = "blabla";
 $pass = "blabla";
 $db   = "blabla";
 $dbh  = new PDO('mysql:dbname='.$db.';host='.$host.';port='.$port,$user,$pass);

$sql=$dbh->prepare("dotaz");
$sql->execute();

Execute slouží buď klasickému vykonání příkazu/dotazu ale také ho můžeš využít pro bezpečný "import" proměnných a nebo funkcí do dotazu, takže například id by vypadalo takto:

$sql=$dbh->prepare("SELECT name WHERE id=?")
$sql->execute(array($produkt['produkt_id']))

Jinak aby tě furt nenudilo psát htmlspecialchars tak si udělej
$produkt['blabla'] = htmlspecialchar­s($produkt['bla­bla']) což automaticky ti přidá před $produkt htmlspecialchars (respektive změní na to aby to tam bylo..)

Jinak zbozi.php by mohlo vypadat nějak takto:

if(isset($_GET['odstranit'])) { // aby to neházelo errory

$_GET['odstranit'] = htmlspecialchars($_GET['odstranit']);
// $_GET['odstranit'] je naše ID takže stačí udělat jednoduchý dotaz:

$sql = $dbh->prepare("SELECT pocet FROM tabulka WHERE ID=?");
$sql->execute(array($_GET['odstranit']));

// Pravděpodobně počítáme s tím, že nebude několik produktu na stejné ID, takže se duplikace neměla dít.

while($r=$sql->fetch()) {
$pocet = $r['pocet'] - 1;
}

// nyní $pocet šel o jedno číslo dolu, a stačí udělat dotaz pro update počtu.

$sqlupdate=$dbh->prepare("UPDATE tabulka SET pocet=? WHERE id=?");
$sqlupdate->execute(array($pocet, $_GET['odstranit']));

header("Location: blabla.php");

}

a nebo bez zbytečných kódu můžete text ušetřit, a přidat jako get pomocí ampersantu (&) i počet a udělat jen dotaz který updatne počet ve sloupci který ma ID které požadujete ($_GET['odstra­nit']) odkaz by vypadal nějak takto: zbozi.php?odstra­nit=id&pocet=cis­lo a v zbozi.php by se udělala podmínka

if(isset($_GET['odstranit']) && isset($_GET['pocet'])) {

$_GET['odstranit'] = htmlspecialchars($_GET['odstranit'])
$_GET['pocet'] = htmlspecialchars($_GET['pocet'])

$sql=$dbh->prepare("UPDATE tabulka SET pocet=? WHERE id=?");
$sql->execute(array($_GET['pocet'], $_GET['odstranit']));

header("Location: blabla.php")

}

a pokud bys chtěl můžeš ještě přes regex nebo preg replace povolit jen čísla.

Editováno 4.9.2019 19:20
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
4.9.2019 19:20
Řeš pouze to, co dokážeš ovlivnit.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5.9.2019 10:14

Matěj Kábrt - Ajaj, vsechno spatne. Nevim, co ctes za tutorialy, ale neopisuj z nich radeji kod :)

  1. echo se pise bez tech zavorek, echo "string";
  2. Kdyz vypisujes, vypisuj do promene, str, content a jine, $str .= "string"; ... echo $str;
  3. Musis ovladat zaklady html, css, jinak prace s php je zcela zbytecna :)
  4. Nemas tam tn funkcni kod, ktery provede samotny update.

=== Odesilani ===

Funguje to tak, ze uzivatel ma nejaky html kod. Klikne na tlacitko a odesilas data z inputu na adresu. Odesila se pomoci metody GET nebo POST.

<a href="adresa?data"> odesli mne </a> // GET
<form action="adresa?data"> <input type=submit> </form> // GET
<form action="adresa"> <input name=aaa value=data> <input type=submit> </form> // GET
<form action="adresa" method="POST"> <input name=aaa value=bbb> <input type=submit> </form> // GET
<form action="adresa?data" ...> <input name=aaa value=data> <input type=submit> </form> // GET
<form action="adresa?data" method="POST" ....> <input name=aaa value=bbb> <input type=submit> </form> // GET / POST, jak jsou ty ..., tak tam je treba neco napsat, aby to fungovalo, vzal z adresy data i data z inputu z formulare, ted netusim co

=== Prijem z POST ===

$aaa = isset($_POST['aaa']) ? $_POST['aaa'] : ''; // nebo
$aaa = ''; if (isset($_POST['aaa'])) {$aaa = $_POST['aaa'];}

Pro GET je to podobne, jen $_GET.
Isset je dotaz, zda existuje v poli $_POST name=aaa. Existuje, pokud bylo odeslano. Pokud nebylo, posilas uzivateli formular prazdny a php by ti pindalo UNDEFINED. Takze se to resi prave issetem.

=== Zpracovani ===

$aaa = trim($aaa); // chci odstranit mezery pred a za ".....data s mezerami.." --> "data bez mezer"
if ($aaa!="") {...} // Kdyz neni $aaa prazdne, tak neco udelej. Kdyz je prazdne, nedelej vubec nic, idealne.
// Aby neukladal data do databaze, kdyz nic uzivatel neposlal.

=== Zpracovani faze 2 ===
Chci treba smazat radek 123 z databaze pomoci odkazu.

<a href="adresa?ws=radek_delete&id=123" title="smazat id=123"> smazat </a>
<?php
$id = isset($_GET['id']) ? $_GET['id'] : '';
$ws = isset($_GET['ws']) ? $_GET['ws'] : '';
if ($ws=="radek_delete" && trim($id)!='')
    {
    list($host, $port, $user, $psw, $db) = array(
        'localhost', '',
        'root', '',
        'moje_vytvorena_databaze'
        );
    $pdo   = new PDO('mysql:host=$host;port=$port;dbname=$db', $user, $psw); // vytvorim objekt databaze, predam udaje k pripojeni
    $query = "DELETE FROM tabulka_produkty WHERE id_produkt=?";
    $sql   = $pdo->prepare($query);
    $sql->execute(array($id));
?>

https://www.php.net/…nections.php

Podobne bys to mel pro update.

Ted je otazka, kde mas konktretne ty zadrhel?
Davas formular do formulare? To by teoreticky melo funfovat.
Ma ten input name a value? Pokud ano, tak echo '<pre>'; var_dump($_POST); by mel vypsat vse, co je v post.
Neumis prebrat data?
Neumis data upravit v databazi o -1? "UPDATE tabulka SET pocet=pocet-1 WHERE id=?" Bacha, pujde i do zaporrnych cisel. To si musis prave pohlidat tim selectem, jak ti psal Turyna.

Podle mne neumis posilat data. A pritom mas v kodu jasne

<a href="editor.php?url=' . htmlspecialchars($produkt['url']) . '">Editovat</a>
<a href="zbozi.php?odstranit=' . htmlspecialchars($produkt['produkt_id']) . '">Odstranit</a>

A kdyz chces neco upravid, take potrebujes odeslat id, ne? Jestli pouzijes form nebo odkaz na odeslani je uz jedno. S tim odkazem bys to mel snadnejsi

<form method="post">
    <input type="hidden" value="<?php echo htmlspecialchars($produkt['produkt_id']); ?>" name="sklad1">
    <input type="submit" value="Sklad -1">
</form>
Editováno 5.9.2019 10:15
 
Nahoru Odpovědět
5.9.2019 10:14
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5.9.2019 10:28

Ty mozna nechapes prave to odesilani. Zkus si tam dat

echo '<pre>';
echo '$_REQUEST = '; var_dump($_REQUEST); // post + get
echo '$_POST = '; var_dump($_POST ); // jen + get
echo '$_GET = '; var_dump($_GET ); // jen get
echo '</pre>';

Na zacatku se na server neposle nic. Tento stav musis v kodu vyresit!
Server vygeneruje stranku, posle klientovi, www prohlizeci uzivatele.
Ten klikne na tlacitko, odkaz a posle nejaka data. Dalsi stav, ktery musis resit, jaka data, jake veci se maji nebo nesmi aktivovat (pokud uzivatel neni opravneny).
A kdyz chces pritom pracovat s radky tabulky, idealni je odeslat id radku te tabulky. Bez toho neni mozne identifikovat nic.
Takhle, ty umis v php zpracovat, co uzivatel posle. Pokud posle $_POST['sklad1'] = 'sklad-1', jak podle toho zjistis radek tabulky, kde chces snizit pocet produktu na sklade o minus 1? Ty komunikujes s uzivatelem jen pomoci textu, ktery si posilate. Ty mu posilas html, on ti POST nebo GET. Co ti neposle, to nemas. Nesledujes na co klikl v prohlizeci.
To je mylna predstava novacku, ze uzivatel klikl tady na tom miste v prohlizeci na radku v htm TABLE, kde vypisuji konkretni produkt. Tak preci vim, o jaky produkt se jedna, ne? Nevis. Neposlal jsi tu informaci. To ma jen uzivatel a urcuje ji jen pozice mysi na obrazovce. Ani tu pozici mysi jsi neodeslal. Jen text "sklad-1".

Mimochodem, konstrukce, terou ten eshop pouziva je spatna, neudrzitelna. Nezapomen zdrbat autora, ze te uci spatnym navykum.

<a href="editor.php?url=' . htmlspecialchars($produkt['url']) . '">Editovat</a>
<a href="editor.php?id=' . htmlspecialchars($produkt['id']) . '">Editovat</a> // lepsi
<a href="index.php?q=editovat&id=' . htmlspecialchars($produkt['id']) . '">Editovat</a> // jeste lepsi, predavas GETu prikaz + id produktu, s tim se ti bude mnohem lepe pracovat
 
Nahoru Odpovědět
5.9.2019 10:28
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:5.9.2019 14:24

A jeste jednu spatnou vec jsem si ted vsiml. To je jeste mozna horsi nez ta struktura :)

'<a href="'.htmlspecialchars('index.php?q=editovat&id=' .  urlencode($produkt['id']) ) . '">Editovat</a>'
'<a href="index.php?q=editovat&id=' .  (int) $produkt['id'] . '">Editovat</a>'
'<a href="index.php?q=editovat&id=' .  $produkt['id'] . '">Editovat</a>'

html, ktery vypisujes, podleha cely pod htmlspecialchars
parametry v url podlehaji navic urlencode
Ikdyz v tomhle pripade, vyjimecne, pokud spolehas na do, ze id je cislo a ostatni text je dobre, by tam nemuselo byt ani jedno z toho.

A potom je tu moznost jeste pouzit sprintf

'. sprintf('<a href="%s">%s</a>', htmlspecialchars(sprintf('index.php?q=editovat&id=%s', urlencode($produkt['id']) )), htmlspecialchars('Editovat') ).'
---
$tpl_link = '<a href="%s">%s</a>';
$url = 'index.php?q=editovat&id=%s';
$url = sprintf($url, urlencode($produkt['id']));  // prepises %s v $url zas cislo produkt[id]
$link = sprintf($tpl_link, htmlspecialchars($url), htmlspecialchars('Editovat')); // prepises do sablony pro odkaz url a text
echo $link; // vypises
Editováno 5.9.2019 14:25
 
Nahoru Odpovědět
5.9.2019 14:24
Avatar
Matěj Kábrt:8.9.2019 18:54

Tyjo %P Moc Vám děkuju za rady, podařilo se.

V php jsem teprve na začátku a učím se. Na objektové programování se vrhnu teprve teďka :-) Jen abych ujasnil o co jsem se snažil.. Rozhodně nešlo o eshop, ten právě mám na PrestaShopu a jelikož máme takto dva eshopy a vyrábíme věci na zakázku, tak jsem se v rámci své výuky rozhodl udělat takový malý, jednoduchý neobjektový systém na správu skladových zásob ;-)
Ještě jednou díky moc!

 
Nahoru Odpovědět
8.9.2019 18:54
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 6 zpráv z 6.