Nickpageliste: Reduzierung der GB-Einträge der User

Allgemeiner Support zum phpBB 2 Board und phpBB 2 Modifikationen
Forumsregeln
Auch wenn hier der Support für phpBB 2 weiterhin aufrecht erhalten bleibt, weisen wir darauf hin, dass das phpBB 2 nicht mehr offiziell unterstützt und weiterentwickelt wird!
Antworten
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Nickpageliste: Reduzierung der GB-Einträge der User

Beitrag von bce »

hallo.
habe es nun geschafft, wie man die gb-einträge der user auf eine bestimmte anzahl reduzieren kann.
dabei werden die ältesten einträge gelöscht.

ein problem hab ich noch: in der modifizierten nickpage_list.php hab ich in zeile 145 folgendes eingefügt:

Code: Alles auswählen

 
//ab hier neu ------ 
   //schleife wird solange ausgeführt bis 100 einträge pro user in np_gb vorhanden sind 
   while ($gb_entrys-101 >= 0) 
   { 
   //sql-befehl löscht älteste 
    
   $sql = " DELETE FROM phpbb_nickpagegb WHERE an = '".$uid."' ORDER BY zeit LIMIT 1 "; 
       
      if( !$result = $db->sql_query($sql) ) 
         { 
         message_die(GENERAL_ERROR, 'Could not delete DB entry', '', __LINE__, __FILE__, $sql); 
         } 

   $gb_entrys--; 
   //end-while 
   } 
//ende -------------- 
--> die nickpage_list wird nur solange ausgeführt, bis ein user an die reihe kommt, der in meinem falle über 100 einträge hat. dann ist schluß. nun muss ich immer F5 drücken bis alle user bearbeitet wurden. es tritt weiter kein fehler auf.

wieso stoppt das script? warum muss man F5 drücken? müßte doch eigentlich normal alle user abarbeiten!?

hier die gesamte nickpage_list.php:

Code: Alles auswählen

 
<? 
define('IN_PHPBB', true); 
$phpbb_root_path = './'; 
include($phpbb_root_path . 'extension.inc'); 
include($phpbb_root_path . 'common.'.$phpEx); 

// 
// Start session management 
// 
$userdata = session_pagestart($user_ip, PAGE_INDEX); 
init_userprefs($userdata); 
// 
// End session management 
// 
include($phpbb_root_path . 'includes/page_header.'.$phpEx); 

//Anzeige der Nickpages pro Seite 
//kann durchaus editiert werden ^^ 
$seiten_pro_seite = 15; 

//Fixe Variablen initialisieren - nicht editieren!! 
$ok = '<img src="templates/nickpage/ok.gif" border="0">'; 
$no = '<img src="templates/nickpage/no.gif" border="0">'; 
$public = '<img src="templates/nickpage/public.gif" border="0"> besuche'; 
$private = '<img src="templates/nickpage/privat.gif" border="0"> erst einloggen'; 
$i = 0; 

// 
//template laden 
// 
$template->set_filenames(array( 
'list' => '../nickpage/nickpagelist.tpl',) 
); 

// 
//Konfiguration einlesen 
// 
$sql = "SELECT registered_only FROM ".NICKPAGECONFIG_TABLE; 
if(!$result = $db->sql_query($sql)) 
{ 
   message_die(CRITICAL_ERROR, "Konnte Querrie auf Allgemeine Nickpagemod Konfiguraionstabelle nicht ausführen!", "", __LINE__, __FILE__, $sql); 
} 
$row = $db->sql_fetchrow($result); 
$registered_only = $row['registered_only']; 

// 
//Limit 
// 
if($_GET['site'] != "") 
{ 
   $start= ($_GET['site']-1)*$seiten_pro_seite; 
   $anfang = $_GET['site']; 
} 
else 
{ 
   $start = 0; 
   $anfang = 1; 
} 
$limit = "LIMIT ".$start.",".$seiten_pro_seite; 

// 
//Seitenanzeige 
// 
//zaehle alle np´s 
$sql = "SELECT COUNT(uid) AS zaehle FROM ".NICKPAGE_TABLE; 
if( !($result = $db->sql_query($sql)) ) 
{ 
   message_die(GENERAL_ERROR, 'Konnte Nickpage´s nicht zählen!', '', __LINE__, __FILE__, $sql); 
} 
$row = $db->sql_fetchrow($result); 
$anzahl = $row['zaehle']; 
$ende = ceil($anzahl/$seiten_pro_seite); 
if($anfang > 1 AND $ende > $anfang) 
{ 
   $move = '<a href="?site='.($anfang -1).'">vorherige Seite</a>&nbsp;&nbsp;<a href="?site='.($anfang + 1).'">nächste Seite</a>'; 
} 
elseif($anfang > 1 AND $ende = $anfang) 
{ 
   $move = '<a href="?site='.($anfang -1).'">vorherige Seite</a>'; 
} 
elseif($ende > $anfang) 
{ 
   $move = '<a href="?site='.($anfang + 1).'">nächste Seite</a>'; 
} 

// 
//Auslesen der Daten 
// 
$sql = "SELECT a.user_id, a.username, a.user_from, a.user_website, a.user_interests, b.name, b.info, b.born, b.specialnick, b.pic, b.kreatives, b.safe FROM ".USERS_TABLE." a, ".NICKPAGE_TABLE." b WHERE b.uid=a.user_id ORDER BY a.username ASC ".$limit.""; 
if( !($result = $db->sql_query($sql)) ) 
{ 
   message_die(GENERAL_ERROR, 'Konnte Nickpagedaten nicht auslesen!', '', __LINE__, __FILE__, $sql); 
} 
while($row = $db->sql_fetchrow($result)) 
{ 
   $username = $row['username']; 
   $uid = $row['user_id']; 
   if($row['user_from'] != "") 
      $user_from = $ok; 
   else 
      $user_from = $no; 
       
   if($row['user_website'] != "") 
      $user_website = $ok; 
   else 
      $user_website = $no; 
    
   if($row['user_interests'] != "") 
      $user_interests = $ok; 
   else 
      $user_interests = $no; 
       
   if($row['name'] != "") 
      $name = $ok; 
   else 
      $name = $no; 
    
   if($row['born'] != "") 
      $born = $ok; 
   else 
      $born = $no; 
    
   if($row['pic'] != "") 
      $pic = $ok; 
   else 
      $pic = $no; 
    
   if($row['safe'] != "1" AND $registered_only != "1") 
      $safe = '<a href="nickpage.php?user='.$username.'">'.$public.'</a>'; 
   elseif($userdata['username'] != "Anonymous") 
      $safe = '<a href="nickpage.php?user='.$username.'">'.$public.'</a>'; 
   else 
      $safe = $private; 
    
   //Gästebucheinträge 
   $sql = "SELECT COUNT(an) AS zaehle FROM ".GAESTEBUCH_TABLE." WHERE an = '".$uid."'"; 
   if( !($result2 = $db->sql_query($sql)) ) 
   { 
      message_die(GENERAL_ERROR, 'Konnte Gästebucheinträge nicht zählen!', '', __LINE__, __FILE__, $sql); 
   } 
   $row2 = $db->sql_fetchrow($result2); 
   $gb_entrys = $row2['zaehle']; 
    

// ab hier neu +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
   //schleife wird solange ausgeführt bis 100 einträge pro user in np_gb vorhanden sind 
   while ($gb_entrys-101 >= 0) 
   { 
   //sql-befehl löscht älteste 
    
   $sql = " DELETE FROM phpbb_nickpagegb WHERE an = '".$uid."' ORDER BY zeit LIMIT 1 "; 
       
      if( !$result = $db->sql_query($sql) ) 
         { 
         message_die(GENERAL_ERROR, 'Could not delete DB entry', '', __LINE__, __FILE__, $sql); 
         } 

   $gb_entrys--; 
   //end-while 
   } 
// ende ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 


   //Galleriepics? 
   $sql = "SELECT COUNT(uid) AS zaehle FROM ".GALERIE_TABLE." WHERE uid = '".$uid."'"; 
   if( !($result2 = $db->sql_query($sql)) ) 
   { 
      message_die(GENERAL_ERROR, 'Konnte Galleriepics nicht zählen!', '', __LINE__, __FILE__, $sql); 
   } 
   $row2 = $db->sql_fetchrow($result2); 
   $gal_pics = $row2['zaehle']; 
    
   //gerade - ungerade variable 
   $i++; 
   if ($i % 2 != 0) 
   { 
      $class = 'row1'; 
   } 
   else 
   { 
      $class = 'row2'; 
   } 

    
   $template->assign_block_vars('Nickpagelist',array( 
   'Username' => $username, 
   'Name' => $name, 
   'Wohnort' => $user_from, 
   'Webseite' => $user_website, 
   'Hobbies' => $user_interests, 
   'Alter' => $born, 
   'Userpic' => $pic, 
   'Gb_entrys' => $gb_entrys, 
   'Gal_pics' => $gal_pics, 
   'Safe' => $safe, 
   'Class' => $class, 
   )); 
} 
$template->assign_vars(array( 
'L_Username' => $lang['Username'], //ist schon da 
'L_Wohnort' => $lang['Location'], //ist schon da -> profilblock 
'L_Webseite' => $lang['Website'], //ist schon da -> profilblock 
'L_Hobbies' => $lang['Interests'],//ist schon da -> profilblock 

'L_Name' => $lang['Name'], 
'L_Alter' => $lang['Alter'], 
'L_Userpic' => $lang['Userpic'], 
'L_Eintraege' => $lang['Eintraege'], 
'L_Bilder' => $lang['Bilder'], 
'L_Zugang' => $lang['Zugang'], 
'Nickpages' => $anzahl, 
'Move' => $move, 
)); 
// 
//parsen 
// 
$template->pparse('list'); 

// 
//footer 
// 
include($phpbb_root_path . 'includes/page_tail.'.$phpEx); 

?>
easygo
Beiträge: 155
Registriert: Fr 22.Okt, 2004 13:20
Kontaktdaten:

Beitrag von easygo »

Weil du LIMIT 1 gesetzt hast vielleicht ^^

mfg
easygo
Diskutiere nie mit einem Idioten: Erst zieht er dich auf sein
Niveau runter und dort schl?gt er dich mit Erfahrung.
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag von bce »

eigentlich nicht.. da ich ja nur einen eintrag pro schleifendurchlauf löschen möchte..

aber mir kommt da gerade eine idee...
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag von bce »

nun das ganze mit einer if-anweisung und nicht mit einer while-schleife:
...zeile 145

Code: Alles auswählen

	if ($gb_entrys>100) {
	$anzahl = $gb_entrys-100;
	
	$sql = " DELETE FROM ".GAESTEBUCH_TABLE." WHERE an = '".$uid."' ORDER BY zeit LIMIT " .$anzahl;		 
		if( !$result = $db->sql_query($sql) )
			{
			message_die(GENERAL_ERROR, 'Could not delete DB entry', '', __LINE__, __FILE__, $sql);
			}
	$gb_entrys=100;
	
	}
nun werden alle überflüssigen mit einem sql-befehl gelöscht!
ABER: es besteht nach wie vor das selbe problem:

normaler weise klappert das script alle user ab die eine nickpage haben.

das macht es weiterhin auch, nur sobald ein user mehr als 100 gb-einträge hat, werden die überflüssigen gelöscht und das script stoppt ohne die nachfolgenden user zu checken...
easygo
Beiträge: 155
Registriert: Fr 22.Okt, 2004 13:20
Kontaktdaten:

Beitrag von easygo »

Fehlt vielleicht ein ELSEIF / ELSE, damit der Check
danach weiterlaufen kann.

mfg
easygo
Diskutiere nie mit einem Idioten: Erst zieht er dich auf sein
Niveau runter und dort schl?gt er dich mit Erfahrung.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Warum hast Du das in der Nickpage-list.php eingebunden und nicht in der page_header.php?
Dann werden bei jedem Seitenaufruf alle überflüssigen GB-Einträge gelöscht und nicht erst, wenn man diese Liste aufruft.
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!
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag von bce »

[quote="easygo - 11.November 2004, 13:06";p="17126"]Fehlt vielleicht ein ELSEIF / ELSE, damit der Check
danach weiterlaufen kann.

mfg
easygo[/quote]

eigentlich nicht, da das ganze in einer while schleife abläuft... zeile 94

Code: Alles auswählen

while($row = $db->sql_fetchrow($result))
{
	$username = $row['username'];
	$uid = $row['user_id'];
....
[quote="oxpus";p="17129"]Warum hast Du das in der Nickpage-list.php eingebunden und nicht in der page_header.php?
Dann werden bei jedem Seitenaufruf alle überflüssigen GB-Einträge gelöscht und nicht erst, wenn man diese Liste aufruft.
[/quote]
ist ja erstmal zum testen...
muss erstmal das kleine aber feine problem beheben...
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag von bce »

LÖSUNG des problems auf eine andere art: :o

einfach in zeile 77 folgenden code in die originale nickpage_list.php einfügen:

Code: Alles auswählen

//
//Reduzierung der GB-Einträge jedes einzelnen Users
//Anzahl an Einträgen in Zeile 22 einstellen
$users = array();

$sql = "SELECT a.user_id FROM ".USERS_TABLE." a, ".NICKPAGE_TABLE." b WHERE b.uid=a.user_id ORDER BY a.username ASC ".$limit."";
if( !($result = $db->sql_query($sql)) )
{
	message_die(GENERAL_ERROR, 'Konnte Nickpagedaten nicht auslesen!', '', __LINE__, __FILE__, $sql);
}
while($row = $db->sql_fetchrow($result))
{
 $uid = $row['user_id'];
 array_push($users, $uid);
}    

for($i=0; $i<=count($users)-1; $i++)
{
 //echo "-" . $users[$i] . "<br>";
     $uid = $users[$i];
//Gästebucheinträge
	$sql = "SELECT COUNT(an) AS zaehle FROM ".GAESTEBUCH_TABLE." WHERE an = '".$uid."'";
	if( !($result2 = $db->sql_query($sql)) )
	{
		message_die(GENERAL_ERROR, 'Konnte Gästebucheinträge nicht zählen!', '', __LINE__, __FILE__, $sql);
	}
	$row2 = $db->sql_fetchrow($result2);
	$gb_entrys = $row2['zaehle']; 
 
    if ($gb_entrys>$anzahl_gb_eintraege) //if ($gb_entrys>100) 
	{
    $anz = $gb_entrys-$anzahl_gb_eintraege;  //$anz = $gb_entrys-100;
    
    $sql = " DELETE FROM ".GAESTEBUCH_TABLE." WHERE an = '".$uid."' ORDER BY zeit LIMIT " .$anz;		 
		if( !$result = $db->sql_query($sql) )
			{
			message_die(GENERAL_ERROR, 'Could not delete DB entry', '', __LINE__, __FILE__, $sql);
			}
	  
    //echo  "- user " . $users[$i] . "einträge " .$gb_entrys. "  $anz<br>";
      
	}//end-if
    
}//end-for
:o es ist nun auch möglich die anzahl an gb-einträgen einfach selbst zu bestimmen. hierfür muss in zeile 20 folgendes eingefügt werden:

Code: Alles auswählen

//wieviele GB-Einträge pro User sind erlaubt
$anzahl_gb_eintraege = 100;
wie gesagt.. auf diese art und weise funktioniert's.. da nun der "algorithmus" ausserhalb der anderen schleife liegt...

falls einer den fehler beim alten problem entdeckt, solle er sich mal bitte melden oder einfach hier rein posten..
thx


zum neuen anliegen:
die reduzierung der gb-einträge soll ja nur einmalig stattfinden.
ab sofort soll nach jedem gb-eintrag geprügt werden ob der user schon z.b. 100 einträge hat. wenn ja lösche den ältesten.
auf gehts...
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag von bce »

hat sich erledigt
easygo
Beiträge: 155
Registriert: Fr 22.Okt, 2004 13:20
Kontaktdaten:

Beitrag von easygo »

[quote="bce - Mi 17.Nov, 2004 16:36";p="17146"]hat sich erledigt[/quote]

Schade, war recht interessant bis jetzt ^^

Kannst mir ja bei Gelegenheit mal verraten wie das geht, dass User
über 100 Gästebucheinträge auf "Nickpages" hinterlassen.
Hast du da ein Mega Flirtforum oder so was?

mfg ;)
easygo
Diskutiere nie mit einem Idioten: Erst zieht er dich auf sein
Niveau runter und dort schl?gt er dich mit Erfahrung.
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag von bce »

habe kein flirt-forum oder ähnliches... ein paar user schreiben sich rüber und nüber.. fast wie in einem chat.. deshalb summieren sich die einträge unwahrscheinlich stark.
kannst hier mal schauen ;)
http://www.phpbb.de/viewtopic.php?t=70712

ein probelm dabei gibt es. folgender sql-befehl funktioniert lokal aber nicht auf dem server:

Code: Alles auswählen

$sql = " DELETE FROM ".GAESTEBUCH_TABLE." WHERE an = '".$uid."' ORDER BY zeit LIMIT " .$anz;
auf dem server kommt folgende fehlermeldung:

Code: Alles auswählen

Could not delete DB entry

DEBUG MODE

SQL Error : 1064 You have an error in your SQL syntax near 'ORDER BY zeit LIMIT 586' at line 1

DELETE FROM phpbb_nickpagegb WHERE an = '24' ORDER BY zeit LIMIT 586

Line : 114
File : /www/htdocs/forum/nickpage_list_neu.php
hat das was mit hochkommas oder dergleichen zu tun?!
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Kommt darauf an, welche Datenbankversion auf dem Server verfügbar ist und ob der in DELETE-Anweisungen mit ORDER BY und LIMIT umgehen kann.
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!
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag von bce »

bin vertreten bei all-ink...

kann sein das die ne ältere version laufen haben ;(

dann mal schauen...
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Sollte mysql 3.23.52 max log sein.
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!
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag von bce »

hab grad mal geschaut.. habe:

Code: Alles auswählen

mysql
MySQL Support enabled 
Active Persistent Links  0  
Active Links  0  
Client API version  3.23.55  
MYSQL_MODULE_TYPE  external  
MYSQL_SOCKET  /var/lib/mysql/mysql.sock  
MYSQL_INCLUDE  -I/usr/include/mysql  
MYSQL_LIBS  -L/usr/lib -lmysqlclient  
also gehts nicht?!
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Doch, diese Version ist ja jünger, also neuer.
mysql 3.23.52 hatte ich bei meinem ersten Webspace, was jetzt installiert ist, hatte ich noch garnicht nachgeschaut. Könnte auch 3.23.55 sein.
Aber vielleicht kann mysql 3.x diesen Befehl garnicht und der klappt nur unter mysql 4.x.
Was hast Du denn lokal für eine Version installiert?
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!
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag von bce »

lokal hab ich xampp am laufen
version 1.4.9

mit mysql:

Code: Alles auswählen

Client API version  3.23.57  
hab grad mal meinem provider ne mail geschickt... es müßte eigentlich gehen.-- mal schauen..
Benutzeravatar
bce
Beiträge: 858
Registriert: Do 14.Okt, 2004 18:46
Kontaktdaten:

Beitrag von bce »

hab grad bissl mit dem vom service gemailt...
endergebniss ein paar server haben bereits das neue mysql und das neue php am laufen. der server auf dem sich meine domainbefindet jedoch nicht.
aber er hat mir angeboten auf einem der server, auf denen das neue zeugs läuft umzuziehen.. feine sache vom provider!!! :)

zitat support:
das Problem ist das Order BY. Dies ist wirklich erst in Mysql4 in Verbindung mit delete verwendbar. Das Limit selbst würde funktionieren.
Benutzeravatar
oxpus
Administrator
Beiträge: 28735
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Das ist eben der super Service bei all-inkl.com. Da gibt es nichts zu meckern!
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!
Antworten