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.


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'] = htmlspecialchars($produkt['blabla']) 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['odstranit']) odkaz by vypadal nějak takto: zbozi.php?odstranit=id&pocet=cislo 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.
+20 Zkušeností
+2,50 Kč

Matěj Kábrt - Ajaj, vsechno spatne. Nevim, co ctes za tutorialy, ale
neopisuj z nich radeji kod
- echo se pise bez tech zavorek, echo "string";
- Kdyz vypisujes, vypisuj do promene, str, content a jine, $str .= "string"; ... echo $str;
- Musis ovladat zaklady html, css, jinak prace s php je zcela zbytecna
- 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>
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
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
Tyjo 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!
Zobrazeno 6 zpráv z 6.