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
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
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);
?>
Databáze je pozměněna: ip zůstává, mesic a den jsou odstraněny, cas je formátu datetime.
Petr Sikora
Profil
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
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
Jo díky moc už to funguje tak jak má...ještě jednou velké díky.....
zedna
Profil *
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
zedna:
Jak to souvisí s dotazem?
zedna
Profil *
Keeehi:
jen jsem děkoval za diskuzi i a script
zedna
Profil *
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
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 *
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

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0