Autor | Zpráva | ||
---|---|---|---|
peter_r Profil |
prosím o radu, vkladám dve hodnoty:
<form method="post"> Odmena za hodinu:<input type="text" name="odmh" value="<?= htmlspecialchars($clanek['odmh']) ?>" /> Počet hodín:<input type="text" name="hods" value="<?= htmlspecialchars($clanek['hods']) ?>" /> <input type="submit" value="Odoslať" /> </form> tieto dve hodnoty mi do tabuľky zapíše ale za tým mám ešte vzorec: $vyplata = $clanek['odmh'] * $clanek['hods'] ale neviem, ako tento výsledok zapísať do tabuľky |
||
anonym_ Profil * |
#2 · Zasláno: 30. 3. 2022, 12:13:56
peter_r:
Nevíme, do jaké tabulky a jak se to snažíš vkládat. Druhá věc je tam, že pokud už v tabulce máš hodinovku a počet hodin, jejich součet je tam naprosto zbytečný. |
||
peter_r Profil |
anonym:
to nie je súčet ale súčin, počet hodín krát mzda na hodinu, ale to je len príklad a ukladám to takto: Db::query(' UPDATE clanky3 SET odmh=?, hods=? WHERE prac_id=? ', $_POST['odmh'], $_POST['hods'], $_POST['prac_id']); |
||
anonym_ Profil * |
#4 · Zasláno: 30. 3. 2022, 12:26:38
peter_r:
Ano, upsal jsem se a jako nepřihlášený nemohu editovat příspěvky, nový jsem kvůli tomu psát nechtěl. Co to ale mění na zbytku mého příspěvku? Pokud znám (a mám uloženo) A a B, tak si vedle toho nepotřebuju ukládat jejich součet/součin/podíl/rozdíl/cokoliv. Pokud se tedy bavíme o databázové tabulce. Pokud jsi tou tabulkou myslel HTML tabulku, tak tam taktéž neukazuješ, jak přesně se snažíš a kde by mohl být problém. |
||
peter_r Profil |
#5 · Zasláno: 30. 3. 2022, 12:41:12
áno myslím databázovú tabuľku
takže sa to nedá zapísať? Nezdá sa mi to veľmi logické, že všade kde potrebujem vytiahnuť tú konečnú hodnotu, tak mám použiť vzorec, a keď ten vzorec je komplikovanejší a mám ho všade vyťahovať, tak sa mi to nezdá veľmi efektívne? napr.: $sumaspol = $suma + $sumsob + $sumnad0 + $obs + $clanek['bonus'] + $clanek['premie'] - $clanek['zrazky'] nie je jednoduchšie si ten výsledok zapísať do tabuľky? |
||
Kajman Profil |
#6 · Zasláno: 30. 3. 2022, 12:49:24
Ano, můžete si uložit i zbytečný výsledek. Stačí do tabulky přidat sloupec pro ten výsledek a hodnotu vložit stejně jako ostatní.
|
||
peter_r Profil |
Kajman:
to ale neviem ako, preto vás žiadam o pomoc |
||
Kajman Profil |
#8 · Zasláno: 30. 3. 2022, 13:19:06
Sloupec si přidáte administračním nástrojem pro databázi. Můžete použít např. Adminer, pokud nemáte jiný. Případně příkazem ALTER TABLE.
|
||
peter_r Profil |
#9 · Zasláno: 30. 3. 2022, 13:22:47
???
v databáze v tabuľke stĺpec vytvorený mám, prosím o radu, ako v php mám zapísať výsledok vzorca |
||
Kajman Profil |
#10 · Zasláno: 30. 3. 2022, 13:36:19
Db::query(' UPDATE clanky3 SET odmh=?, hods=?, vyplata=? WHERE prac_id=? ', $_POST['odmh'], $_POST['hods'], $vyplata, $_POST['prac_id']); |
||
peter_r Profil |
#11 · Zasláno: 30. 3. 2022, 13:41:34
toto som už predtým skúšal ale nič mi nezapísalo, možno som mal niekde chybu, idem na tom ešte popracovať, ale keď už viem, že to takto má byť, tak hádam to nejak dobojujem, ďakujem
|
||
Serg Profil |
#12 · Zasláno: 30. 3. 2022, 14:24:00
Tak jestli ti je jedno že to nesplňuje 3. normální formu návrhu databáze, tak tam sloupec pro vypočítanou hodnotu klidně měj
Ale správně by se to mělo počítat až při SELECTu nebo v aplikačním programu - pokud to není nějaký složitý výpočet, který by trval třeba několik sekund, pak by se ten sloupec navíc dalo tolerovat. Jestli to nic nezapsalo, tak je buď sloupec v jiném formátu, nebo má jiné jméno, nebo nevím (podle toho co se nezapsalo -> jen ta vypočítaná hodnota, nebo vůbec celý řádek?). Kdybys sem třeba hodil návrh nebo schéma tabulky, tak by jsme byli schopný nějak poradit :D |
||
peter_r Profil |
#13 · Zasláno: 30. 3. 2022, 15:18:50
neviem prečo mi tú výslednú hodnotu nechce zapísať, v db mám stĺpec s názvom vyplata, decimal(10,1)
$clanek = array( 'prac_id' => '', 'odmh' => '', 'hods' => '', 'vyplata' => '', ); if ($_POST) { if ($_POST['prac_id']) { Db::query(' UPDATE clanky3 SET odmh=?, hods=?, vyplata=? WHERE prac_id=? ', $_POST['odmh'], $_POST['hods'], $vyplata, $_POST['prac_id']); } header('Location: clanky.php'); exit(); } else if (isset($_GET['prac_id'])) { $nactenyClanek = Db::queryOne(' SELECT * FROM clanky3 WHERE prac_id=? ', $_GET['prac_id']); if ($nactenyClanek) $clanek = $nactenyClanek; else $zprava = 'Článek nebyl nalezen'; } <form method="post"> <input type="hidden" name="prac_id" value="<?= htmlspecialchars($clanek['prac_id']) ?>" /> Odmena za hodinu:<input type="text" name="odmh" value="<?= htmlspecialchars($clanek['odmh']) ?>" /><br /> Počet hodín:<input type="text" name="hods" value="<?= htmlspecialchars($clanek['hods']) ?>" /><br /> <?php $vyplata = $clanek['odmh'] * $clanek['hods']; echo("Spolu: "); echo round ($vyplata, 1); ?> <input type="submit" value="Odoslať" /> </form> na inej stránke ten údaj (okrem neho viac údajov z tabuľky a tie mi vypíše) vypisujem takto htmlspecialchars($clanek['vyplata']) a vypíše mi tam hodnotu 0.0
teraz keď na to pozerám, tak či nie je chyba v tom, že tie inputy sú typu text ale prečo mi potom o riadok nižšie tú hodnotu vypíše správne echo("Spolu: "); echo round ($vyplata, 1); |
||
Kajman Profil |
#14 · Zasláno: 30. 3. 2022, 15:23:58
Protože nemáte $vyplata vypočítané před tím update! To spočítáte vynásobením $_POST['odmh'] a $_POST['hods'] převedených na číslo.
|
||
peter_r Profil |
#15 · Zasláno: 30. 3. 2022, 15:47:04
môžete mi prosím napísať kde presne a čo mám napísať?
|
||
Serg Profil |
Já bych to napsal třeba takto:
if ($_POST) { if ($_POST['prac_id']) { $odmh = floatval($_POST['odmh']); $hods = floatval($_POST['hods']); $vyplata = $odmh * $hods; Db::query(' UPDATE clanky3 SET odmh=?, hods=?, vyplata=? WHERE prac_id=? ', $odmh, $hods, $vyplata, $_POST['prac_id']); } header('Location: clanky.php'); exit(); } Protože php skript se při každém načítání stránky zpracovává od zhora (od začátku), takže si nepamatuje, že předtím bylo na konci skriptu vypočítaná proměnná $vyplata a jakou měla hodnotu. Proto se musí deklarovat a přiřadit hodnota proměnné předtím, než se použije, jinak by to mělo házet chyby Notice: Undefined variable, ale jestli je vypnutý výpis chyb, tak se nic nevypíše no. |
||
peter_r Profil |
Funguje to ale nechápem prečo a ako ???
Ja som len amatér samouk, ale ako píšete, php script sa zpracováva odhora, takže najskôr prepočíta vzorec, zapíše do tabuľky hodnotu a inputy na zadanie hodnôt sú na konci? čiže keď ich na konci zmením, ako to že zapíše do tabuľky správnu hodnotu, keď bola zapísaná už na začiatku? ale samozrejme ďakujem |
||
blaaablaaa Profil |
#18 · Zasláno: 31. 3. 2022, 08:02:40
peter_r:
Protože nahoře je podmínka if ($_POST) ... tedy ta část se zpracuje až po odeslání formuláře. Tedy při prvním načtení stránky se zobrazí formulář. Po jeho odeslání se začne provádět vše, co je v podmínce if ($_POST) postupně zvrchu. Tedy v původní verzi skript proměnnou $vyplata při provádění Db::query ještě ani neznal. |
||
Kajman Profil |
#19 · Zasláno: 31. 3. 2022, 08:19:39
Spíš si je potřeba uvědomit, že ten php skript se spustí pokaždé při požadavku na tu stránku a nemá ponění, co spočítal při předcházejícím spuštění. Zobrazení je jiné spuštnění než zpracování poslaných dat z formuláře.
I samouk si má přečíst před programováním nějakou knížku, aby netápal v základech. Pak byste se ani nesnažil ukládat ten zbytečný výsledek, jak bylo naznačeno hned na začátku. |
||
juriad Profil |
#20 · Zasláno: 31. 3. 2022, 12:31:35
Ono je dobrou praxí rozlišit skript na zpracování uživatelkého vstupu od skriptu na výpis; takže v tvém případě bys měl:
* uprav-clanek.php , který by očekával vstup v $_POST a provedl v databázi UPDATE . Následně by přesměroval uživatele pomocí header('Location: clanky.php');
* clanek.php , který očekává id článku v $_GET['prac_id'] a zobrazí formulář
* clanky.php , který neočekává žádný vstup, jen vypíše seznam článků s odkazy na clanek.php?prac_id=...
Ty jsi první dva skripty sloučil do jednoho, a tedy musíš být opatrnější a striktně mezi nimi těmi dvěma polovinami rozlišovat pomocí if ($_POST) .
Určitě je správně (a máš to tam zapracované) po zpracování vstupu POSTem přesměrovat uživatele - toto zabrání opakovanému zpracování, když uživatel obnoví stránku (F5). |
||
peter_r Profil |
ďakujem, je to na mňa veľa, snažím sa spracovať ešte ten príspevok pred tým
dúfam že sa nikto neurazí, ale z niektorých odpovedí mám pocit, že toto fórum je len pre profíkov, ktorí všetko vedia a nie pre tých, ktorí potrebujú poradiť vyriešiť problém nepodnikám v programovaní aplikácií a nejakých programov, že sem to vám dám vypracovať a potom to niekomu ponúknem a zhrabnem za to peniaze 20 rokov robím vo firme, kde sa väčšina vecí ukladá do excelovskej tabuľky a ako viete, excel je viac problematický pri väčšom počte údajov a užívateľov, preto sa snažím sám pre seba "naprogramovať" takéto jednoduché "aplikácie-programy", aby som zjednodušil prácu sebe a svojim spolupracovníkom kedysi som sa okrajovo zaoberal html-kom, tak som troška zabŕdol do php a do databázy, dá sa v tom urobiť kvantum pomocných programov, ktoré uľahčia veľa práce, len je to pre mňa v mojom veku veľmi komplikované, najradšej by som to dal niekomu urobiť a za to zaplatiť, ale takto, že to po troške babrem sám s vašou pomocou, tak sa niečo naučím preto som vďačný každému, kto mi niečo poradí a pomôže a najviac sa teším tomu, keď mi poradíte a ono to funguje, vtedy sa teším ako malé decko z novej hračky |
||
Keeehi Profil |
#22 · Zasláno: 31. 3. 2022, 23:24:08
Určitě to tu není pro profíky. Asi jde spíš o to, že některé tipy dotazů se často u začátečníků opakují. Což je očekávatelné. Ovšem spousta z nich je vysvětlená v různých učebnicích a tutoriálech. Pokud se tu pak objeví dotaz na něco základního, mohou mít někteří pocit, že se tazatel ani neobtěžoval si o tom sám něco nastudovat.
Pokud bych mohl drobnou radu: Místo "Chci udelat něco. Jak to mám udělat?" tu mnohem více funguje přístup "Chci udělat něco, zkouším to takto (ukázka kódu), kde mám chybu/co dělám špatně?" Reálně jsi to zkoušel přibližně správně, to jsme se ale dozvěděli až v příspěvku [#11]. Kdyby jsi začal rovnou tím, bylo by to lepší. To tak pro příště. |
||
Časová prodleva: 2 roky
|
0