Autor | Zpráva | ||
---|---|---|---|
Petr Sikora Profil |
Prosím Vás o radu. Mám počítadlo přístupu, které z části funguje, ale potřeboval bych poradit. Jedna se o tohle. Mam IP adresu pokud je IP uz v databazi a alespoň hodina mezi dvěma navštěvama tak se zapiše do databaze. Pokud dana IP ještě není v databázi pak se automaticky přičte. Ukladam do databaze nejenom IP adresu ale take mesic ve formatu date('m') a den ve formatu date('j') a take cas ve formatu mktime. Zatím to jde. Teď bych potřeboval aby se mi z databaze vypsalo pouze číslo, které by udávalo počet záznamu celkem počet záznamu za aktuální měsíc a počet záznámu za aktuální den. Myslím jestli se to dá řešit pomoci nějake funkce SQL. Díky za radu. Příkládám SCRIPT. Jeste u funkce $celkem_pocet mi to vyhodi tuto hodnotu (Resource id #4) a u tech ostatnich nic.
<?php $ip = $_SERVER['REMOTE_ADDR']; $mesic = date('m'); $den = date('j'); $cas = mktime(date('H'))."\n"; $limit =3600; @$spojeni = mysql_connect('localhost','root','','turnaje')OR die ('<p>Nepodařilo se připojit k serveru</p>'); print '<p>Podařilo se připojit k serveru</p>'; @mysql_select_db('turnaje')OR die ('<p>Nepodařilo se připojit k databazi</p>'); print '<p>Podařilo se připojit k databazi</p>'; $celkem = mysql_query("SELECT * FROM pocitadlo_celkem ORDER BY id DESC"); $vysl_celkem = mysql_fetch_array($celkem); if ($ip == $vysl_celkem['ip'] AND $cas >=$vysl_celkem['cas'] + $limit){ $celkem = mysql_query("SELECT * FROM pocitadlo_celkem ORDER BY id DESC"); $celkem = mysql_query("INSERT INTO pocitadlo_celkem (ip,mesic,den,cas) VALUES ('$ip','$mesic','$den','$cas');"); } elseif ($ip != $vysl_celkem['ip']){ $celkem = mysql_query("SELECT * FROM pocitadlo_celkem ORDER BY id DESC"); $celkem = mysql_query("INSERT INTO pocitadlo_celkem (ip,mesic,den,cas) VALUES ('$ip','$mesic','$den','$cas');"); } $pocet_celkem = mysql_query("SELECT COUNT(ip) FROM pocitadlo_celkem"); $pocet_mesic = mysql_query("SELECT mesic FROM pocitadlo_celkem WHERE mesic==$mesic ORDER BY id DESC"); $pocet_den = mysql_query("SELECT den FROM pocitadlo_celkem WHERE den==$den ORDER BY id DESC"); echo '<table class="sirka200"> <tbody>'; echo "<tr><td>", "Celkem","</td><td>", $pocet_celkem,"</td></tr><tr><td>", "Měsic","</td><td>", $pocet_mesic,"</td></tr><tr><td>", "Dnes","</td><td>", $pocet_den,"</td></tr>"; echo '</tbody> </table>'; mysql_free_result($pocet_celkem); mysql_free_result($pocet_mesic); mysql_free_result($pocet_den); mysql_close($spojeni); ?> |
||
Alphard Profil |
#2 · Zasláno: 9. 10. 2010, 23:47:06
Je to dost zmatené, vážně je nutné tolik dotazků a v takovém rozsahu? Nezapomínejte, že zbytečné databázové dotazy (významně) zpomalují aplikaci.
Není zřejmé, v jakém datovém typu ukládáte časy. Pokud nepoužíváte k tomu určené typy, podívejte se na 10.3.1. The DATETIME, DATE, and TIMESTAMP Types. „WHERE mesic==$mesic“ V MySQL se nepoužívá operátor ==. |
||
Keeehi Profil |
#3 · Zasláno: 10. 10. 2010, 00:17:25 · Upravil/a: Keeehi
Nevypadá toto lépe?
<?php $ip = $_SERVER['REMOTE_ADDR']; $limit =3600; @$spojeni = mysql_connect('localhost','root','heslo k databázi') OR die ('<p>Nepodařilo se připojit k serveru</p>'); print '<p>Podařilo se připojit k serveru</p>'; @mysql_select_db('turnaje',$spojeni) OR die ('<p>Nepodařilo se připojit k databazi</p>'); print '<p>Podařilo se připojit k databazi</p>'; $result = mysql_query("SELECT 1 FROM pocitadlo_celkem WHERE ip = '$ip' AND cas > now() - INTERVAL $limit SECOND"); if (mysql_num_rows($result)==0) mysql_query("INSERT INTO pocitadlo_celkem (ip,cas) VALUES ('$ip',now())",$spojeni); $result_celkem = mysql_query("SELECT COUNT(*) FROM pocitadlo_celkem",$spojeni); $pocet_celkem=mysql_result($result_celkem,0); $result_mesic = mysql_query("SELECT COUNT(*) FROM pocitadlo_celkem WHERE cas > now() - INTERVAL 1 MONTH",$spojeni); $pocet_mesic=mysql_result($result_mesic,0); $result_den = mysql_query("SELECT COUNT(*) FROM pocitadlo_celkem WHERE cas > now() - INTERVAL 1 DAY",$spojeni); $pocet_den=mysql_result($result_den,0); echo '<table class="sirka200">'; echo "<tr><td>Celkem</td><td>$pocet_celkem</td></tr>"; echo "<tr><td>Měsic</td><td>$pocet_mesic</td></tr>"; echo "<tr><td>Dnes</td><td>$pocet_den</td></tr>"; echo '</table>'; mysql_close($spojeni); ?> |
||
Petr Sikora Profil |
#4 · Zasláno: 10. 10. 2010, 12:58:09
Skvělé. Díky moc za skript. Je o hodně lepší než ten můj předchozí. Jenom mám takový dotaz. Co když se daná IP adresa nebude nacházet v databázi? Bude také přičtená. Chtěl bych totíž příčíst jak IP která je už v databázi a její časový odstup je hodinový tak i IP adresu, která zatím vůbec není v databázi. Předem díký za odpověď.
|
||
Keeehi Profil |
#5 · Zasláno: 10. 10. 2010, 13:13:03
Provedl jsem změnu ve scriptu [#3], neboť jsem tam měl logickou chybu.
Petr Sikora: „Co když se daná IP adresa nebude nacházet v databázi? Bude také přičtená.“ Ano. Script kontroluje, zda je v databázi záznam který je má čas větší než je aktuální - interval. Pokud tam žádný takový není, vytvoří nový s aktuálním časem. Když daná IP v db vůbec není, zase se vrátí 0 řádků a provede se uložení. |
||
Petr Sikora Profil |
#6 · Zasláno: 10. 10. 2010, 14:37:31
Jo díky moc už to funguje tak jak má...ještě jednou velké díky.....
|
||
zedna Profil * |
#7 · Zasláno: 12. 10. 2010, 19:42:31
děkuji toto jsem potřeboval jako základ pro script na ochranu proti přetížení serveru při hromadném hackerském útoku
http://image.all4all.cz/show.php/235_utoktureckychhackerunaall4all.cz.jpg.html |
||
Keeehi Profil |
#8 · Zasláno: 12. 10. 2010, 19:59:35
zedna:
Jak to souvisí s dotazem? |
||
zedna Profil * |
#9 · Zasláno: 12. 10. 2010, 21:17:06
Keeehi:
jen jsem děkoval za diskuzi i a script |
||
zedna Profil * |
#10 · Zasláno: 12. 10. 2010, 21:18:54
záznam IP adresy is časem lze použít jako ochrana proti nějakému dos útoku nebo přetížení serveru. když se IP adresa připojí mnohokrát během jedné minuty, jednoduše ji lze zablokovat. kdybych tohle věděl před 3 dny, bylo by líp
|
||
tiso Profil |
#11 · Zasláno: 12. 10. 2010, 21:46:50
zedna: ak na teba príde naozajstný DOS, nemáš kedy na výber a ukladanie dát do databázy, takže takáto ochrana ti nepomôže.
|
||
zedna Profil * |
#12 · Zasláno: 13. 10. 2010, 17:34:40
vyřešil jsem to jinak, když se během minuty připojí nadměrný počet lidí (tak, že kdyby to pokračovalo,zatížilo by to server),jednoduše se přepíše htaccess na deny from all a po určité době se zase přepíše na povoleno...vyzkoušeno, funguje, pokud to robot bude zkoušet pořád, vyjde mu to třeba jen v 5 vteřinách z minuty
|
||
Časová prodleva: 14 let
|
0