[2.1] Ähnliche Themen

Dieses Thema im Forum "hacks von rellek" wurde erstellt von rellek, 1 Januar 2005.

  1. rellek

    rellek relativ sensationell Mitarbeiter

    Name: Ähnliche Themen
    Version: 1.0
    Für wBB-Version: 2.1
    Getestet mit: 2.1.5

    Beschreibung: Mit diesem Hack werden zu jedem Thema 5 ähnliche Themen gesucht. Dazu wird
    die MySQL-Bedingung LIKE verwendet, d.h. wenn die Anzeige "komisch" oder
    unsauber funktioniert, dann ist MySQL schuld.
    Dieser Hack ist im Gegensatz zu den meisten anderen Hacks, die ähnliches
    leisten, sehr sparsam gecodet. Es für die Abfrage nur ein zusätzlicher SQL-
    Query nötig, ein weiterer kommt hinzu, wenn der Permission-Cache nicht gesetzt
    ist, um die Foren ausfindig zu machen, in denen gesucht wird.
    Foren, zu denen man keine Berechtigung hat, werden, genauso wie passwortgeschützte
    Foren, von der Suche nach ähnlichen Themen ausgeschlossen, sodass niemand etwas
    sieht, was er nicht sehen darf.

    MySQL5-Probleme? Hier klicken: Ähnliche Themen

    Demo: Im Anhang
    Copyright: (c) 2005 by rellek
    Disclaimer: Keine Haftung für irgendwelche Schäden am Board. Fehler sind natürlich nicht ausgeschlossen

    ---

    Bekannte Fehler: -
    Updates und Bugfixes: -
     

    Anhänge:

  2. rellek

    rellek relativ sensationell Mitarbeiter

    Wer am Beta-Test der neuen Version teilnehmen möchte, der ersetzt bitte den längeren Abschnitt zwischen den beiden
    Code:
    /* Ähnliche Themen */
    und
    Code:
    /* Ähnliche Themen Ende */
    mit:
    Code:
    /* Ähnlich Themen */
    function GetAccessableForums() {
    	global $db, $n, $wbbuserdata, $boardcache;
    	
    	if (!isset($boardcache) || !is_array($boardcache)) $boardcache = array();
    	$result = $db->query("SELECT boardid,boardorder,parentid,parentlist FROM bb".$n."_boards ORDER BY parentid ASC, boardorder ASC");
    	while ($row = $db->fetch_array($result)) {
    		$boardcache[$row['parentid']][$row['boardorder']][$row['boardid']] = $row;
    	}
    
    	$boardpermissions = getPermissions();
    	$boardids = '';
    	foreach ($boardcache as $key => $val) {
    		foreach ($val as $key2 => $val2) {
    			foreach ($val2 as $row) if ((!isset($boardpermissions[$row['boardid']]['can_view_board']) || $boardpermissions[$row['boardid']]['can_view_board'] != 0) && (!isset($boardpermissions[$row['boardid']]['can_enter_board']) || $boardpermissions[$row['boardid']]['can_enter_board'] != 0) && (!isset($boardpermissions[$row['boardid']]['can_read_thread']) || $boardpermissions[$row['boardid']]['can_read_thread'] != 0)) $boardids .= ",".$row['boardid'];
    		}	
    	}
    	return $boardids;
    }
    $ttopic = str_replace("."," ",$threadtopic);
    $ttopic = str_replace("!"," ",$ttopic);
    $ttopic = str_replace("?"," ",$ttopic);
    $ttopic = str_replace("/"," ",$ttopic);
    $ttopic = str_replace("§"," ",$ttopic);
    $ttopic = str_replace("$"," ",$ttopic);
    $ttopic = str_replace("%"," ",$ttopic);
    $ttopic = str_replace("&"," ",$ttopic);
    $ttopic = str_replace("("," ",$ttopic);
    $ttopic = str_replace(")"," ",$ttopic);
    $ttopic = str_replace("="," ",$ttopic);
    $ttopic = str_replace("\\"," ",$ttopic);
    $ttopic = str_replace("?"," ",$ttopic);
    $ttopic = str_replace("-"," ",$ttopic);
    $ttopic = str_replace("*"," ",$ttopic);
    $ttopic = str_replace("+"," ",$ttopic);
    $ttopic = str_replace("#"," ",$ttopic);
    $ttopic = str_replace("_"," ",$ttopic);
    $ttopic = str_replace(","," ",$ttopic);
    $ttopic = str_replace(":"," ",$ttopic);
    $ttopic = str_replace(";"," ",$ttopic);
    $ttopic = str_replace("<"," ",$ttopic);
    $ttopic = str_replace(">"," ",$ttopic);
    $ttopic = str_replace("|"," ",$ttopic);
    $ttopic = explode(" ",$ttopic);
    $badwordlist = explode("\n",$badsearchwords);
    $y = count($ttopic);
    if($y>1) {
      foreach($ttopic as $tt) {
      	if(!in_array($tt, $badwordlist)) {
      		if(strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength) $x++;
      		if($x>1 && (strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength)) $like_string .= " OR t.topic LIKE ";
      		if(strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength) $like_string .= "'%".$tt."%'";
      }
    }
    } else $like_string = "'%$threadtopic%'";
    if($like_string) {
    	$similar = $db->query("SELECT
    											t.threadid, t.boardid, x.title, x.boardid, t.prefix, t.topic, t.starttime, t.starterid, t.starter, t.lastposttime, t.lastposterid, t.lastposter, t.replycount, t.views, t.attachments, t.closed, t.important, t.pollid
    											FROM bb".$n."_threads t, bb".$n."_boards x
    											LEFT JOIN bb".$n."_boards b ON (t.boardid=b.boardid)
    											WHERE t.visible='1'
    											AND t.closed <> 3
    											AND t.threadid <> $threadid
    											AND b.password=''
    											AND t.boardid=x.boardid
    											AND t.boardid IN (0".GetAccessableForums().")
    											AND (t.topic LIKE ".$like_string.")
    											ORDER BY t.lastposttime DESC
    											LIMIT 0, 5;");
    	}
    if($like_string && $db->num_rows($similar)) {
    	$i = "0";
    	while ($row = $db->fetch_array($similar)) {
    		$i++;
    		$tdclass = getone($i, "tablea", "tableb");
    		$started = formatdate($wbbuserdata['dateformat'], $row['starttime'],1);
    		$started .= " <span class=\"time\">".formatdate($wbbuserdata['timeformat'], $row['starttime'])."</span>";
    		$lastreply = formatdate($wbbuserdata['dateformat'], $row['lastposttime'],1);
    		$lastreply .= " <span class=\"time\">".formatdate($wbbuserdata['timeformat'], $row['lastposttime'])."</span>";
    		if ($row['replycount'] >= 1000) $row['replycount'] = number_format($row['replycount'], 0, "", $lang->get("LANG_GLOBAL_THOUSANDS_SEP"));
    		if ($row['views'] >= 1000) $row['views'] = number_format($row['views'], 0, "", $lang->get("LANG_GLOBAL_THOUSANDS_SEP"));
    		if (strlen($row['topic']) > 60) $row['topic'] = substr($row['topic'], 0, 54).' [...]';
    		eval("\$similar_thread_bit .= \"".$tpl->get("thread_similarthread_bit")."\";");
    	}
    	eval("\$similar_thread = \"".$tpl->get("thread_similarthread")."\";");
    }
    /* Ähnliche Themen Ende */
    Auftretende Bugs bitte melden !
     
  3. CSchulle

    CSchulle Neuer Benutzer

    Melde gehorsamst: KEIN BUG mehr bei mir :yo

    Datenbank: MySQL 4.0.20a


    Spitzensache, mein Respekt
     
  4. rellek

    rellek relativ sensationell Mitarbeiter

    Neuer Fix.

    Code:
    /* Ähnlich Themen */
    function GetAccessableForums() {
    	global $db, $n, $wbbuserdata, $boardcache;
    	
    	if (!isset($boardcache) || !is_array($boardcache)) $boardcache = array();
    	$result = $db->query("SELECT boardid,boardorder,parentid,parentlist FROM bb".$n."_boards ORDER BY parentid ASC, boardorder ASC");
    	while ($row = $db->fetch_array($result)) {
    		$boardcache[$row['parentid']][$row['boardorder']][$row['boardid']] = $row;
    	}
    
    	$boardpermissions = getPermissions();
    	$boardids = '';
    	foreach ($boardcache as $key => $val) {
    		foreach ($val as $key2 => $val2) {
    			foreach ($val2 as $row) if ((!isset($boardpermissions[$row['boardid']]['can_view_board']) || $boardpermissions[$row['boardid']]['can_view_board'] != 0) && (!isset($boardpermissions[$row['boardid']]['can_enter_board']) || $boardpermissions[$row['boardid']]['can_enter_board'] != 0) && (!isset($boardpermissions[$row['boardid']]['can_read_thread']) || $boardpermissions[$row['boardid']]['can_read_thread'] != 0)) $boardids .= ",".$row['boardid'];
    		}	
    	}
    	return $boardids;
    }
    
    /* Unset Used Vars To Avoid Hacking Attempts */
    unset($similar_thread_bit);
    unset($like_string);
    
    $ttopic = str_replace("."," ",$threadtopic);
    $ttopic = str_replace("!"," ",$ttopic);
    $ttopic = str_replace("?"," ",$ttopic);
    $ttopic = str_replace("/"," ",$ttopic);
    $ttopic = str_replace("§"," ",$ttopic);
    $ttopic = str_replace("$"," ",$ttopic);
    $ttopic = str_replace("%"," ",$ttopic);
    $ttopic = str_replace("&"," ",$ttopic);
    $ttopic = str_replace("("," ",$ttopic);
    $ttopic = str_replace(")"," ",$ttopic);
    $ttopic = str_replace("="," ",$ttopic);
    $ttopic = str_replace("\\"," ",$ttopic);
    $ttopic = str_replace("?"," ",$ttopic);
    $ttopic = str_replace("-"," ",$ttopic);
    $ttopic = str_replace("*"," ",$ttopic);
    $ttopic = str_replace("+"," ",$ttopic);
    $ttopic = str_replace("#"," ",$ttopic);
    $ttopic = str_replace("_"," ",$ttopic);
    $ttopic = str_replace(","," ",$ttopic);
    $ttopic = str_replace(":"," ",$ttopic);
    $ttopic = str_replace(";"," ",$ttopic);
    $ttopic = str_replace("<"," ",$ttopic);
    $ttopic = str_replace(">"," ",$ttopic);
    $ttopic = str_replace("|"," ",$ttopic);
    $ttopic = str_replace("~"," ",$ttopic);
    $ttopic = str_replace("'"," ",$ttopic);
    $ttopic = str_replace('"',' ',$ttopic);
    $ttopic = explode(" ",$ttopic);
    $badwordlist = explode("\n",$badsearchwords);
    $y = count($ttopic);
    if($y>1) {
      foreach($ttopic as $tt) {
      	if(!in_array($tt, $badwordlist)) {
      		if(strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength) $x++;
      		if($x>1 && (strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength)) $like_string .= " OR t.topic LIKE ";
      		if(strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength) $like_string .= "'%".$tt."%'";
      }
    }
    } else $like_string = "'%$threadtopic%'";
    if($like_string) {
    	$similar = $db->query("SELECT
                          t.threadid, t.boardid, x.title, x.boardid, t.prefix, t.topic, t.starttime, t.starterid, t.starter, t.lastposttime, t.lastposterid, t.lastposter, t.replycount, t.views, t.attachments, t.closed, t.important, t.pollid
                          FROM bb".$n."_threads t, bb".$n."_boards x
                          LEFT JOIN bb".$n."_boards b ON (t.boardid=b.boardid)
                          WHERE t.visible='1'
                          AND t.closed <> 3
                          AND t.threadid <> $threadid
                          AND b.password=''
                          AND t.boardid=x.boardid
                          AND t.boardid IN (0".GetAccessableForums().")
                          AND (t.topic LIKE ".$like_string.")
                          ORDER BY t.lastposttime DESC
                          LIMIT 0, 5;");
    	}
    if($like_string && $db->num_rows($similar)) {
    	$i = "0";
    	while ($row = $db->fetch_array($similar)) {
    		$i++;
    		$tdclass = getone($i, "tablea", "tableb");
    		$started = formatdate($wbbuserdata['dateformat'], $row['starttime'],1);
    		$started .= " <span class=\"time\">".formatdate($wbbuserdata['timeformat'], $row['starttime'])."</span>";
    		$lastreply = formatdate($wbbuserdata['dateformat'], $row['lastposttime'],1);
    		$lastreply .= " <span class=\"time\">".formatdate($wbbuserdata['timeformat'], $row['lastposttime'])."</span>";
    		if ($row['replycount'] >= 1000) $row['replycount'] = number_format($row['replycount'], 0, "", $lang->get("LANG_GLOBAL_THOUSANDS_SEP"));
    		if ($row['views'] >= 1000) $row['views'] = number_format($row['views'], 0, "", $lang->get("LANG_GLOBAL_THOUSANDS_SEP"));
    		if (strlen($row['topic']) > 60) $row['topic'] = substr($row['topic'], 0, 54).' [...]';
    		$row['topic'] = htmlconverter($row['topic']);
    		eval("\$similar_thread_bit .= \"".$tpl->get("thread_similarthread_bit")."\";");
    	}
    	eval("\$similar_thread = \"".$tpl->get("thread_similarthread")."\";");
    }
    /* Ähnliche Themen Ende */
     
  5. rellek

    rellek relativ sensationell Mitarbeiter

    Für alle mit mySQL 5-Problemen!!!

    Ersetze die Codestelle in der thread.php damit:
    Code:
    /* Ähnliche Themen */
    function GetAccessableForums() {
    	global $db, $n, $wbbuserdata, $boardcache;
    	
    	if (!isset($boardcache) || !is_array($boardcache)) $boardcache = array();
    	$result = $db->query("SELECT boardid,boardorder,parentid,parentlist FROM bb".$n."_boards ORDER BY parentid ASC, boardorder ASC");
    	while ($row = $db->fetch_array($result)) {
    		$boardcache[$row['parentid']][$row['boardorder']][$row['boardid']] = $row;
    	}
    
    	$boardpermissions = getPermissions();
    	$boardids = '';
    	foreach ($boardcache as $key => $val) {
    		foreach ($val as $key2 => $val2) {
    			foreach ($val2 as $row) if ((!isset($boardpermissions[$row['boardid']]['can_view_board']) || $boardpermissions[$row['boardid']]['can_view_board'] != 0) && (!isset($boardpermissions[$row['boardid']]['can_enter_board']) || $boardpermissions[$row['boardid']]['can_enter_board'] != 0) && (!isset($boardpermissions[$row['boardid']]['can_read_thread']) || $boardpermissions[$row['boardid']]['can_read_thread'] != 0)) $boardids .= ",".$row['boardid'];
    		}	
    	}
    	return $boardids;
    }
    
    /* Unset Used Vars To Avoid Hacking Attempts */
    unset($similar_thread_bit);
    unset($like_string);
    
    $ttopic = str_replace("."," ",$threadtopic);
    $ttopic = str_replace("!"," ",$ttopic);
    $ttopic = str_replace("?"," ",$ttopic);
    $ttopic = str_replace("/"," ",$ttopic);
    $ttopic = str_replace("§"," ",$ttopic);
    $ttopic = str_replace("$"," ",$ttopic);
    $ttopic = str_replace("%"," ",$ttopic);
    $ttopic = str_replace("&"," ",$ttopic);
    $ttopic = str_replace("("," ",$ttopic);
    $ttopic = str_replace(")"," ",$ttopic);
    $ttopic = str_replace("="," ",$ttopic);
    $ttopic = str_replace("\\"," ",$ttopic);
    $ttopic = str_replace("?"," ",$ttopic);
    $ttopic = str_replace("-"," ",$ttopic);
    $ttopic = str_replace("*"," ",$ttopic);
    $ttopic = str_replace("+"," ",$ttopic);
    $ttopic = str_replace("#"," ",$ttopic);
    $ttopic = str_replace("_"," ",$ttopic);
    $ttopic = str_replace(","," ",$ttopic);
    $ttopic = str_replace(":"," ",$ttopic);
    $ttopic = str_replace(";"," ",$ttopic);
    $ttopic = str_replace("<"," ",$ttopic);
    $ttopic = str_replace(">"," ",$ttopic);
    $ttopic = str_replace("|"," ",$ttopic);
    $ttopic = str_replace("~"," ",$ttopic);
    $ttopic = str_replace("'"," ",$ttopic);
    $ttopic = str_replace('"',' ',$ttopic);
    $ttopic = explode(" ",$ttopic);
    $badwordlist = explode("\n",$badsearchwords);
    $y = count($ttopic);
    if($y>1) {
      foreach($ttopic as $tt) {
      	if(!in_array($tt, $badwordlist)) {
      		if(strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength) $x++;
      		if($x>1 && (strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength)) $like_string .= " OR t.topic LIKE ";
      		if(strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength) $like_string .= "'%".$tt."%'";
      }
    }
    } else $like_string = "'%$threadtopic%'";
    if($like_string) {
    	$similar = $db->query("SELECT
                          t.threadid, t.boardid, x.title, x.boardid, t.prefix, t.topic, t.starttime, t.starterid, t.starter, t.lastposttime, t.lastposterid, t.lastposter, t.replycount, t.views, t.attachments, t.closed, t.important, t.pollid
                          FROM bb".$n."_threads t, bb".$n."_boards x
                          WHERE t.visible='1'
                          AND t.closed <> 3
                          AND t.threadid <> $threadid
                          AND x.password=''
                          AND t.boardid=x.boardid
                          AND t.boardid IN (0".GetAccessableForums().")
                          AND (t.topic LIKE ".$like_string.")
                          ORDER BY t.lastposttime DESC
                          LIMIT 0, 5;");
    	}
    if($like_string && $db->num_rows($similar)) {
    	$i = "0";
    	while ($row = $db->fetch_array($similar)) {
    		$i++;
    		$tdclass = getone($i, "tablea", "tableb");
    		$started = formatdate($wbbuserdata['dateformat'], $row['starttime'],1);
    		$started .= " <span class=\"time\">".formatdate($wbbuserdata['timeformat'], $row['starttime'])."</span>";
    		$lastreply = formatdate($wbbuserdata['dateformat'], $row['lastposttime'],1);
    		$lastreply .= " <span class=\"time\">".formatdate($wbbuserdata['timeformat'], $row['lastposttime'])."</span>";
    		if ($row['replycount'] >= 1000) $row['replycount'] = number_format($row['replycount'], 0, "", $lang->get("LANG_GLOBAL_THOUSANDS_SEP"));
    		if ($row['views'] >= 1000) $row['views'] = number_format($row['views'], 0, "", $lang->get("LANG_GLOBAL_THOUSANDS_SEP"));
    		if (strlen($row['topic']) > 60) $row['topic'] = substr($row['topic'], 0, 54).' [...]';
    		$row['topic'] = htmlconverter($row['topic']);
    		eval("\$similar_thread_bit .= \"".$tpl->get("thread_similarthread_bit")."\";");
    	}
    	eval("\$similar_thread = \"".$tpl->get("thread_similarthread")."\";");
    }
    /* Ähnliche Themen Ende */
     
  6. AvA

    AvA New Member

    Hi,
    ich weiß nicht genau, ob es nach soooo langer Zeit noch Support für diesen Hack gibt - ich versuch's einfach.
    Mein Problem ist, dass dieser Hack zwar beim regulären Style von Woltlab funktioniert, nicht aber beim Style, das ich gern nutzen würde (Together).
    Da zerreißt es es das Template total.
    Falls jemand ohne viel Mühe weiß, was ich umschreiben muß, wäre ich für Hilfe dankbar.
    Hier der Link, so schaut es aus: klick

    P.S. WBB ist Version 2.13
     
  7. rellek

    rellek relativ sensationell Mitarbeiter

    1) Solltest du schleunigste auf die aktuellste Version (2.1.6 glaub ich) aktualisieren, wegen Schließung von Sicherheitslücken
    2) Der Style... hast du den auch in der 2.1er Version installiert? Ich meine, nicht dass da das Problem versteckt ist und der Hack am Ende nichts dafür kann...
    3) Fehlt in der Themenansicht der CSS-Code, da kann der Hack wahrscheinlich nichts für
     
  8. AvA

    AvA New Member

    Hi ; )
    Toll, dass ich so schnell Antwort bekomme. Das hat Seltenheitswert. Ehrlich.

    zu Pkt. 1)
    Jo, ich bemühe mich seit einiger Zeit, meine Daten zu bekommen, denn ich wollte eigentlich NUR meine Mailadi bei Woltlab wechseln und dann fing der Woltlablazystress an.
    Ich schicke regelmäßig Mails und bekomme regelmäßig keine Antwort.
    Sonst hätte ich längst Version 3.dingsbums und müßte mich nciht mit alter Software rumschlagen *ziemlichgrummel*

    zu Pkt 2)
    Jap, der ist in der richtigen Version installiert. Aber Deine Hacks, auch das Quickreply, zieht es völlig auseinander. Aber auch nur und ausschließlich bei diesem Style. Habe eben noch ein anderes versucht, da ist alles schick.

    zu Pkt 3)
    Themenansicht - CSS-Code? Ägypten?
    Ich dachte, das CSS wird automatisch immer richtig mitgeladen?
     
  9. rellek

    rellek relativ sensationell Mitarbeiter

    2) Ja ist klar... Wenn bei der Themenanzeige das Problem ist, betriffts natürlich auch den Quickreply weil der ja auch da angezeigt wird

    3) Normalerweise schon. Aber bei dir anscheinend nicht. Häng doch mal das Template thread und index an. NICHT die PHP-Dateien, sondern die Templates (die gibts im Admin-Panel). Und zwar die aus diesem Together-Style.
     
  10. AvA

    AvA New Member

    Hab' die als html abgespeichert und gezipped? Sind im Anhang.
    Also 1000 Dank schon vorher fürs Gucken. Bin immer noch schwer beeindruckt von der Hilfsbereitschaft :yo
     

    Anhänge:

    • tmpl.zip
      Dateigröße:
      6,2 KB
      Aufrufe:
      8
  11. rellek

    rellek relativ sensationell Mitarbeiter

    Womit hast du das denn gespeichert? Mit einem normalen Texteditor?
     
  12. AvA

    AvA New Member

    :D weia - sorry.

    Nochmal als Rar und mit DW als Html gespeichert. Falls das nicht richtig ist, sag' mir bitte einfach womit ; )
     

    Anhänge:

  13. rellek

    rellek relativ sensationell Mitarbeiter

    Das ist schon besser. Pack-Format wär mir btw egal, kam nur aufm Inhalt an. Dafür reicht zur Not auch Notepad :)

    und da haben wir auch schon den Fehler gefunden im Template "thread":
    Code:
    $headinclude[COLOR=Red]s[/COLOR]
    Das s ist zu viel, das muss weg. Dann klappts auch mit den Hacks.
     
  14. AvA

    AvA New Member

    Wow! Tatsächlich.
    Ich hätte niemals DORT den Fehler gesucht, geschweige denn gefunden *lach*
    Freu mich sehr und bedanke mich bei Dir *rüberwink*

    Falls Woltlab in diesem Leben noch reagiert (Update), sind Deine Hacks das Erste, das ich einbaue ; )
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deinem Erleben anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden