PHP Counter

Neue Projekte und Anfragen, Teamarbeiten und Alpha/Beta Scripte jeder Art.
KEINE Supportanfragen zu bestehenden MODs!
Antworten
modbo
Beiträge: 1344
Registriert: Mo 13.Dez, 2004 11:18
Kontaktdaten:

PHP Counter

Beitrag von modbo »

Seineszeitens war ich auf der Suche nach einem php-Counter mit sql und reloadsperre. Ich wollte keinen weiteren Schnickschnack, wie Statistik o.ä.

Dafür habe ich diesen gewählt:

Code: Alles auswählen

<? 
function Counter($page = '') { 
    /* this function will take $page as an arguement. 
     * using different values for $page will allow 
     * you to use a different counter on each page. 
     * if you want the same counter for all of your 
     * site then don't pass in $page */ 
      
    /* connect to and select database */ 
    mysql_connect ('localhost','username','password'); 
    mysql_select_db ('database'); 
      
    /* set expire time for ips 
     * 600 seconds = 10 minutes */      
    $expire = time() - 600; 
    /* delete from table where IP has expired */ 
    $query = "DELETE FROM counter_ips " . 
             "WHERE viewtime < $expire " . 
             "AND page = '$page'"; 
    mysql_query ($query); 
      
    /* now we check to see if the users 
     * IP exists in the table */ 
    $query = "SELECT IP FROM counter_ips " . 
             "WHERE IP = '{$_SERVER['REMOTE_ADDR']}'" . 
             "AND page = '$page'"; 
    $result = mysql_query ($query); 
    if (mysql_num_rows ($result) > 0) { 
        /* if the IP existed, update the view time */ 
        $viewtime = time(); 
        $query = "UPDATE counter_ips SET viewtime = '$viewtime'" . 
                 "WHERE IP = '{$_SERVER['REMOTE_ADDR']}'" . 
                 "AND page = '$page'"; 
        mysql_query ($query); 
    } else { 
        /* ok time to record a hit and the IP */ 
          
        /* first check if a record exists for $page */ 
        $query = "SELECT num FROM counter " . 
                 "WHERE page = '$page'"; 
        $result = mysql_query ($query); 
        if (mysql_num_rows ($result) == 0) { 
            /* if no row, add one */ 
            $query = "INSERT INTO counter VALUES " . 
                     "(1,'$page')"; 
            mysql_query ($query); 
        } else { 
            /* there is a row so just update it */ 
            $query = "UPDATE counter SET num = num + 1 " . 
                     "WHERE page = '$page'"; 
            mysql_query ($query); 
        } 
        /* add IP to IP table */ 
        $viewtime = time(); 
        $query = "INSERT INTO counter_ips VALUES " . 
                 "('{$_SERVER['REMOTE_ADDR']}', '$page', $viewtime)"; 
        mysql_query ($query); 
    } 
      
    /* now we get the counter value and return it */ 
    $query = "SELECT num FROM counter WHERE page = '$page'"; 
    $row = mysql_fetch_assoc (mysql_query ($query)); 
      
     return $row['num']; 
} 

/* table dumps 
CREATE TABLE `counter` ( 
  `num` int(10) unsigned NOT NULL default '0', 
  `page` varchar(100) default NULL, 
  KEY `page` (`page`) 
) TYPE=MyISAM; 

CREATE TABLE `counter_ips` ( 
  `IP` varchar(16) NOT NULL default '', 
  `page` varchar(100) default NULL, 
  `viewtime` int(11) unsigned NOT NULL default '0', 
  KEY `IP` (`IP`), 
  KEY `viewtime` (`viewtime`), 
  KEY `page` (`page`) 
) TYPE=MyISAM; 

*/ 
?> 
Funktioniert soweit prächtig. Allerdings ist er nicht 'regelkonform' in meinem phpbb eingebunden.

Momentan muss ich den Counter in der index_body_plus.tpl mit

Code: Alles auswählen

<?php echo counter(); ?>
aufrufen *örgs*
Irgendwie bekomm ich das nicht hin, dass ich dieses z.B. mit {counter} eingebunden bekomme.
Hab mir schon die Hinweise auf phpbb.de in der Knowledgebase durchgelesen, bzw. versucht, das von adv. countdown mod abzuleiten, aber es scheitert quasi schon im Ansatz.

Kann mir jemand behilflich sein?

btw: Includet wird die phpcounter.php in der index.php mit

Code: Alles auswählen

include_once($phpbb_root_path . 'phpcounter/phpcounter.'. $phpEx);
Da weiss ich auch nicht, ob das so richtig ist.
Zuletzt geändert von modbo am Mi 26.Jan, 2005 19:38, insgesamt 1-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Sollte so funktionieren:

Code: Alles auswählen

#
#-----[ OPEN ]-----
#
index.php

#
#-----[ FIND ]-----
#
$template->assign_vars(

#
#-----[ AFTER, ADD ]-----
#
	'COUNTER' => Counter(),

#
#-----[ OPEN ]-----
#
templates/fisubsilversh/index_body_plus.tpl

#
#-----[ FIND ]-----
# // Irgendeine gewünschte Stelle
</table>

#
#-----[ AFTER, ADD ]-----
#
{COUNTER}


#
#-----[ SAVE/CLOSE ALL FILES ]-----
#
# EoM
Da die Funktion eh schon eingebunden wird, steht sie auch in der index.php zur Verfügung. Also kann sie auch per direktem Aufruf genutzt und dem Template übergeben werden.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
modbo
Beiträge: 1344
Registriert: Mo 13.Dez, 2004 11:18
Kontaktdaten:

Beitrag von modbo »

Sauber, geht :) Und wie immer sehr schön erklärt.

Im Nachgang ist mir eingefallen, ich hatte die Counter-Funktion doch auch direkt in die page_header.php integrieren können, oder?
Dann würde mir {Counter} auch im Portal zur Verfügung stehen.
Welche Variante ist denn die "bessere", wenn man das so sagen/fragen kann?
Zuletzt geändert von modbo am Do 27.Jan, 2005 09:58, insgesamt 1-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Wenn der Counter auch im Portal enthalten sein soll und nur da und im Index, dann binde dieses dort genau so ein, wie in der index.php.
Aber ein Counter dieser Art macht auf jeder Seite Sinn. Also dann natürlich in der page_header.php.
Die Funktion counter() in der phpcounter.php kannst Du dann ja in die includes/functions.php vor ?> einfügen. Das erspart dann das Einbinden in die page_header.php.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
modbo
Beiträge: 1344
Registriert: Mo 13.Dez, 2004 11:18
Kontaktdaten:

Beitrag von modbo »

Ok. Danke für den Tip. Werd mich mal dran versuchen.

//edit: Super Sache das. Funktioniert. :)

Wo wird denn die funtions.php eingebunden? Konnte ich nicht finden ...
Zuletzt geändert von modbo am Do 27.Jan, 2005 18:31, insgesamt 2-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

In der common.php und die wiederum in jeder "eigenständigen" phpBB-Datei.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
modbo
Beiträge: 1344
Registriert: Mo 13.Dez, 2004 11:18
Kontaktdaten:

Beitrag von modbo »

Alles klar. Thx.
modbo
Beiträge: 1344
Registriert: Mo 13.Dez, 2004 11:18
Kontaktdaten:

Beitrag von modbo »

Noch ein Frage :rolleyes:

Ich hab den Counter jetzt so umgestrickt, dass man die Zeit für die Reload-Sperre im ACP eintragen kann.
Diese wird dann in der DB in der Tabelle phpbb_config im Feld realodcounter abgelegt.

Der Code in der function.php schaut so aus

Code: Alles auswählen

    /* set expire time for ips
     * 600 seconds = 10 minutes */
    $expire = time() - 3600;
    /* delete from table where ip has expired */
    $query = "DELETE FROM counter_ips " .
             "WHERE viewtime < $expire " .
             "AND page = '$page'";
    mysql_query ($query);
Wie bekomme ich es hin, dass ich die 3600 löschen kann, dafür der Wert aus der DB verwendet wird?
Habs schon probiert, aber mit {RELOADCOUNTER} gibt einen parse_error.
Das muss wohl anders gemacht werden ... nur wie? Wäre nett, wenn mir jemand weiterhelfen könnte.
Zuletzt geändert von modbo am So 20.Feb, 2005 23:07, insgesamt 1-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Das ist die Variable $board_config['session_length'];
Also in Deinem Code

Code: Alles auswählen

$expire = time() - $board_config['session_length'];]
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
modbo
Beiträge: 1344
Registriert: Mo 13.Dez, 2004 11:18
Kontaktdaten:

Beitrag von modbo »

Hö?

Versteh ich jetzt nicht so ganz.

Code: Alles auswählen

    /* set expire time for ips 
     * 600 seconds = 10 minutes */ 
    $expire = time() - 3600;
Die 3600 musste ich als Zeit für die Relaodsperre von Hand in die Funktion schreiben. Nun wird sie in der Datenbank abgelegt und ich möchte sie von dort auslesen.
Das hat doch nichts mit der Sessionlänge zu tun.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Ja, wie heisst denn dann das Feld und die Tabelle?

Hier eine Standardabfrage für Daten aus der Datenbank (ein Feld):

Code: Alles auswählen

$sql = "SELECT field FROM " . TABLE_NAME . "
	WHERE where_field_1 = $where_cause_1";
if (!$result = $db->sql_query($sql))
{
	message_die(GENERAL_ERROR, 'Could not read data', '', __LINE__, __FILE__; $sql);
}
while($row = $db->sql_fetchrow($result))
{
	$field_value = $row['field'];
}
Hier sind Feld- und Tabellenname anzupassen, ebenso die Bedingungen, sofern überhaupt nötig.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
modbo
Beiträge: 1344
Registriert: Mo 13.Dez, 2004 11:18
Kontaktdaten:

Beitrag von modbo »

>Ja, wie heisst denn dann das Feld und die Tabelle?

[quote="modbo - So 20.Feb, 2005 23:06";p="23963"]Diese wird dann in der DB in der Tabelle phpbb_config im Feld reloadcounter abgelegt[/quote]


//edit: Ich habs versucht, aber scheiter irgendwie schon im Ansatz :(
In der function des Counters sieht das irgendwie schon anders aus. Da steht immer was von $query ...

Code: Alles auswählen

$sql = "SELECT reloadcounter FROM " . CONFIG_TABLE . " 
   WHERE where_reloadcounter_1 = $where_cause_1"; 
if (!$result = $db->sql_query($sql)) 
{ 
   message_die(GENERAL_ERROR, 'Could not read data', '', __LINE__, __FILE__; $sql); 
} 
while($row = $db->sql_fetchrow($result)) 
{ 
   $reloadcounter_value = $row['reloadcounter']; 
}
Wie binde ich das dann in die Zeile ein?

Code: Alles auswählen

$expire = time() - ????
:confused: Null Plan. Nur Bahnhof *heul*
Zuletzt geändert von modbo am Mo 21.Feb, 2005 14:00, insgesamt 3-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Wenn der Wert in der phpbb_config-Tabelle enthalten ist, dann brauchst Du keine Abfrage, sondern nur

Code: Alles auswählen

$expire = time() - $board_config['reloadcounter'];
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
modbo
Beiträge: 1344
Registriert: Mo 13.Dez, 2004 11:18
Kontaktdaten:

Beitrag von modbo »

Mmh. Also ich hab jtzt nur die Zeile mit $expire in die functions.php eingetragen, aber es funktioniert nicht. Die Reload-Sperre ist dann ausser Funktion. Er holt sich den Wert offensichtlich nicht aus der Tabelle.
Zuletzt geändert von modbo am Mo 21.Feb, 2005 18:12, insgesamt 1-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

In welche Funktion denn?
Wenn dort

Code: Alles auswählen

global $board_config;
nicht definiert ist, dann trage diese Zeile vor $expire = ... ein.
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
modbo
Beiträge: 1344
Registriert: Mo 13.Dez, 2004 11:18
Kontaktdaten:

Beitrag von modbo »

Ich meine die Funktion function counter() in der functions.php.

Aber nu gehts Bild

Ich habs mal als MOD zusammengeschrieben, noch ohne ACP config, kommt dann noch rein.
Aber da muss ich erstmal checken, ob die restlichen Ergänzungen noch nötig sind.
Oxipussibaby hab ich mal selbstverständlicherweise als CoAutor genannt ;) Ist vielleicht eher noch untertrieben.

[DOWNLOAD]
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Jo, Glückwunsch!
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
modbo
Beiträge: 1344
Registriert: Mo 13.Dez, 2004 11:18
Kontaktdaten:

Beitrag von modbo »

ACP config ist nun auch drin :)

Mühsam ernährt sich das Eichhörnchen ...
Antworten