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 *
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 *
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
á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
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
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
???

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
Db::query('
            UPDATE clanky3
            SET odmh=?, hods=?, vyplata=?
            WHERE prac_id=?
        ', $_POST['odmh'], $_POST['hods'], $vyplata, $_POST['prac_id']);
peter_r
Profil
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
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
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
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
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
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
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
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
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ě.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0