Wie du vielleicht bemerkt hast, haben wir das auch vor kurzem hier auf ilch.de geändert, letztendlich mit einem zusätzlichen Datenbankfeld.
Hier das was ich damals probiert hatte, und eigentlich auch funktionieren sollte.
contents/search.php
<?php
# Copyright by: Manuel
# Support: www.ilch.de
defined ('main') or die ( 'no direct access' );
function serach_mark($text,$such) {
#$text = BBcode($text);
$serar = explode(' ', $such);
$text = strip_tags($text);
$text = stripslashes($text);
$rte = '';
$tleng = 30;
foreach($serar as $v) {
$firs = strpos(strtolower($text),strtolower($v));
$begi = (($firs - $tleng) < 0 ? 0 : $firs - $tleng );
$leng = strlen($text);
$ende = (($firs + strlen($v) + $tleng) > $leng ? $leng : $firs + strlen($v) + $tleng );
$ttxt = substr($text,$begi,($ende - $begi));
$rte .= ' ... '.preg_replace("/".$v."/si",'<b>'.$v.'</b>',$ttxt);
}
return ($rte);
}
function search_finduser() {
$design = new design ( 'Finduser' , '', 0 );
$design->header();
$tpl = new tpl ( 'search_finduser' );
$tpl->out(0);
if ( isset ( $_POST['sub'] ) AND !empty($_POST['name']) ) {
$name = str_replace('*',"%",$_POST['name']);
$name = escape($name, 'string');
$q = "SELECT name,name FROM prefix_user WHERE name like '".$name."'";
$tpl->set ('username',dbliste('',$tpl,'username',$q));
$tpl->out(1);
}
$tpl->out(2);
$design->footer();
}
if ($menu->get(1) == 'finduser') {
search_finduser();
exit();
}
$such = '';
if ($menu->get(1) != '') {
$such = $menu->get(1);
} elseif (isset($_REQUEST['search'])) {
$such = $_REQUEST['search'];
}
$such = stripslashes(escape($such, 'string'));
$snac = 'Suche';
if ($such == 'augt' OR $such == 'aeit' OR $such == 'aubt') {
$ar_s = array('aubt'=>'unbeantworteten Themen','aeit'=>'eigenen Beiträgen','augt'=>'neue Themen seit dem letzten Besuch');
$snac = $ar_s[$such];
} elseif ( isset($_REQUEST['search']) ) {
$snac = 'nach: '.$such;
}
$title = $allgAr['title'].' :: Suchen :: '.htmlentities($snac);
$hmenu = '<a class="smalfont" href="index.php?search">Suchen</a><b> » </b>'.htmlentities($snac);
$design = new design ( $title , $hmenu );
$design->header();
$tpl = new tpl ('search');
$tpl->set ('size', 30);
if ($such != 'augt' AND $such != 'aeit' AND $such != 'aubt') {
$tpl->set_out('search',escape_for_fields($such),0);
}
if (!empty($such)) {
$page = 1;
if (isset($_GET['page'])) {
$page = str_replace('-p','',$_GET['page']);
}
$limit = 25; // Limit
$anfang = ($page - 1) * $limit;
//Letzen Beiträge
if ($such == 'augt') {
$q = "SELECT DISTINCT b.id as fid, a.name as titel, a.id as id, MIN(c.id) AS firstnew
FROM prefix_topics a
LEFT JOIN prefix_forums b ON b.id = a.fid
LEFT JOIN prefix_posts c ON c.tid = a.id
WHERE (b.view >= ".$_SESSION['authright']." OR b.reply >= ".$_SESSION['authright']." OR b.start >= ".$_SESSION['authright'].")
AND c.time >= ".$_SESSION['lastlogin']."
GROUP BY b.id,a.id, a.name
ORDER BY c.time DESC";
$sql = db_query($q);
$gAnz = db_num_rows($sql);
if ($gAnz) {
mysql_data_seek($sql,$anfang);
}
$MPL = db_make_sites ($page , "" , $limit , "index.php?search=".urlencode($such)."&page=", "", $gAnz );
$tpl->set_ar_out(array('MPL'=>$MPL,'gAnz'=>$gAnz),1);
$q = db_query($q);
$class = '';
while($r = db_fetch_assoc($q) ) {
$class = ($class == 'Cmite' ? 'Cnorm' : 'Cmite' );
$r['class'] = $class;
$r['ctime'] = db_result(db_query("SELECT MAX(time) FROM prefix_posts WHERE tid = ".$r['id']),0,0);
$r['ord'] = forum_get_ordner($r['ctime'],$r['id'],$r['fid']);
$r['postsbefore'] = db_count_query('SELECT COUNT(id) FROM prefix_posts WHERE tid = '.$r['id'].' AND id < '.$r['firstnew']);
$r['page'] = ceil(($r['postsbefore']+1)/$allgAr['Fpanz']);
$tpl->set_ar_out($r,4);
}
$tpl->out(3);
$design->footer(1);
}
if ($such == 'aubt' OR $such == 'aeit') {
$s = "DISTINCT b.id as fid, a.name as titel, 'foru' as typ, a.id as id";
$q = "select {SELECT}
FROM prefix_topics a
LEFT JOIN prefix_forums b ON b.id = a.fid
LEFT JOIN prefix_posts c ON c.tid = a.id
WHERE (b.view >= ".$_SESSION['authright']." OR b.reply >= ".$_SESSION['authright']." OR b.start >= ".$_SESSION['authright'].")
AND {WHERE}
ORDER BY c.time DESC";
}
$x = time() - (3600 * 24 * 360);
if ($such == 'aubt') {
$where = "c.time >= ". $x ." AND a.rep = 0";
$c = str_replace('{WHERE}',$where,str_replace('{SELECT}','COUNT(DISTINCT a.id)',$q));
$gAnz = db_result(db_query($c),0);
$q = str_replace('{WHERE}',$where,str_replace('{SELECT}',$s,$q));
} elseif ($such == 'aeit') {
$where = "c.time >= ". $x ." AND c.erstid = ".$_SESSION['authid'];
$gAnz = db_result(db_query(str_replace('{WHERE}',$where,str_replace('{SELECT}',' COUNT(DISTINCT a.id)',$q))),0);
$q = str_replace('{WHERE}',$where,str_replace('{SELECT}',$s,$q));
} else {
$such = str_replace('-','',$such);
$such = str_replace('=','',$such);
$such = str_replace('&','',$such);
$serar = explode(' ', $such);
$str_forum = '';
$str_news = '';
$str_downs = '';
foreach($serar as $v) {
$str = str_replace('\'','',$v);
$str = str_replace('"','',$str);
$str = addslashes($str);
if ( !empty($str) ) {
$str_forum .= "txt LIKE '%".$str."%' AND ";
$str_news .= "news_text LIKE '%".$str."%' AND ";
$str_downs .= "`descl` LIKE '%".$str."%' AND ";
}
}
$q = "(
SELECT DISTINCT
0 as fid,
news_title as titel,
'news' as typ,
news_id as id,
news_time as time
FROM prefix_news
WHERE (".$str_news." 1 = 1)
AND (news_time >= ". $x .")
) UNION (
SELECT DISTINCT
prefix_topics.fid as fid,
prefix_topics.name as titel,
'foru' as typ,
prefix_topics.id as id,
time as time
FROM prefix_posts
LEFT JOIN prefix_topics ON prefix_topics.id = prefix_posts.tid
LEFT JOIN prefix_forums ON prefix_forums.id = prefix_topics.fid
WHERE (prefix_forums.view >= ".$_SESSION['authright']." OR prefix_forums.reply >= ".$_SESSION['authright']." OR prefix_forums.start >= ".$_SESSION['authright'].")
AND (".$str_forum." 1 = 1)
AND (time >= ". $x .")
GROUP BY prefix_topics.id
) UNION (
SELECT DISTINCT
0 as fid,
CONCAT( name, ' ', version ) AS titel,
'down' as typ,
id,
UNIX_TIMESTAMP(time) as time
FROM prefix_downloads
WHERE (".$str_downs." 1 = 1)
AND (time >= ". $x .")
)
ORDER BY time DESC";
$gAnz = db_num_rows(db_query($q));
}
$q .= " LIMIT ".$anfang.",".$limit;
$MPL = db_make_sites ($page , "" , $limit , "index.php?search=".urlencode($such)."&page=", "", $gAnz );
$tpl->set_ar_out(array('MPL'=>$MPL,'gAnz'=>$gAnz),1);
$q = db_query($q);
$class = '';
while($r = db_fetch_assoc($q) ) {
$class = ($class == 'Cmite' ? 'Cnorm' : 'Cmite' );
$r['class'] = $class;
if ($r['typ'] == 'foru') {
$r['ctime'] = db_result(db_query("SELECT MAX(time) FROM prefix_posts WHERE tid = ".$r['id']),0,0);
$r['ord'] = forum_get_ordner($r['ctime'],$r['id'],$r['fid']);
$r['link'] = 'forum-showposts-'.$r['id'];
} elseif ($r['typ'] == 'news') {
$r['ord'] = 'ord';
$r['link'] = 'news-'.$r['id'];
} elseif ($r['typ'] == 'down') {
$r['ord'] = 'ord';
$r['link'] = 'downloads-show-'.$r['id'];
}
$tpl->set_ar_out($r,2);
}
$tpl->out(3);
}
$design->footer();
?>
templates/search.htm
<form action="index.php" method="GET">
<input type="text" value="{search}" name="search" size="{size}" />
<input type="submit" value="{_lang_search}" />
</form>
<hr>
{EXPLODE}
<br /><br />
<div style="float: left">{MPL}</div>
<div style="float: right; text-align: right">Gesamt: {gAnz}</div><br /><br />
<table width="100%" cellpadding="2" cellspacing="1" border="0" class="border">
{EXPLODE}<tr class="{class}">
<td class="erstezeile" width="15"><img src="include/images/forum/{ord}.gif" width="15" height="15" border="0"></td>
<td class="erstezeile"><a href="?{link}">{titel}</a></td>
</tr>{EXPLODE}
</table>
{MPL}
{EXPLODE}<tr class="{class}">
<td class="erstezeile" width="15"><img src="include/images/forum/{ord}.gif" width="15" height="15" border="0"></td>
<td class="erstezeile"><a href="index.php?forum-showposts-{id}">{titel}</a></td><td width="170" align="right"><a href="index.php?forum-showposts-{id}-p{page}#{firstnew}">»Zum ersten neuen Beitrag«</a></td>