Autor Zpráva
Ježišek
Profil *
Ahoj,

mám v databázi několikrát obsažený jeden řetězec, někdy číslo, potřebuji, aby
se mi vypsalo, kolikrát v databázi je použito číslo 10 a kolikrát 15 a kolikrát 20...

Tudiž... mam v databazi například 150 různých čísel a potřebuji vědět, kolikrát je které zastoupené.

Lze to napsat tak, že těch 150 dáte do jedné proměnné :-)

$nejake_cislo 



Děkuji :-)
Akacko
Profil
Ježišek:
Lepší je to dělat pomocí SQL
Např. v MySQL takto:
$nejake_cislo = mysql_result(mysql_query('SELECT COUNT(*) FROM tabulka WHERE sloupec_s_cislem=10'),0);
Apod.
Ježišek
Profil *
Budu konkrétní

Vypisuji 150 IP adres...

které jsou v tabulce vstupy_testovani
pod názvem ip_adresa

ted potřebuji, aby se mi vypsali všechny adresy a kolikrát sou v db...

//berme v potaz, že všechny IP adresy jsou ve stejné tabulce a sloupku :-)
Ježišek
Profil *
Nebo ještě jinak... vypsat jen tu adresu podle SQL

where id=' . (int) $_GET['id']


Takže, teď mam adresu a potřebuji, aby se mi vypsal její počet obsažení v db
Alphard
Profil
Ježišek:
Viz [#2] funkce count() vám spočítá řádky.
select ip_adresa, count(ip_adresa) pocet from vstupy_testovani group by ip_adresa order by pocet desc

a když budete chtít počet konkrétní IP, tak
select count(ip_adresa) from vstupy_testovani where id = 123
Ježišek
Profil *
zde je aktuální kód:

					<?
	$pocet_ip = mysql_query('select count(ip_adresa) from vstupy_testovani WHERE id= $row[ID] ');	
	
  $result = mysql_query('SELECT ID,ip_adresa,cas_zaznamenani,http_agent,pc_hostname FROM vstupy_testovani ORDER by ID desc LIMIT 200');
  while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
   echo "

<tr>
						<td><img src='img/login-icon.gif' width='16' height='16'/> #$row[ID] <br> Tato ip je evidována již $pocet_ip x</td>
						<td class='first style1'><font color='#00000'>$row[ip_adresa]</font><br> - $row[cas_zaznamenani]</td>
						<td>$row[pc_hostname]</td>
						<td><a href='vstup.php?id=$row[ID]'><img src='img/edit-icon.gif' width='16' height='16'/></a></td>
						<td><a href='smaz.php?id=$row[ID]'><img src='img/hr.gif' width='16' height='16' /></a></td>
					</tr>

   
   
";
}
?>
Ježišek
Profil *
ale mmnt ! pocet neni registrovat v databazi...

pocet se musi vytvořit, tudiž se musí nastavit to, aby pocet_ip = poctu ip adresy v podmince $row[ID]

doufám,že víš jak to myslím... ten počet není nikde definovan, ten se musí vypočítat
Ježišek
Profil *
http://milankubik.info/login/index.php
Alphard
Profil
A teď ten dotaz takhle:
$result = mysql_query('SELECT
  t.ID, t.ip_adresa, t.cas_zaznamenani, t.http_agent, t.pc_hostname,
  m.pocet
FROM vstupy_testovani t
  left join (select ip_adresa, count(ip_adresa) pocet from vstupy_testovani group by ip_adresa) m on t.ip_adresa = m.id_adresa
ORDER by t.ID desc
LIMIT 200');
Ježišek
Profil *
a nic....
Alphard
Profil
Ježišek:
a nic....
Taky mě to přestává bavit, vytvořil jsem si testovací tabulku, abych zjistil, že jsem jen přepsal ip_adresa na id_adresa.

Povede tohle konečně k cíli?

$result = mysql_query('SELECT
  t.ID, t.ip_adresa, t.cas_zaznamenani, t.http_agent, t.pc_hostname,
  m.pocet
FROM vstupy_testovani t
  left join (select ip_adresa, count(ip_adresa) pocet from vstupy_testovani group by ip_adresa) m on t.ip_adresa = m.ip_adresa
ORDER by t.ID desc
LIMIT 200');


A rovnou zopakuji svou dřívější otázku, ať z toho neděláme chat:
Tohle teda počítá všechny IP v tabulce, nejen z posledních 200 záznamů, chcete to omezit, nebo ne?

PS: Začínám se v tom tady ztrácet, smažu několik předchozích příspěvků, které stejně nikomu nepomůžou.
Ježišek
Profil *
<?
					
		$result = mysql_query('SELECT
  t.ID, t.ip_adresa, t.cas_zaznamenani, t.http_agent, t.pc_hostname,
  m.pocet
FROM vstupy_testovani t
  left join (select ip_adresa, count(ip_adresa) pocet from vstupy_testovani group by ip_adresa) m on t.ip_adresa = m.ip_adresa
ORDER by t.ID desc
LIMIT 200');
 while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
   echo "

<tr>
                        <td><img src='img/login-icon.gif' width='16' height='16'/> #$row[ID] <br> <font color='red'><b>Upozornění</b></font> $row[pocet] x</td>
                        <td class='first style1'><font color='#00000'>$row[ip_adresa]</font><br> - $row[cas_zaznamenani]</td>
                        <td>$row[pc_hostname]</td>
                        <td><a href='vstup.php?id=$row[ID]'><img src='img/edit-icon.gif' width='16' height='16'/></a></td>
                        <td><a href='smaz.php?id=$row[ID]'><img src='img/hr.gif' width='16' height='16' /></a></td>
                    </tr>

   
   
";
}

?>


Funguje, díky :-)
Ježišek
Profil *
Ještě jsem se chtěl zeptat, vím, že už asi mě pošleš někam, ale ->

ukládám aktuální čas a čas zaznamenání ...

pod

$cas1 = aktuální čas ve výpisu Date
$cas2 = $row[cas_zaznamenani]

tudiž, když bych chtěl získat čas, před jakou dobou tento login proběhl
odečtu čas 1 od času 2 ... a mam vysledek, ale nefunguje mi to.
Alphard
Profil
Ježišek:
odečtu čas 1 od času 2
Máte je jako timestamp nebo jak s nimi pracujete?
Ježišek
Profil *
Můžeš mi tykat.

Čas zaznamenání do databáze ukládám takto

$cas_zaznamenani = Date ("d.m.Y - H:i:s");


tudiž se mi vypisuje teď tvar 28.11.2009 - 22:57:20
tak jako to mam na stránkách


takže jsem myslel, že logicky, když dám

$cas_1 = Date ("d.m.Y - H:i:s");
$cas_2 = $row[cas_zaznamenani];

$vysledek = $cas1 - $cas2

ale tudy cesta nevede...
 
Alphard
Profil
function timeAgoInWords($time)
{
  $time = strtotime($time);
  $delta = time() - $time;

  $delta = round($delta / 60);
  if ($delta == 0) return 'před okamžikem';
  if ($delta == 1) return 'před minutou';
  if ($delta < 45) return "před $delta minutami";
  if ($delta < 90) return 'před hodinou';
  if ($delta < 1440) return 'před ' . round($delta / 60) . ' hodinami';
  if ($delta < 2880) return 'včera';
  if ($delta < 43200) return 'před ' . round($delta / 1440) . ' dny';
  if ($delta < 86400) return 'před měsícem';
  if ($delta < 525960) return 'před ' . round($delta / 43200) . ' měsíci';
  if ($delta < 1051920) return 'před rokem';
  return 'před ' . round($delta / 525960) . ' lety';
}

Je to upravené z helperu pro Nette od Grudla, původní verzi teď nemohu najít.

$vysledek = timeAgoInWords($row['cas_zaznamenani']);
Ježíšek
Profil *
<?
					
	 function timeAgoInWords($time)
{
  $time = strtotime($time);
  $delta = time() - $time;

  $delta = round($delta / 60);
  if ($delta == 0) return 'před okamžikem';
  if ($delta == 1) return 'před minutou';
  if ($delta < 45) return "před $delta minutami";
  if ($delta < 90) return 'před hodinou';
  if ($delta < 1440) return 'před ' . round($delta / 60) . ' hodinami';
  if ($delta < 2880) return 'včera';
  if ($delta < 43200) return 'před ' . round($delta / 1440) . ' dny';
  if ($delta < 86400) return 'před měsícem';
  if ($delta < 525960) return 'před ' . round($delta / 43200) . ' měsíci';
  if ($delta < 1051920) return 'před rokem';
  return 'před ' . round($delta / 525960) . ' lety';
}				

				$vysledek = timeAgoInWords($row['cas_zaznamenani']);	
					
		$result = mysql_query('SELECT
  t.ID, t.ip_adresa, t.cas_zaznamenani, t.http_agent, t.pc_hostname,
  m.pocet
FROM vstupy_testovani t
  left join (select ip_adresa, count(ip_adresa) pocet from vstupy_testovani group by ip_adresa) m on t.ip_adresa = m.ip_adresa
ORDER by t.ID desc
LIMIT 200');
 while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
   echo "

<tr>
                        <td><img src='img/login-icon.gif' width='16' height='16'/> #$row[ID] <br> <font color='red'><b>Upozornění</b></font> tato IP<br> je zde už <b>$row[pocet]x</b> evidována!</td>
                        <td class='first style1'><font color='#00000'>$row[ip_adresa]</font><br> - $row[cas_zaznamenani] $vysledek</td>
                        <td>$row[pc_hostname]</td>
                        <td><a href='vstup.php?id=$row[ID]'><img src='img/edit-icon.gif' width='16' height='16'/></a></td>
                        <td><a href='smaz.php?id=$row[ID]'><img src='img/hr.gif' width='16' height='16' /></a></td>
                    </tr>

   
   
";
}

?>


vypisuje mi to Před 40 lety což je blbost... není to tím, že TIME se počíta od roku X a já to vypisuji v jiném formátu?
Alphard
Profil
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
  $vysledek = timeAgoInWords($row['cas_zaznamenani']);

Nemůžete s $row pracovat dříve, než se vytvoří.
Ježíšek
Profil *
<?
					
	 function timeAgoInWords($time)
{
  $time = strtotime($time);
  $delta = time() - $time;

  $delta = round($delta / 60);
  if ($delta == 0) return 'před okamžikem';
  if ($delta == 1) return 'před minutou';
  if ($delta < 45) return "před $delta minutami";
  if ($delta < 90) return 'před hodinou';
  if ($delta < 1440) return 'před ' . round($delta / 60) . ' hodinami';
  if ($delta < 2880) return 'včera';
  if ($delta < 43200) return 'před ' . round($delta / 1440) . ' dny';
  if ($delta < 86400) return 'před měsícem';
  if ($delta < 525960) return 'před ' . round($delta / 43200) . ' měsíci';
  if ($delta < 1051920) return 'před rokem';
  return 'před ' . round($delta / 525960) . ' lety';
}				
					
		$result = mysql_query('SELECT
  t.ID, t.ip_adresa, t.cas_zaznamenani, t.http_agent, t.pc_hostname,
  m.pocet
FROM vstupy_testovani t
  left join (select ip_adresa, count(ip_adresa) pocet from vstupy_testovani group by ip_adresa) m on t.ip_adresa = m.ip_adresa
ORDER by t.ID desc
LIMIT 200');

 while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
  $vysledek = timeAgoInWords($row['cas_zaznamenani']);

 
   echo "

<tr>
                        <td><img src='img/login-icon.gif' width='16' height='16'/> <b>#$row[ID]</b> <br> <font color='red'><b>Upozornění</b></font> tato IP<br> je zde už <b>$row[pocet]x</b> evidována!</td>
                        <td><font color='#ff8c00'><b>$row[ip_adresa]</b></font><br> - $row[cas_zaznamenani] <br> Záznam přidán $vysledek</td>
                        <td>$row[pc_hostname]</td>
                        <td><a href='vstup.php?id=$row[ID]'><img src='img/edit-icon.gif' width='16' height='16'/></a></td>
                        <td><a href='smaz.php?id=$row[ID]'><img src='img/hr.gif' width='16' height='16' /></a></td>
                    </tr>

   
   
";
}

?>


je mi líto, i po opravě pořád píše před 40 lety... viz. -> http://milankubik.info/login/
Alphard
Profil
Tak ta pomlčka je asi problém.
 $vysledek = timeAgoInWords(strtr($row['cas_zaznamenani'], "-", " "));
Ježíšek
Profil *
http://milankubik.info/login/index.php

super ! :-) výborná práce, respekt !
Ježíšek
Profil *
hele myslíš, že by byl problém vytáhnout z hostname jenom tu adresu provozovatele?

cl084016103146.unet.cz

by zůstalo jen

unet.cz
Alphard
Profil
Ježíšek:
Třeba vzít řetězec od předposlední tečky (explode()). Jestli to chceš podrobněji, tak si založ nové vlákno, tady je nepořádek. Už to odečítání času mělo být jinde.

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: