Od 15. do 21.4. slevy 20 až 80% v sekci C/C++. Když ne teď, tak kdy?
Vyšlehej si extra vědomosti! Až 100% bodů na prémiový obsah zdarma! Více zde

Diskuze: MySQLi dotaz

Aktivity (2)
Avatar
Vejv-cz
Člen
Avatar
Vejv-cz:31. ledna 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. ledna 14:45
Avatar
Odpovídá na Vejv-cz
Michal Šmahel:31. ledna 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. ledna 14:57
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Vejv-cz
Člen
Avatar
Vejv-cz:31. ledna 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. ledna 16:04
Avatar
Vejv-cz
Člen
Avatar
Odpovídá na Vejv-cz
Vejv-cz:31. ledna 16:10

Oprava chyby v databázi.

 
Nahoru Odpovědět 31. ledna 16:10
Avatar
Odpovídá na Vejv-cz
Michal Šmahel:31. ledna 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. ledna 19:29
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:1. února 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. února 7:52
 
Nahoru Odpovědět 1. února 7:50
Avatar
Vejv-cz
Člen
Avatar
Vejv-cz:1. února 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. února 9:26
Avatar
Odpovídá na Vejv-cz
Michal Šmahel:1. února 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í
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 1. února 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.