Předvánoční Black Friday Předvánoční Black Friday
Až 80% zdarma! Předvánoční BLACK FRIDAY akce. Více informací

Diskuze: Ověření jmen v databázi

PHP PHP Ověření jmen v databázi American English version English version

Aktivity (1)
Avatar
Tomáš Kretek:9. července 15:01

Ahoj potřebuju vytáhnout z databáze zaregistrované jména, abych mohl ověřit, jestli je tam můžu zapsat. Momentálně to dělá to, že to úplně do prázdné databáze zapíše, ale když už je tam jeden řádek s registrovaným týmem a zkusí se registrovat druhý co má jiné jména, už to přes tu podmínku neprojde. Poradí mi někdo prosím? Už nad tím sedím půl dne a na nic jsem nepřišel. Děkuji moc :)

Zkusil jsem: Zkouším to s tímto kódem, ale nefunguje mi to

$Nickname_duo = Db::queryOne('
                        SELECT prvni_hrac, druhy_hrac
                        FROM duo_tymy
                ');
                                if(($Nickname_duo['prvni_hrac'] || $Nickname_duo['druhy_hrac']) == ($_POST['prvni_hrac_duo'] || $_POST['druhy_hrac_duo'])){
                                        $hlaska_reg="Některý z hráčů již je v turnaji zaregistrovaný!";
                                }

zkošel jsem to i s těma jinýma verzema toho querry, ale vždycky to dělalo něco jiného.

Chci docílit: Vlastně se jedná o registraci do turnaje, údaje se odešlou z formu do php a to je pošle do databáze a uloží. Chybí mi ta poslední podmínka a nechci to rozepisovat jedno po druhém, když to určitě jde i rychleji.

 
Odpovědět 9. července 15:01
Avatar
andrasi.m
Člen
Avatar
andrasi.m:9. července 15:29

Osobně tu podmínku co máš ty bych asi nepoužil. Není lepší si vytáhnout pole a zjistit jestli v poli už někdo z nich je? A pak dále pokračoval? Možná více práce, ale lepší než nad tím sedět den. Možná ale blbě chápu :)

 
Nahoru Odpovědět 9. července 15:29
Avatar
Odpovídá na andrasi.m
Tomáš Kretek:9. července 15:34

No teď ale vědět jak to zapsat :D Kdybych z té databáze tahal všechno do pole, tak vytáhnu i ID a to je zbytečné. Nejsem si totiž moc jistý jak které to Querry pracuje, ikdyž je to tam napsané.

Editováno 9. července 15:36
 
Nahoru Odpovědět 9. července 15:34
Avatar
andrasi.m
Člen
Avatar
Odpovídá na Tomáš Kretek
andrasi.m:9. července 15:46

Podle mě se ta proměnná nechytá a proto ti to blbne.

Jestli ti to vrací už pole tak stačí podle mě jen porovnat $_POST s tou tvojí databází.

Mimochodem a proč to neuděláš přímo v dotazu? uděláš tam where prvni_hrac = $_POST["prvni_hra­c"] and $_POST["druhy_hrac"]

Pokud ti to vrátí $vysledek který se bude rovnat více jak 0 tak záznam existuje. V opačném případě můžeš zapisovat.

 
Nahoru Odpovědět 9. července 15:46
Avatar
andrasi.m
Člen
Avatar
Odpovídá na andrasi.m
andrasi.m:9. července 15:48

Ale také to musíš ošetřit ten dotaz :) ne že to tam napřímo napíšeš :D. ID si vytáhneš pokud si ho tam napíšeš do SELECT že ho chceš vytáhnout.

Editováno 9. července 15:49
 
Nahoru Odpovědět 9. července 15:48
Avatar
Odpovídá na Tomáš Kretek
Uživatel sítě :9. července 15:50

Proveď to rovnou v SQL dotazu a pokud záznam bude existovat, tak je registrovaný.

Nahoru Odpovědět  -1 9. července 15:50
Chybami se člověk učí, běžte se učit jinam!
Avatar
andrasi.m
Člen
Avatar
Odpovídá na andrasi.m
andrasi.m:9. července 15:58

if (count($vysledek) > 0)
{
$error = "Jsi registrovaný";
}

tak nějak asi.

 
Nahoru Odpovědět 9. července 15:58
Avatar
Odpovídá na andrasi.m
Tomáš Kretek:9. července 16:08

Jak zajistíš ale tím, že ověříš prvního hráče těma dvěma, že to není třeba napsané naopak ty jména a ten použitý nick je v tom poli druhy hrac? Jestli mě chápeš

 
Nahoru Odpovědět 9. července 16:08
Avatar
andrasi.m
Člen
Avatar
andrasi.m:9. července 16:14

jo vím co myslíš. Nevím ale jak moc jsi v SQL dotazech daleko. Ono to jde udělat dotazem.

Nebo na prasáka.
Uděláš dva dotazy a na první dotaz použiješ

SELECT prvni_hrac, druhy_hrac FROM duo_tymy where prvni_hrac = $_POST["prvni_hra­c"] OR druhy_hrac
a ve druhém
SELECT prvni_hrac, druhy_hrac FROM duo_tymy where druhý_hrac = $_POST["prvni_hra­c"] OR druhy_hrac

pokud se ti $vysledek a $vysledek 2 vrátí s count 0 tak je to cajk. Pokud ne tak Hodíš chybu. Ale jde to udělat i v SQL, ale na to momentálně nemám úplně skill z fleku takto střelit :)

Pokud je to easy formulář a je vpohodě načítání tak dva selekty jdou ok.

 
Nahoru Odpovědět 9. července 16:14
Avatar
Odpovídá na andrasi.m
Tomáš Kretek:9. července 16:19

To mě taky napadlo a tomu jsem se chtěl právě vyhnout :D Ale. nejde zapsat WHERE prvni_hrac OR druhy_hrac = ? OR ?. Do otazníku hodíš potom zvlášť POSTy.

Druhá věc je že tohle je pro dva hráče. Potom bude ještě pro 4 a to roztahovat fakt nechci :D

 
Nahoru Odpovědět 9. července 16:19
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Tomáš Kretek
petr.jouza:9. července 16:32

Ahoj,
jak si to tak pročítám, tak bych se zamyslel nad konstrukcí databáze... máš to zbytečně složité...

Jestli chápu správně, tak nyní máš:
tabulka uživatelů... tam je x uživatelů

a pak máš tabulku hry se sloupcemi 1. hráč | 2. hráč atd...

Na to se blbě píšou dotazy.

pokud si uděláš tzv. vazební tabulku, kde budeš mít
id hry | hrac, tak to můžeš procházet velice jednoduše. do WHERE dáš id hry a hráče a máš to... buď je nebo není.

Jestli to chápu špatně, tak napiš jak máš udělané tabulky v databázi.

 
Nahoru Odpovědět  +1 9. července 16:32
Avatar
Tomáš Kretek:9. července 16:48

Já mám vždycky tym_id | prvni_hrac | druhy_hrac

Takže vlastně při každé registraci ti dva jsou jako tým, jsou v jednom řádku, s tím, že se každému týmu zvýší id o 1.

mám to tak schválně rozdělnené, protože ty hry jsou 3 a každá je jinačí typ.

 
Nahoru Odpovědět 9. července 16:48
Avatar
andrasi.m
Člen
Avatar
andrasi.m:9. července 16:56

Jsem to blbě napsal s tím selectem. Jsem nepřemýšlel. No jo už jsem byl dlouho v práci. Ještě mě napadá jedno řešení s whilem kde se jednou dotážu na uživatele prvního a pak na druhého, Takže ve výsledku budu mít 4 dotazy. Není to tedy super řešení....

Mořná by šlo to groupnout na uživatele jednoho a pak na druhého. Jak píše kolega nahoře. takto máš vlastně v jednom řádku dva záznamy a blbě se na to pak dělá dotaz. Jde to ale je to dřina :) kdyby jsi to měl v tabulce tak "Hráči" tak tam je to jen o selectu.

Takto budeme dělat komba. I ty hry jsou dělat do tabulek a přiřazovat skupině určitý id hry atd. Ono databáze je základ. Jak si ji navhrneš tak s ní pracuješ.

 
Nahoru Odpovědět 9. července 16:56
Avatar
Odpovídá na Tomáš Kretek
Matúš Olejník:9. července 17:43

Keby si mal tabuľky

Player - id, name
Game - id, type
duo_tymy - id, playerId, gameId

Select * from duo_tymy
Join player on playerId = player.id
Join game on gameId = game.id
Where player.name like 'meno1' or player.name like 'meno2'
And type = typHry

A keď sa ti vrátia 2 záznamy tak už existuje tím pre daný typ hry, ktorý je zložený práve z tých dvoch hráčov

Nahoru Odpovědět 9. července 17:43
/* I am not sure why this works but it fixes the problem */
Avatar
Petr Čech
Redaktor
Avatar
Petr Čech:9. července 18:24

Ale fuj:

($Nickname_duo['prvni_hrac'] || $Nickname_duo['druhy_hrac']) == ($_POST['prvni_hrac_duo'] || $_POST['druhy_hrac_duo'])

Asi si dokážu představit, jak si myslíš, že by to mělo fungovat, ale mohu tě ujistit, že to tak fungovat nebude. Teď říkáš, že podmínka projde jen pokud (je neprázdné $Nickname_duo['prvni_hra­c'] nebo je neprázdné $Nickname_duo['dru­hy_hrac']) a zároveň ( je neprázdné $_POST['prvni_hra­c_duo'] nebo je neprázdné $_POST['druhy_hrac_du­o']). To je naprosto začátečnická chyba, která nefunguje v žádném jazyku.
Ta podmínka se zkrátka nedá napsat nějak na jeden řádek.

Tvůj problém bych asi řešil na úrovni databáze cca takto:

SELECT 1 FROM duo_tymy WHERE (
  prvni_hrac IN (?,?)
) OR (
  druhy_hrac IN (?,?)
)

, kde parametry budou
$_POST['prvni_hra­c_duo'], $_POST['druhy_hrac_du­o'], $_POST['prvni_hra­c_duo'], $_POST['druhy_hrac_du­o'].

Pokud dotaz vrátí nějaký výsledek, vznikla by duplicita a podmínka by neměla projít.

Načítat všechna id nebo páry je hovadina, protože

  1. bude se muset zbytečně moc dat
  2. bude to pomalé, protože hledání v poli bude pomalejší než databáze, která je na to optimalizovaná (především pokud si přidáš indexy)

Z databáze by ideálně mělo lézt jen skutečně to, co potřebuješ a ne něco k mezivýpočtu, co data třeba zredukuje na true/false. Databáze to většinou zvládne, jen si to musíš nastudovat.
PS: pokud nevíš, co jsou ty otazníky, tak to jsou parametrizované dotazy, suprová věc (a hlavně bezpečná).

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +3 9. července 18:24
the cake is a lie
Avatar
Tomáš Kretek:9. července 18:59

No, tak nakonec jsem to udělal na prasáka, jak říkal andrasi.m :D

$Nickname1_duo = Db::querySingle('
                        SELECT COUNT(*)
                        FROM duo_tymy
                                                WHERE prvni_hrac=?
                                                LIMIT 1
                ', $_POST['prvni_hrac_duo']);
                        $Nickname2_duo = Db::querySingle('
                        SELECT COUNT(*)
                        FROM duo_tymy
                                                WHERE druhy_hrac=?
                                                LIMIT 1
                ', $_POST['druhy_hrac_duo']);
                                if($Nickname1_duo || $Nickname2_duo){
                                        $hlaska_reg="Některý z hráčů již je v turnaji zaregistrovaný!";
 
Nahoru Odpovědět 9. července 18:59
Avatar
Odpovídá na Petr Čech
Tomáš Kretek:9. července 19:07

Dobře tak to tvoje funguje taky a je to jednodušší a asi i rychlejší. Děkuji moc. Kdybych s tím měl zkušenosti a věděl jak to zapsat, tak tady s tím nebudu otravovat :D

 
Nahoru Odpovědět 9. července 19:07
Avatar
Odpovídá na Petr Čech
Tomáš Kretek:9. července 21:44

Můžu se tě teda ještě zeptat, proč nefunguje tohle?

$hrac_neexistuje = Db::query('
                        SELECT 1 FROM hraci_online WHERE (Nickname IN (?,?))', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if($hrac_neexistuje){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }

Má to zjistit, jestli jeden nebo druhý účet je registrovaný na webu.

 
Nahoru Odpovědět 9. července 21:44
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Tomáš Kretek
Petr Čech:9. července 21:56

Nefunguje ve smyslu, že to spadne, nebo ve smyslu nechová se to, jak bys očekával? Mimochodem, je hodně moc špatný nápad pojmenovávat proměnné opačně k jejich významu :-`

Nahoru Odpovědět 9. července 21:56
the cake is a lie
Avatar
Odpovídá na Petr Čech
Tomáš Kretek:9. července 22:05

Nespadne, ale ta podmínka se plní pořád.

 
Nahoru Odpovědět 9. července 22:05
Avatar
Tomáš Kretek:9. července 22:09

Upravil jsem to takhle:

$hrac_existuje = Db::query('
                        SELECT 1 FROM hraci_online WHERE (Nickname IN (?,?))', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if(!$hrac_existuje){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }

A už to vypadá že to funguje. Vlastně jsem to opravil díky tomu pojmenování :D

 
Nahoru Odpovědět 9. července 22:09
Avatar
Tomáš Kretek:9. července 22:15

Tak nefunguje. Achjo.

 
Nahoru Odpovědět 9. července 22:15
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Tomáš Kretek
petr.jouza:10. července 6:59

Musíš to mít jako Db::querySingle a k tomu jak se ti vrací sloupec 1 udělej COUNT(1).

Tedy takto:

$hrac_existuje = Db::querySingle('
                        SELECT COUNT(1) FROM hraci_online WHERE (Nickname IN (?,?))', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if(!$hrac_existuje){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }

Ještě bych ti v tomto případě doporučil to olimitovat LIMIT 1 - jak SQL narazí na první výsledek, skončí prohledávání.

Sice nevím odkud jsi se PHP a MySQL učil, ale měl by sis projít zdejší tutoriály o PHP a databázích v PHP pro začátečníky. Také jsem začínal jako samouk a hodně mi to tady pomohlo. Když to pilně nastuduješ, tak pak nemusíš řešit školácké chyby a nebudeš si do budoucna přidělávat zbytečnou práci předěláváním kódu.

 
Nahoru Odpovědět 10. července 6:59
Avatar
Odpovídá na petr.jouza
Tomáš Kretek:10. července 9:14

Nemůžu to omezit na 1, protože já potřebuju, aby tam byli oba hráči registrovaní. Takže tam dám LIMIT 2, ale stejně to nefunguje...

 
Nahoru Odpovědět 10. července 9:14
Avatar
Odpovídá na petr.jouza
Tomáš Kretek:10. července 9:19

Ta podmínka prostě někdy fungue a někdy ne.

 
Nahoru Odpovědět 10. července 9:19
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Tomáš Kretek
petr.jouza:10. července 9:23

to by bylo dost divné... a to máš v databázi skutečně pojmenovaný sloupec "1"?

Nějak tedy nechápu co tím SQL dotazem chceš docílit... v erroru máš chybu: "Nějaký z uvedených hráčů není zaregistrovaný na našem webu!" a tím bych řekl, že chceš zkontrolovat, zda přihlašovaný uživatel vůbec v databázi existuje... nebo ne?

 
Nahoru Odpovědět 10. července 9:23
Avatar
Tomáš Kretek:10. července 9:28

Ano přesně tak.

 
Nahoru Odpovědět 10. července 9:28
Avatar
petr.jouza
Člen
Avatar
Odpovídá na Tomáš Kretek
petr.jouza:10. července 12:06

Tak tím pádem ti stačí to provést takto:

$hrac_existuje = Db::querySingle('
                        SELECT COUNT(1) FROM hraci_online WHERE Nickname = ? OR Nickname = ? LIMIT 1)', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if(!$hrac_existuje){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }

Ten LIMIT nemusíš mít nastavený na 2... pokud jeden z nich nebude v databázi, tak ti stejně ta podmínka neprojde. Pak je jedno jestli je jeden nebo jsou dva. prostě tam není.

Nebo pokud chceš, aby to bylo vždy 2, tak podmínka pak musí být:

$hrac_existuje = Db::querySingle('
                        SELECT COUNT(1) FROM hraci_online WHERE Nickname = ? OR Nickname = ? LIMIT 2)', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if($hrac_existuje != 2){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }
 
Nahoru Odpovědět 10. července 12:06
Avatar
petr.jouza
Člen
Avatar
Odpovídá na petr.jouza
petr.jouza:10. července 12:08

Ještě mě napadlo... nevím co máš v tom sloupci 1 ale spíš bych tedy udělal:

$hrac_existuje = Db::querySingle('
                        SELECT COUNT(Nickname) FROM hraci_online WHERE Nickname = ? OR Nickname = ? LIMIT 2)', $_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo']);
                                if($hrac_existuje != 2){
                                        $hlaska_reg="Nějaký z uvedených hráčů není zaregistrovaný na našem webu!";
                                }

Počítáš uživatelská jména... pokud by sloupec nazvaný "1" měl hodnotu NULL, tak se ti nezapočítá.

 
Nahoru Odpovědět  +1 10. července 12:08
Avatar
Tomáš Kretek:10. července 12:31

Zkusím to použít, děkuji mooc :)

 
Nahoru Odpovědět  +1 10. července 12:31
Avatar
Odpovídá na Uživatel sítě
Matěj Strnad:11. července 9:07

Mělo to být +1

Nahoru Odpovědět  +1 11. července 9:07
Ty vaše internety!
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 31 zpráv z 31.