Diskuze: MySQLi dotaz

Člen

Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.
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ů.
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:
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číš.
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.
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
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.
Zobrazeno 8 zpráv z 8.