C# týden C# týden
Pouze tento týden sleva až 80 % na e-learning týkající se C#

Diskuze: Databáze - průběžné bodování - vyhledávání a přepis dat

Aktivity (2)
Avatar
Tereza -
Člen
Avatar
Tereza -:10. září 19:20

Ahoj,
již druhý den přemýšlím o způsobu, jakým by šlo vytvořit databázi bodování. Konkrétně si to představuji následovně:

Mám databázi, kde je seznam osob a jejich aktuální bodový stav.
Na webu je formulář, pomocí kterého je možné přičíst body do databáze.

Př.
Databázová tabulka má dva sloupce:

Jméno Body
A 15

Formulář bych viděla následovně - vyplněný:

Jméno: A
Body: 10

Po odeslání bych chtěla, aby došlo k nalezení uživatele v databázi podle jména ve formuláři.
Následně by se do proměnné uložil počet bodů z databáze.
Do další proměnné by se uložil počet připsaných bodů.
To by se sečetlo do poslední proměnné a ta by se zapsala do databáze.

Zkusil jsem: Dokážu dostat obsah formuláře do proměnných i zkontrolovat, zda je formulář vyplněný, problém mám s tím, jak vyhledat podle jména v proměnné $jmeno= $_POST['jmeno'] správného uživatele a jak z databáze do proměnné $aktualnibody získat počet bodů z databáze. A následně jak přepsat body v databázi na novou hodnotu.

V PHP jsem sice začátečník a možná jsem si vybrala pro začátky trochu náročnější projekt, ale... Možná ani není proveditelný, to neumím posoudit, ale podle mých záznamů v sešitě to vypadalo celkem použitelně. Nějaké rady, jak se dostat k cíli? :D

Chci docílit: Chci dosáhnout vytvoření databáze bodování, kam nezapíšu body jednorázově, ale bude je tam moci připisovat kdokoli, kdo dostane přístup.

(zatím nejde o kód, který bych chtěla zapojit do většího projektu, zatím spíš zkouším jednotlivé části)

 
Odpovědět
10. září 19:20
Avatar
Uživatel sítě :10. září 19:45

Ahoj v PDO by dotaz mohl vypadat nějak takto:

<?php
$query = $pdo->prepare('
  UPDATE
    uzivatele
  SET
    body = body + ?
  WHERE
    jmeno = ?
');

$result = $query->execute([
  $_POST['body'],
  $_POST['jmeno'],
]);

Díky tomu si nemusíš vytahovat aktuální stav, takže bude mít o dotaz na DB méně.

Také nezapomenout na to, že vkládaná hodnota musí být číslo a pokud se bude pouze přičítat, tak že není záporná, atd..

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
10. září 19:45
Chybami se člověk učí, běžte se učit jinam!
Avatar
Tereza -
Člen
Avatar
Tereza -:10. září 19:53

To vypadá jednoduše, děkuji, zkusím to... :)

Propojení s databází může být nějak takto? ->
session_start();
require('Db.php');
Db::connect('127­.0.0.1', 'ks', 'root', '');

Používám wrapper z jednoho ze zdejších kurzů

 
Nahoru Odpovědět
10. září 19:53
Avatar
Tereza -
Člen
Avatar
Tereza -:10. září 20:02

Tak propojení se mi podařilo dohledat, ani localhost už mi nezobrazuje chybu, přesto je zde však jeden problém: po odeslání formuláře se v databázi nic nezmění.

 
Nahoru Odpovědět
10. září 20:02
Avatar
Odpovídá na Tereza -
Uživatel sítě :10. září 20:03

Aha, nu SQL dotaz bude stejný:

<?php
Db::pripoj('127.0.0.1', 'db_user', 'db_pass', 'db_name');
Db::dotaz('
  UPDATE
    uzivatele
  SET
    body = body + ?
  WHERE
    jmeno = ?
',
[
  $_POST['body'],
  $_POST['jmeno'],
]
)

Vycházím z tohoto článku:
https://www.itnetwork.cz/…crud-wrapped
a netuším zda jsou ještě nějaké jiné/upravené verze tohoto wrapperu.

Nahoru Odpovědět
10. září 20:03
Chybami se člověk učí, běžte se učit jinam!
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Tereza -
Člen
Avatar
Tereza -:10. září 20:13

Já vycházím z článku: https://www.itnetwork.cz/…sql-ovladace

Takže...

<?php
Db::pripoj('127.0.0.1', 'root', '', 'ks');
Db::dotaz('
  UPDATE
    body
  SET
    body = body + ?
  WHERE
    jmeno = ?
',
[
  $_POST['body'],
  $_POST['jmeno'],
]
)
?>
<html>
...

Následuje formulář a přes isset ověření, zda je správně vyplněný.
Výše zmíněný $result se nachází také v té další části?

 
Nahoru Odpovědět
10. září 20:13
Avatar
Odpovídá na Tereza -
Uživatel sítě :10. září 22:10

V mém případě proměnná $result obsahuje návratovou hodnotu metody execute ovladače PDO, ta je logická, takže true nebo false.

Metody místního wrapperu vrací počet ovlivněných řádků, viz. zdrojové kódy z manuálů.

Nahoru Odpovědět
10. září 22:10
Chybami se člověk učí, běžte se učit jinam!
Avatar
Tereza -
Člen
Avatar
Tereza -:11. září 16:00

Fomulář vyplním, odešlu, zkontroluje se správnost jeho vyplnění, ale pořád mám chybu někde na cestě k databázi... :D Já vím, asi je tam nějaká úplně jednoduchá chyba, ale...

<?php
require('Db.php');
Db::pripoj('127.0.0.1', 'root', '', 'ks');
Db::dotaz('
  UPDATE
    body
  SET
    body = body + ?
  WHERE
    jmeno = ?
',
[
  $_POST['body'],
  $_POST['jmeno'],
]
)
?>
<html>
<head></head>
<body>
    <H1>Formulář</H1>
<form method="post">
    <p>Jméno<br>
    <input type="text" name="jmeno" required></p>
    <p>Body<br>
   <input type="number" name="body" required> </p>

    <input type="submit" name="odeslat" value="Zapsat body">

    </form>

<?php
    if($_POST) {
    if(
        isset($_POST['jmeno'])  && $_POST['jmeno'] &&
                isset($_POST['body']) && $_POST['body'])
    {
       echo('Body zapsány');

    }
        else {
            echo ("Chyba ve vyplňování formuláře!");
        }

    }


    ?>

    </body>
</html>
 
Nahoru Odpovědět
11. září 16:00
Avatar
lionnel
Člen
Avatar
lionnel:11. září 17:12

Jestli kód výše odpovídá tvému skutečnému projektu, tak ti to už při prvním spuštění musí vyhazovat error, protože se snažíš ukládat, respektive načítat hodnoty z pole $_POST na indexech, které v tu chvíli vůbec neexistují. Ukládání musí být až v podmínce, kde kontroluješ, jestli jsou body a jméno nastavené, viz upravený kód níže.

<?php
require('Db.php');
Db::pripoj('127.0.0.1', 'root', '', 'ks');
?>
<html>
<head></head>
<body>
    <H1>Formulář</H1>
<form method="post">
    <p>Jméno<br>
    <input type="text" name="jmeno" required></p>
    <p>Body<br>
   <input type="number" name="body" required> </p>

    <input type="submit" name="odeslat" value="Zapsat body">

    </form>

<?php
    if($_POST) {
    if(
        isset($_POST['jmeno'])  && $_POST['jmeno'] &&
                isset($_POST['body']) && $_POST['body'])
    {
Db::dotaz('
  UPDATE
    body
  SET
    body = body + ?
  WHERE
    jmeno = ?
',
[
  $_POST['body'],
  $_POST['jmeno'],
]
);
       echo('Body zapsány');

    }
        else {
            echo ("Chyba ve vyplňování formuláře!");
        }

    }


    ?>

    </body>
</html>
 
Nahoru Odpovědět
11. září 17:12
Avatar
Tereza -
Člen
Avatar
Tereza -:11. září 18:21

Děkuji, již to funguje :) Já to tam původně měla a pak jak jsem řešila připojení databáze... No a ještě zde byl jeden problém - já body v databázi zapsala nulovou hodnotu, nikoli jako 0 bodů, tím pádem neměl kód číslo s kterým by pracoval a ke kterému by zadané body přičetl :)

Oběma vám moc děkuji za pomoc!

 
Nahoru Odpovědět
11. září 18:21
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 10.