Seite 2 von 2

Verfasst: 10.06.2004 18:44
von Eclipse16V
Also ich bekomme diese Fehlermeldung:

Code: Alles auswählen

Fatal error: Call to a member function on a non-object in /home/www/web8/html/phpBB2/includes/functions_post.php on line 246

Verfasst: 10.06.2004 18:56
von makue
Also, da muss ich wohl ein einfügen irgendwo ein Sytax-Fehler eingeschlichen haben. Ich wollte gerade den Code nocheinmal direkt aus meinen Dateien rauskopieren und hier posten, habe aber bemerkt, dass das entfernen des Link-Codes beim editieren des Postings nicht mehr funktioniert, obwohl ich das aber getestet habe. Ich schaue mir das also noch einmal ganz genau an und poste dann noch einmal den korrekten Code. Bitte etwas Geduld.

Verfasst: 10.06.2004 19:12
von makue
So, da bin ich auch schon wieder. Wo der Syntaxfehler herkommt weiß ich nicht, den gab es ja bei mir nicht. Aber warum das plötzlich nicht mehr funktionierte war in der Beschreibung die Angabe "danach einfügen" statt "davor einfügen". Uas diesem Grund poste ich nun einfach mal die 2 Codeteile in den Dateien, mit einigen Zeilen davor und danach. Dann sieht man genau wo der Code reingehört.

posting.php

Code: Alles auswählen

    if ( $post_info['bbcode_uid'] != '' )
    {
      $message = preg_replace('/\:(([a-z0-9]:)?)' . $post_info['bbcode_uid'] . '/s', '', $message);
    }

    // add by makue 10.06.04 (Profillink für Usernamen im Posting)
    $message = preg_replace("/<a class=\"gen\" href=\"profile\.php\?mode=viewprofile&u=.+\" target=\"_blank\">/","", $message);
    $message = str_replace("</a >","", $message);
    // end of add

    $message = str_replace('<', '<', $message);
    $message = str_replace('>', '>', $message);
    $message = str_replace('<br />', "\n", $message);
    
    if ( $mode == 'quote' )
    {
      $orig_word = array();
      $replacement_word = array();
includes/functions_post.php

Code: Alles auswählen

      else if ( count($poll_options) > $board_config['max_poll_options'] ) 
      {
        $error_msg .= ( !empty($error_msg) ) ? '<br />' . $lang['To_many_poll_options'] : $lang['To_many_poll_options'];
      }
      else if ( $poll_title == '' )
      {
        $error_msg .= ( !empty($error_msg) ) ? '<br />' . $lang['Empty_poll_title'] : $lang['Empty_poll_title'];
      }
    }
  }
  // add by makue 10.06.04 (Profillink für Usernamen im Posting)
  if (!empty($message)) {
    $words = split("[/.-\,\!? ]",$message);
    foreach($words as $word) {
      $word = trim($word);
      if (strlen($word)>2) {
        $sql = "SELECT user_id FROM ".USERS_TABLE." WHERE username = '".$word."' LIMIT 1";
        if ( !($result = $db->sql_query($sql)) )
          message_die(GENERAL_ERROR, 'Cannot read userdata','',__LINE__,__FILE__,$sql);
        if( $row = $db->sql_fetchrow($result) ) {
          $message = ereg_replace($word,"<a class=\"gen\" href=\"profile.".$phpEx."?mode=viewprofile&u=".$row["user_id"]."\" target=\"_blank\">".$word."</a >",$message);
        }
      }
    }
  }
  // end of add 
  return;
}

//
// Post a new topic/reply/poll or edit existing post/poll
//
function submit_post($mode, &$post_data, &$message, &$meta, &$forum_id, &$topic_id, &$post_id, &$poll_id, &$topic_type, &$bbcode_on, &$html_on, &$smilies_on, &$attach_sig, &$bbcode_uid, &$post_username, &$post_subject, &$post_message, &$poll_title, &$poll_options, &$poll_length, &$MsgIcon)
{
Ich habe den Code jetzt eben direkt hier aus dem Posting kopiert und an die entsprechenden Stellen eingefügt, es funktioniert definitiv. Teste das doch bitte noch einmal. Leider kann man mit der Fehlermeldung nichts anfangen, da die total sinnlos ist. Aber darüber habe ich mich auch schon mehr als einmal geärgert. Irgendwo im Code ein Zeichen zuviel oder zu wenig und schon kann so eine Fehlermeldung entstehen.

Verfasst: 10.06.2004 19:39
von Fabse
Tuxman hat geschrieben:Ich war schon am Basteln, aber leider hab ich im Moment keinen PC... bin mal auf deine Lösung gespannt, makue. :)
WOW! Wie geht man ohne PC ins Netz? :D

Verfasst: 10.06.2004 19:43
von Eclipse16V

Verfasst: 10.06.2004 19:52
von makue
Das ist mir gerade wieder eingefallen, hatte ich total vergessen. Also das fehlt bei Dir schon mal. Ich weiß allerdings nicht ob das den Fehler verursacht. Der Code selbst scheint korrekt an den richtigen Stellen eingefügt zu sein. Also hoffe ich mal auf diese global-Definition.
makue hat geschrieben:Also, ich habe mal eben einen Code eingebaut. in der functions_post.php muss man in der Funktion prepare_post die Variable $db mit bei global... aufnehmen.
In Deinem Code ist es in Zeile 126, aus

Code: Alles auswählen

global $board_config, $userdata, $lang, $phpEx, $phpbb_root_path;
einfach

Code: Alles auswählen

global $board_config, $userdata, $lang, $phpEx, $phpbb_root_path, $db;
machen. Und hoffen...

Verfasst: 10.06.2004 19:56
von Fabse
ja

Verfasst: 10.06.2004 20:25
von makue
Wie ich im eigenen Board festgestellt habe, taugt der Code so nichts. Es werden auch Teilzeichenketten als Usernamen erkannt. Wenn es z.B. den User ulli gibt, wird aus Pulli ein P mit einem nachfolgendem ulli-Link. Also das ist dann doch nicht das gelbe vom Ei.

Man könnte die eine fehlerhafte Zeile in der functions_post.php durch diese hier ersetzen: $words = split("[/.,!?\ ]",$message);

In der alten Zeile habe ich zuviel "escaped". Aber auch mit dieser Änderung funktioniert das nur solange der Username einmal im Text vorkommt. Außerdem wird beim Editieren eines Postings mit zwei Usernamen der ganze Text zwischen den beiden Usernamen gelöscht. Ich weiß zwar woran es liegt, aber nicht, wie ich das auf die Schnelle beheben kann. Vielleicht kann ja jemand der sich mit preg_replace und regulären Ausdrücken richtig auskennt, weiterhelfen. Der Fehler liegt hier:

Code: Alles auswählen

$message = ereg_replace($word,"<a class=\"gen\" href=\"profile.".$phpEx."?mode=viewprofile&u=".$row["user_id"]."\" target=\"_blank\">".$word."</a >",$message); 
Man dürfte $word nur ersetzen, wenn ein Satzzeichen oder ein Leerzeichen davor und dahinter steht.

Und der Editierfehler (löschen von Zeichen zwischen 2 Usernamen) liegt hier:

Code: Alles auswählen

$message = preg_replace("/<a class=\"gen\" href=\"profile\.php\?mode=viewprofile&u=.+\" target=\"_blank\">/","", $message); 
Falls es kein andere korrigiert, mache ich mal morgen an eine Lösung. Ich muss jetzt leider weg...

Verfasst: 11.06.2004 00:13
von makue
Also, ich habe jetzt eine BBCode-Version. Ich sage jetzt mal noch nicht das sie funktioniert, obwohl sie das tut! :wink: Aber wie es ja immer so ist, wenn man sich sicher ist es geht, sind viele Fehler drin.

Das Prinzip arbeitet so, dass man [user]username[/user] eingeben muss. Das ist zwar etwas mehr Aufwand, dafür schnell und ohne Belastung der Datenbank. Jetzt weiß ich gar nicht ob eine solche Lösung gewünscht war, deshalb poste ich das hier erst einmal nicht. Ich kann das aber jederzeit tun.

Was noch nicht drin ist und es ist fraglich ob es sinnvoll ist, ist, dass die Usernamen auf Gültigkeit abgetestet werden. Man müsste es eigentlich beim Anzeigen des Postings abtesten, weil der User ja beim Erstellen des Postings noch hätte eingetragen sein können, beim lesen des Postings aber nicht mehr. Es ist nun Geschmackssache ob man das Einbaut oder eine Fehlermeldung akzeptiert, dass der User nicht in der Liste steht, wenn man auf diesen Link klickt.

Btw, ich hatte vorher schon einmal die viewprofile.php modifiziert, dass sie nicht nur mit der user_id, sondern auch mit dem Usernamen aufgerufen werden kann. (Habe ich für ein Chat-Mod gebraucht, damit im Chat-Applet von einem User der nicht mit diesem Applet online ist, aber im Board Mitglied ist, das Profil angezeigt werden kann) Das habe ich nun auch bei dieser Modifikation benutzt.

Insgesamt müsste man also für diese BBCode Sache mit dem Profil 3 Dateien editieren. Das Ganze dürfte recht einfach sein.