Autor Zpráva
nodo
Profil
Zdravím.
Mám tabulku logins - id, attempts, usercode, login(datetime), stav(enum:ano-nie)

Do attempts sa ukladá počet nesprávnych pokusov o prihlásenie, do loginu aktuálny čas zápisu do databázi a a po troch neúsppešných pokusoch stav sa prepíše na ano. Užívateľ sa na 30 minút zablokuje. Nepodarí sa sprejazdniť výppis touto formou, trápim sa s tým už od rána. už som rozmýšlal či tam netreba do DB zapísať nie aktuálny čas, ale čas o 30 minút.

výpi vyzerá takto:
$query1 = "SELECT * FROM logins WHERE usercode='$usercode', stav='ano' and login BETWEEN DATE_SUB(NOW()- INTERVAL 30 minutes) LIMIT 1";

Vedel by ma niekto nasmerovať, kde robím chybu. Ďakujem za odpovede.
Tomášeek
Profil
nodo:
A co hlásí SQL error?

Minimálně je špatně čárka ve WHERE podmínce.
Pak i ten interval by IMHO měl být 30 minute (nikoliv 30 minutes).
nodo
Profil
Tomášeek:

A co hlásí SQL error?

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ' stav='ano' and login BETWEEN DATE_SUB(NOW()- INTERVAL 30 minute) LIMIT 1' at line 1
Tomášeek
Profil
nodo:
Ano, syntaktická chyba. Dokonce víš přesně kde. Navíc o té jsem ti už psal.
nodo
Profil
Tomášeek:
Ano, syntaktická chyba. Dokonce víš přesně kde. Navíc o té jsem ti už psal.
Prisahám, neviem. Hrám sa tu s tým, ale neviem aká čiarka.


$query1 = "SELECT * FROM logins WHERE login='BETWEEN DATE_SUB(NOW()- INTERVAL 30 minute)' and usercode = '$usercode' and stav='ano' LIMIT 1";
SQL error nehlási nič, ale ani to nefunguje
Kajman
Profil
SELECT * FROM logins WHERE login='BETWEEN DATE_SUB(NOW()- INTERVAL 30 minute)' and usercode = '$usercode' and stav='ano' LIMIT 1
Syntakticky to je asi dobře, ale ve sloupci login asi nikdy nebude řetězec 'BETWEEN DATE_SUB(NOW()- INTERVAL 30 minute)', když to je datetime. Takže dotaz nevrátí žádný řádek.

Between potřebuje dva parametry hranice minimum a maximum. Vzhledem k tomu, že budoucí záznamy se neočekávají, between bych nepoužíval a dal obyčejné většítko.
SELECT * FROM logins WHERE login > DATE_SUB(NOW()- INTERVAL 30 minute) and usercode = '$usercode' and stav='ano' LIMIT 1

Edit: A Nezapomeňte $usercode správně escapovat.
nodo
Profil
Kajman:
SELECT * FROM logins WHERE login > DATE_SUB(NOW()- INTERVAL 30 minute) and usercode = '$usercode' and stav='ano' LIMIT 1
Pri tomto hlási tú istú syntaktickú chybu. Pri nižšie uvedenej zmene zase žiadna chybová hláška, ale nič sa ani nedeje. Login je datetime, preveril som si to. Som samouk, vždy som si veci dohladal, naučil. Teray som sa zasekol poriadne.
$query1 = "SELECT * FROM logins WHERE login > 'NOW()+INTERVAL 30 minute' and usercode = '$usercod' and stav='ano' LIMIT 1";
Tomášeek
Profil
nodo:
V kajmanove dotazu syntaktická chyba neni.
Ve tvém dotazu take ne, tam je logická chyba (hledas v datetime sloupci nesmyslný string).
Keeehi
Profil
Pri tomto hlási tú istú syntaktickú chybu
Těžko to může hlásit stejnou syntaktickou chybu. Vlastně ano může. V případě, že jsi soubor zapomněl uložit nebo nahrát na server. Tak Kajmanův dotaz zkus ještě jednou, pomalu a dej si pozor abys v procesu na nic nezapomněl.

Nebo to byla jiná chyba.
Kajman
Profil
Ještě tam zůstala chyba, nevšiml jsem si, že ve funkci date_sub má jeden parametr (tedy, že tam má mínus a ne čárku).

Lze použít
login > NOW() - INTERVAL 30 minute
nebo
login > DATE_SUB(NOW(), INTERVAL 30 minute)
nodo
Profil
Keeehi:
Nezabudol som uložiť, nič také. Problém bol inde, do teraz som sa s tým hral.

 $query1 = "SELECT * FROM logac WHERE logins > NOW() - INTERVAL 30 minute and usercode = '$usercode' and stav='ano' LIMIT 1";

Takto to funguje na 100%. Veľmi pekne ďakujem každému.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0