Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.
Avatar
ppz6lxpz
Člen
Avatar
ppz6lxpz:31.1.2019 14:45

Zdravím,
potřeboval bych poradit s php (MySQLi) dotazem na databázi:

Pokud uživatel existuje přičte jedničku k předchozí hodnotě přihlášení. Pokud uživatel neexistuje, vytvoří ho a vloží jedničku do přihlášení.

Předem děkuji za radu...

 
Odpovědět
31.1.2019 14:45
Avatar
Odpovídá na ppz6lxpz
Michal Šmahel:31.1.2019 14:57

Ahoj, co zatím máš? Máš alespoň SQL dotazy nebo PHP kód? Celé ti to psát nebudu. Pošli, co máš, a uvidíme, co se s tím dá dělat.

Nahoru Odpovědět
31.1.2019 14:57
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
ppz6lxpz
Člen
Avatar
ppz6lxpz:31.1.2019 16:04

Jedná se mi jenom o sérii dotazů na databázi.
Ostatní věci jako je přihlášení k databázi a samotnou databázi mám hotové.

Dotaz by asi měl vypadat tak, že se nejdříve zeptá databáze jestli už uživatel existuje
=> pokud ano, přičte počet přihlášení
=> pokud ne, přidá jméno do tabulky a k tomu přidá i počet přihlášení

Stačil by mi třeba jenom odkaz, kde jsou potřebné věci k provedení dotazů.

 
Nahoru Odpovědět
31.1.2019 16:04
Avatar
ppz6lxpz
Člen
Avatar
Odpovídá na ppz6lxpz
ppz6lxpz:31.1.2019 16:10

Oprava chyby v databázi.

 
Nahoru Odpovědět
31.1.2019 16:10
Avatar
Odpovídá na ppz6lxpz
Michal Šmahel:31.1.2019 19:29

No, dobře. Nejprve k té databázové tabulce. Její struktura není zrovna nejlepší. Předpokládám, že je primárním klíčem sloupec "uzivatel". S ním mám hned 3 problémy:

  • datový typ - Kvůli objemu ukládaných dat je třeba datové typy určovat pečlivě. V tomto případě by stačil VARCHAR o délce např. 30 znaků.
  • primární klíč - Jelikož se zde mohou vyskytnout duplicity, je toto pole nevhodné. Lepší by bylo přidat nějaký sloupec "uzivatel_id".
  • pojmenování - Je třeba pojmenovávat konkrétně, ve větší tabulce se v tom jinak ztratíš. Tady by se hodilo třeba "jmeno".

K tvému zadání. Přečti si zdejší základy MySQL, potom bys měl tyto věci ovládat. Jde o jednoduchý SELECT, UPDATE a INSERT. Jestli to potřebuješ dát rychle dohromady, napiš si ještě o SQL dotazy. Každopádně věř, že tak se nic nenaučíš.

Nahoru Odpovědět
31.1.2019 19:29
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1.2.2019 7:50

https://www.itnetwork.cz/…programovani - je tam tema 'SQL a databáze', tady si tvuj dotaz asi nikdo nevsimne

uprav existujici data = UPDATE
vloz nova data = INSERT

google = mysql query UPDATE INSERT together
A hned z prvni nalezene moznosti vyctu treba takoveto priklady...

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE
name="A", age=19
---
REPLACE into table (id, name, age) values(1, "A", 19)
---
INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
    name = VALUES (name),
    ...
---
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
---
INSERT  live-db.table1
SELECT  *
FROM    test-db.table1 t
ON DUPLICATE KEY UPDATE
        ColToUpdate1 = t.ColToUpdate1,
        ColToUpdate2 = t.ColToUpdate2,
        ...

Pozn: Co na tech dotazech je spatne je to, ze id se nastavuje vetsinou jako AUTOINCREMENT, takze by jsi ho nemel pouzivat do INSERTU. Jenom ve vyjimecnych pripadech je to pripustne, kdyz 100% to id neexistuje. Napriklad ms celou tabulku prazdnou.

Editováno 1.2.2019 7:52
 
Nahoru Odpovědět
1.2.2019 7:50
Avatar
ppz6lxpz
Člen
Avatar
ppz6lxpz:1.2.2019 9:26

Děkuji Vám za rady. Vyřešil jsem to už včera asi nějak takto:

$sql = "SELECT `uzivatel` FROM `uzivatele` WHERE `uzivatel` = '$user'";
$dotaz = mysqli_query($mysqli, $sql);

if (mysqli_num_rows($dotaz)==1){
        $sql = "UPDATE `uzivatele` SET `pocet_prihlaseni` = `pocet_prihlaseni` + 1, `datum`='$datum' WHERE `uzivatel` = '$user'";
        $dotaz = mysqli_query($mysqli, $sql);
}else{
        $sql = "INSERT INTO `uzivatele` (`uzivatel`, `pocet_prihlaseni`, `datum`) VALUES ('$user', '1', '$datum')";
        $dotaz = mysqli_query($mysqli, $sql);
}

Ale stále nechápu, proč mám přidat sloupec s ID. V sloupci uživatelé přece nebudou duplicity.

PS: nevšiml jsem si, že je zvlášť diskuzní dodělení pro SQL

 
Nahoru Odpovědět
1.2.2019 9:26
Avatar
Odpovídá na ppz6lxpz
Michal Šmahel:1.2.2019 15:39

Co jsem psal výše, bylo pouhé upozornění na fakt, že tohle v praxi není nejlepší. Ono nejde jen o duplicity - problémy budou i s klíči (velikost indexovaných položek) nebo při prosté změně uživatelského jména. Také v případě cizích klíčů to nebude nic moc. Každopádně je to vždy věc toho, kdo dělá návrh, ostatně i on to případně odnese.

K tvému řešení. Je to sice funkční, ale dost nebezpečně řešené. Je třeba využívat předpřipravené dotazy, a tedy data předávat nepřímo (zástupnými znaky). Díky tomu se kód ošetří proti SQL injection. Jak je to možné implementovat dobře ukazují na w3schools.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
1.2.2019 15:39
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
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 8 zpráv z 8.