Diskuze: Ověření jmen v databázi
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 31 zpráv z 31.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
No teď ale vědět jak to zapsat 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é.
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_hrac"] 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.
Ale také to musíš ošetřit ten dotaz ne že to tam napřímo napíšeš
. ID si vytáhneš pokud si
ho tam napíšeš do SELECT že ho chceš vytáhnout.
Proveď to rovnou v SQL dotazu a pokud záznam bude existovat, tak je registrovaný.
if (count($vysledek) > 0)
{
$error = "Jsi registrovaný";
}
tak nějak asi.
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š
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_hrac"] OR druhy_hrac
a ve druhém
SELECT prvni_hrac, druhy_hrac FROM duo_tymy where druhý_hrac =
$_POST["prvni_hrac"] 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.
To mě taky napadlo a tomu jsem se chtěl právě vyhnout 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
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.
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.
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š.
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
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_hrac'] nebo je
neprázdné $Nickname_duo['druhy_hrac']) a zároveň ( je neprázdné
$_POST['prvni_hrac_duo'] nebo je neprázdné $_POST['druhy_hrac_duo']). 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_hrac_duo'], $_POST['druhy_hrac_duo'],
$_POST['prvni_hrac_duo'], $_POST['druhy_hrac_duo'].
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
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á).
No, tak nakonec jsem to udělal na prasáka, jak říkal andrasi.m
$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ý!";
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
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.
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
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í
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.
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...
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?
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!";
}
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á.
Zkusím to použít, děkuji mooc
Zobrazeno 31 zpráv z 31.