WBB 2.3.6 und PHP 7.0/7.1 (Umbauanleitung) *Update 07.12.2016*

Hallo Freunde,

ich zeige euch heute, wie ihr euer uralt-WBB2.3.6 unter PHP 7 (sowohl 7.0 als auch 7.1) zum Laufen bekommt. ­čÖé

Zun├Ąchst einmal solltet ihr euer Forum an php 5.6 angepasst haben. Eine Anleitung dazu habe ich hier online gestellt: https://blog.kill0rz.com/2015/04/25/wbb-2-3-6-und-php-5-6/
Danach solltet ihr die Anpassungen von MikeHH durchf├╝hren, ihr findet sie hier im Anhang: http://www.v-gn.de/wbb/thread.php?postid=129625#post129625
Den darauf folgenden Post bitte ignorieren, das funktioniert ausdr├╝cklich nicht! Darum k├╝mmern wir uns aber…

fire - kill0rz.com

Wenn das geschafft ist, geht es weiter. Zun├Ąchst einmal schauen wir uns die Migrationsanleitungen vom php-Team an: http://php.net/manual/de/migration70.php
Besonders interessant sind folgende Links:

  • Deprecated features in PHP 7.0.x
  • Die PHP 4-Style Konstruktoren (Name der Konstruktormethode = Name der Klasse) werfen jetzt eine Deprecated-Meldung. Mit PHP 5.3 wurde der neue Style bereits eingef├╝hrt (Konstruktormethode hei├če __construct) und bis einschlie├člich php 5.6.X parallel weitergef├╝hrt. Jetzt wie gesagt die deprecated-Meldung. Man k├Ânnte es noch herausz├Âgern, aber wir b├╝geln die ├änderungen gleich dr├╝ber.
  • Changed functions
    • Hier schauen wir uns zun├Ąchst die Funktion mktime an, die nun keinen 7. Paramter mehr akzeptiert. Wir haben aber in unserer Software keinen einzigen Aufruf dessen.
    • Das gleiche gilt f├╝r gmmktime.
    • Unsere geliebte preg_replace()-Funktion akzeptiert jetzt den /e-Modifier gar nicht mehr. Da muss viel ge├Ąndert werden.
    • Die anderen Ge├Ąnderte Funktionen haben keine Auswirkungen auf unser WBB.
  • Removed Extensions and SAPIs
    • Die mysql-Erweiterung wurde entfernt. Good thing haben wir die aber schon damals rausgeschmissen ­čÖé
  • Backward incompatible changes
    • global akzeptiert nur noch einfache Variablen. Da m├╝ssen wir etwas machen.
    • Das new-Statement kann keiner Variablen mehr ├╝ber eine Referenz zugewiesen werden (class C {}; $c =& new C;). ├ťber einen Regex kann man feststellen, wo wir hier etwas ├Ąndern m├╝ssen: /\& +new/
  • Other Changes
    • Die date.timezone-Warnung wurde entfernt. Defaultwert ist UTC.
      Grunds├Ątzlich erstmal egal, wenn wir unser php ordentlich konfiguriert haben, aber es kann dennoch nicht schaden, folgendes zu tun:

/global.php

Suche:

<?php

<em>F├╝ge darunter ein:</em>

date_default_timezone_set('Europe/Berlin');

Going hot now:

Hier nochmal der Hinweis: Jedes WBB ist einzigartig. Es kann sein, dass durch Hacks oder sonstige Code├Ąnderungen diese Anleitung hier nicht vollst├Ąndig ist. Das bitte selbst pr├╝fen!
Au├čerdem nat├╝rlich wie immer der Hinweis: Keine Garantie, ist aber trotzdem getestet, wenn dennoch Fehler auffallen, bitte melden, damit die behoben werden k├Ânnen. ­čśë

Als erstes k├╝mmern wir uns um die global-Geschichte:

/acp/lib/functions.php
Suche:

global $$name, $wbbuserdata;

Ersetze mit:

global ${$name}, $wbbuserdata;

/lcd.php (Ein Hack, also optional)
Suche:

global $$letter

Ersetze mit:

global ${$letter}

Dann beseitigen wir die &new-Fehler. Ich habe diese allerdings nur in Hacks gefunden, sodass es euch wahrscheinlich gar nicht betrifft:

/xy_megashoutbox.php
/gaestebuch.php

Suche (mehrfach):

&new parse

Ersetze mit:

new parse

Danach schauen wir uns die regul├Ąren Ausdr├╝cke mit den /e-Modifiern an:

/acp/lib/class_parse.php
Suche:

var $search = array();
var $replace = array();
var $replace2 = array();

F├╝ge darunter ein:

var $search_replace = array();
var $search_replace2 = array();

Suche:

$this->search[] = "/\[list=(&quot;|['\"]?)([^\"']+)\\1](.+)\[\/list((=\\1[^\"']+\\1])|(\]))/esiU";
$this->replace[] = "\$this->formatlist('\\3', '\\2')";
$this->search[] = "/\[list](.+)\[\/list\]/esiU";
$this->replace[] = "\$this->formatlist('\\1')";
$this->search[] = "/\[url=("|['\"]?)([^\"']+)\\1](.+)\[\/url\]/esiU";
$this->replace[] = "\$this->formaturl('\\2','\\3')";
$this->search[] = "/\[url]([^\"\[]+)\[\/url\]/eiU";
$this->replace[] = "\$this->formaturl('\\1')";

Ersetze mit:

$this->search_replace['/\[list=("|[\'"]?)([^"\']+)\1](.+)\[\/list((=\1[^"\']+\1])|(\]))/siU'] = function($matches) { return $this->formatlist($matches[3],$matches[2]);};
$this->search_replace['/\[list](.+)\[\/list\]/siU'] = function($matches) { return $this->formatlist($matches[1]);};
$this->search_replace['/\[url=("|[\'"]?)([^"\']+)\1](.+)\[\/url\]/siU'] = function($matches) { return $this->formaturl($matches[2],$matches[3]);};
$this->search_replace['/\[url]([^"\[]+)\[\/url\]/iU'] = function($matches) { return $this->formaturl($matches[1]);};

Suche:

$this->replace2[] = "'$this->breakChar[list=\\1$this->breakChar\\2$this->breakChar\\1]$this->breakChar'.\$this->stripSlashes('\\3').'$this->breakChar[/list=\\1$this->breakChar\\2$this->breakChar\\1]$this->breakChar'"; 
$this->replace2[] = "'$this->breakChar[list]$this->breakChar'.\$this->stripSlashes('\\1').'$this->breakChar[/list]$this->breakChar'"; 
$this->replace2[] = "'$this->breakChar[url=\\1$this->breakChar'.\$this->insertBreakChar('\\2').'$this->breakChar\\1]$this->breakChar'.\$this->stripSlashes('\\3').'$this->breakChar[/url]$this->breakChar'";
$this->replace2[] = "'$this->breakChar[url]$this->breakChar' . \$this->insertBreakChar('\\1') . '$this->breakChar[/url]$this->breakChar'";

Ersetze mit:

$this->search_replace2['/\[list=(&quot;|[\'"]?)([^"\']+)\1](.+)\[\/list((=\1[^"\']+\1])|(\]))/siU'] = function($matches) { return $this->breakChar.'[list='.$matches[1].$this->breakChar.$matches[2].$this->breakChar.$matches[1].']'.$this->breakChar.$this->stripSlashes($matches[3]).$this->breakChar.'[/list='.$matches[1].$this->breakChar.$matches[2].$this->breakChar.$matches[1].']'.$this->breakChar;};
$this->search_replace2['/\[list](.+)\[\/list\]/siU'] = function($matches) { return $this->breakChar.'[list]'.$this->breakChar.$this->stripSlashes($matches[1]).$this->breakChar.'[/list]'.$this->breakChar;};
$this->search_replace2['/\[url=(&quot;|[\'"]?)([^"\']+)\1](.+)\[\/url\]/siU'] = function($matches) { return $this->breakChar.'[url='.$matches[1].$this->breakChar.$this->insertBreakChar($matches[2]).$this->breakChar.$matches[1].']'.$this->breakChar.$this->stripSlashes($matches[3]).$this->breakChar.'[/url]'.$this->breakChar;};
$this->search_replace2['/\[url]([^"\[]+)\[\/url\]/iU'] = function($matches) { return $this->breakChar.'[url]'.$this->breakChar.$this->insertBreakChar($matches[1]).$this->breakChar.'[/url]'.$this->breakChar;};

Suche:

if ($allowdynimg == 1) $this->imgsearch2 = "/\[img]([^\"]+)\[\/img\]/esiU";
else $this->imgsearch2 = "/\[img]([^\"\?\&]+\.(gif|jpg|jpeg|bmp|png))\[\/img\]/esiU";
$this->imgreplace2 = "'$this->breakChar[img]$this->breakChar' . \$this->insertBreakChar('\\1') . '$this->breakChar[/img]$this->breakChar'";

Ersetze mit:

if ($allowdynimg == 1) $this->imgsearch2 = "/\[img]([^\"]+)\[\/img\]/siU";
else $this->imgsearch2 = "/\[img]([^\"\?\&]+\.(gif|jpg|jpeg|bmp|png))\[\/img\]/siU";
$this->imgreplace2 = function($matches) { return $this->breakChar.'[img]'.$this->breakChar.$this->insertBreakChar($matches[1]).$this->breakChar.'[/img]'.$this->breakChar;};

Suche:

if ($allowbbcode == 1) {
	if ($this->done['bbcode'] != 1) $this->getbbcode(); 
	$post = preg_replace($this->search, $this->replace, $post);
}

Ersetze mit:

if ($allowbbcode == 1) {
	if ($this->done['bbcode'] != 1) $this->getbbcode();
	$post = preg_replace_callback_array($this->search_replace, $post);
	$post = preg_replace($this->search, $this->replace, $post);
}

Suche:

if ($allowbbcode == 1) {
	if ($this->done['bbcode'] != 1) $this->getbbcode(); 
	$post = preg_replace($this->search, $this->replace2, $post);
	if ($allowimages != 0) $post = preg_replace($this->imgsearch2, $this->imgreplace2, $post);
}

Ersetze mit:

if ($allowbbcode == 1) {
	if ($this->done['bbcode'] != 1) $this->getbbcode();
	$post = preg_replace_callback_array($this->search_replace2, $post); 
	$post = preg_replace($this->search, $this->replace2, $post);
	if ($allowimages != 0) $post = preg_replace_callback($this->imgsearch2, $this->imgreplace2, $post);
}

/acp/lib/functions.php
Suche:

preg_replace("%\[url\]".$threadid_pattern."\[/url\]%ieU", "\$catched_threadids[]=\\3;", $message);
preg_replace("%\[url\]".$postid_pattern."\[/url\]%ieU", "\$catched_postids[]=\\3;", $message);

Ersetze mit:

preg_replace_callback("%\[url\]".$threadid_pattern."\[/url\]%iU", function($matches) use (&$catched_threadids) { $catched_threadids[]=$matches[3];}, $message);
preg_replace_callback("%\[url\]".$postid_pattern."\[/url\]%iU", function($matches) use (&$catched_postids) { $catched_postids[]=$matches[3];}, $message);

Suche:

if (count($threadcache)) {
	// insert topics
	$message = preg_replace("%\[url\]".$threadid_pattern."\[/url\]%ieU", "makeLocalLink('\\1',\\3)", $message);
	$message = preg_replace("%\[url\]".$postid_pattern."\[/url\]%ieU", "makeLocalLink('\\1',\\3,1)", $message);
}

Ersetze mit:

if (count($threadcache)) {
	// insert topics
	$message = preg_replace_callback("%\[url\]".$threadid_pattern."\[/url\]%iU", function($matches) { return makeLocalLink($matches[1],$matches[3]);},$message);
	$message = preg_replace_callback("%\[url\]".$postid_pattern."\[/url\]%iU", function($matches) { return makeLocalLink($matches[1],$matches[3],1);}, $message);
}

/acp/lib/class_templateparser.php
Suche:

$code = preg_replace('!<if\((.*)\)>!sieU', '"\".((".$this->stripSlashes(\'\\1\').") "', $code);

Ersetze mit:

$code = preg_replace_callback('!<if\((.*)\)>!siU', function($matches) { return '".(('.$this->stripSlashes($matches[1]).') ';}, $code);

Suche:

$code = preg_replace('!<expression>(.*)</expression>!sieU', '"\".".$this->stripSlashes(\'\\1\').".\""', $code);

Ersetze mit:

$code = preg_replace_callback('!<expression>(.*)</expression>!siU', function($matches) { return '".'.$this->stripSlashes($matches[1]).'."';}, $code);

/acp/lib/class_parsecode.php
Suche:

function doparse($post) {

Ersetze mit:

function doparse($post, $allowsmilies=false, $allowhtml=false, $allowbbcode=false, $allowimages=false) {

Massig Dank dabei an Schrimm, der hier einige Zeit investiert hat! ­čÖé

Ich habe bei mir noch Reste von der alten MYSQL-Erweiterung gefunden.
Zur Sicherheit k├Ânnen wir nochmal nach Konstanten suchen.

fire - kill0rz.com

Suche ├╝berall nach (insbesondere in /acp/group.php, /acp/lib/admin_functions.php, /acp/lib/functions.php und /acp/style.php):

MYSQL_BOTH

Ersetze mit:

MYSQLI_BOTH

Suche ├╝berall nach (insbesondere in /acp/group.php, /acp/lib/admin_functions.php, /acp/lib/functions.php und /acp/style.php):

MYSQL_ASSOC

Ersetze mit:

MYSQLI_ASSOC

Dann fiel mir beim durchsehen auf, dass wir ja tats├Ąchlich noch ereg_replace-Aufrufe im Quelltext haben! :O
Wird gleich mit ge├Ąndert:

/acp/lib/class_zip.php
Suche:

$date = ereg_replace($regexp, "\\1-\\2-\\3-\\4-\\5-\\6", $date);

Ersetze mit:

$date = preg_replace($regexp, "\\1-\\2-\\3 \\4:\\5:\\6", $date);

/acp/shoutbox.php (Offenbar ein Hack, also optional)
Suche:

$ereza = ereg_replace(",","", $groupwerte);

Ersetze mit:

$ereza = preg_replace("/,/","", $groupwerte);

So, jetzt bauen wir noch schnell die Klassen um. Das WBB wurde auf dem Standard von vor php 5.3.3 geschrieben, der besagt, dass der Konstruktor einer Klasse den Klassennamen tr├Ągt. Das hei├čt, wir m├╝ssen jetzt alle Klassenkonstruktoren ├Ąndern.

/acp/lib/class_variableimport.php
Suche:

function variableimport($filename) {

F├╝ge dar├╝ber ein:

function __construct($filename) {
	$this->variableimport($filename);
}

/acp/lib/class_parse.php
Suche:

function parse($docensor = 0, $wrapwidth = 0, $showimages = 0, $hilight = '', $usecode = 1, $cuturls = 1, $useCaching = 0) {

F├╝ge dar├╝ber ein:

function __construct($docensor = 0, $wrapwidth = 0, $showimages = 0, $hilight = '', $usecode = 1, $cuturls = 1, $useCaching = 0) {
	$this->parse($docensor, $wrapwidth, $showimages, $hilight, $usecode, $cuturls, $useCaching);
}

/acp/lib/class_tpl_file.php
Suche:

function tpl($templatepackid = 0, $path = ".") {

F├╝ge dar├╝ber ein:

function __construct($templatepackid = 0, $path = ".") {
	$this->tpl($templatepackid, $path);
}

/acp/lib/class_useronline.php
Suche:

function useronline($can_view_ghosts, $buddylist = '') {

F├╝ge dar├╝ber ein:

function __construct($can_view_ghosts, $buddylist = '') {
	$this->useronline($can_view_ghosts, $buddylist);
}

/acp/lib/class_query.php
Suche:

function query($query) {

F├╝ge dar├╝ber ein:

function __construct($query) {
	$this->query($query);
}

/acp/lib/class_db_mysql.php
Suche:

function db($server, $user, &$password, $database, $phpversion) {

F├╝ge dar├╝ber ein:

function __construct($server, $user, &$password, $database, $phpversion) {
	$this->db($server, $user, $password, $database, $phpversion);
}

/acp/lib/class_language.php
Suche:

function language($languagepackid, $path = '.') {

F├╝ge dar├╝ber ein:

function __construct($languagepackid, $path = '.') {
	$this->language($languagepackid, $path);
}

/acp/lib/class_parsecode.php
Suche:

function parsecode($usecode = 1) {

F├╝ge dar├╝ber ein:

function __construct($usecode = 1) {
	$this->parsecode($usecode);
}

/acp/lib/class_options.php
Suche:

function options($path2lib) {

F├╝ge dar├╝ber ein:

function __construct($path2lib) {
	$this->options($path2lib);
}

/acp/lib/class_smtp.php
Suche:

function smtp_socket() {

F├╝ge dar├╝ber ein:

function __construct() {
	$this->smtp_socket();
}

/acp/lib/class_onpm.php (Ein Hack, also optional)
Suche:

function onpm(){

F├╝ge dar├╝ber ein:

function __construct() {
	$this->onpm();
}

Das d├╝rfte alles gewesen sein. Viel Spa├č unter PHP 7 =)
kill0rz

PS: Ein gro├čes Lob an die Community, dass wir das auf die Beine gestellt bekommen haben. Das zeigt eben, dass das WBB2 noch lange nicht tot ist! ­čÖé

//Update 15.02.2016

Da fehlte noch was ­čÖé

/thread.php
Suche:

function FlatThread($threadid) {

F├╝ge dar├╝ber ein:

function __construct($threadid){
	$this->FlatThread($threadid);
}

Suche:

function ThreadedThread($threadid) {

F├╝ge dar├╝ber ein:

function __construct($threadid) {
	$this->ThreadedThread($threadid);
}

//Update 16.02.2016

…und weiter gehts ­čÖé

/acp/lib/class_headers.php
Suche:

function send($isacp = 0) {

Ersetze mit:

public static function send($isacp = 0) {

/acp/misc.php
Suche:

function menu(&$itemgroupbit1, &$itemgroupbit2, $personalmenu = 1, $markfirst = 0, $hidelast = 0) {

F├╝ge dar├╝ber ein:

function __construct(&$itemgroupbit1, &$itemgroupbit2, $personalmenu = 1, $markfirst = 0, $hidelast = 0) {
	$this->menu($itemgroupbit1, $itemgroupbit2, $personalmenu, $markfirst, $hidelast);
}

Habe auch die Konstruktoren korrigiert, da haben sich Copy&Paste-Fehler eingeschlichen. Bitte nachbessern!

//Update 02.03.2016

Die Zeile

$this->search[] = "/\[list=(&quot;|['\"]?)([^\"']+)\\1](.+)\[\/list((=\\1[^\"']+\\1])|(\]))/esiU";

muss auch entfernt werden; oben korrigiert.

Weiterhin: Habe die Zeile

$date = preg_replace($regexp, "\\1-\\2-\\3 \\4:\\5:\\6", $date);

zu

$date = preg_replace($regexp, "\\1-\\2-\\3-\\4-\\5-\\6", $date);

korrigiert.
Schrimm hat dazu sogar noch eine Codeoptimierung rausgehauen:
Suche nach:

$date = date("Y-m-d H:i:s", $date);

$regexp = "([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})";
$date = ereg_replace($regexp, "\\1-\\2-\\3-\\4-\\5-\\6", $date);
$date_array = explode("-", $date);

(hier gff. preg_replace suchen)

Ersetze mit:

$date = date("Y-m-d-H-i-s", $date);
$date_array = explode("-", $date);

//Update 07.12.2016

Es hat sich herausgestellt, dass Escapings in php- und code-Tags entfernt werden. Daher muss noch folgende Anpassung vorgenommen werden:

/acp/lib/class_parsecode.php

Suche:

while (list($varnr, $code) = each($val)) {
$post = str_replace("{" . $this->hash . "_" . $mode . "_" . $varnr . "}", "[" . $mode . "]" .     str_replace("\\\"", "\"", $code) . "[/" . $mode . "]", $post);
}

Ersetze mit:

while (list($varnr, $code) = each($val)) {
$post = str_replace("{" . $this->hash . "_" . $mode . "_" . $varnr . "}", "[" . $mode . "]" .     $code . "[/" . $mode . "]", $post);
}

/acp/lib/class_parse.php

Folgende Zeile auskommentieren (kommt mehrfach vor):

$code = $this->stripSlashes($code);
This entry was posted in Allgemein, Internet, Tutorials, Updated, WBB. Bookmark the permalink.

6 Responses to WBB 2.3.6 und PHP 7.0/7.1 (Umbauanleitung) *Update 07.12.2016*

  1. thorsten Schnack says:

    irkenwie bekommsch mein wbb unter php 5.4 nich ans laufen richtig k├Ânntest es dir ma aschauhen

  2. Christopher says:

    Erstmal einen gro├čen Dank an deine Anleitung, hat mir sehr geholfen. Da der Provider von meinem Kunden umstellt und alle PHP Versionen au├čer 5.6 und 7 deaktiviert war ich dazu gezwungen ­čśë

    Was ich aber noch machen musste das das Forum TEILWEISE funktioniert war in den Dateien /gloabl.php und /acp/global.php diesen Eintrag zu erg├Ąnzen.

    Suchen :
    @set_magic_quotes_runtime(0);

    Ersetzen :
    if ( !function_exists(ÔÇśset_magic_quotes_runtimeÔÇÖ) ) {
    function set_magic_quotes_runtime($value) { return true;}
    }
    set_magic_quotes_runtime(0);

    dann ging wenigstens das Forum auf ­čśë

    Vielleicht kannst du mir noch einen TIPP geben, die BB Codes werden nicht umgesetzt. d.h. wenn jemand [B]FETT[/B] verwendet kommt der Output als FETT im Thread.
    Im HTML Code steht das dann so <b>FETT </b> ich vermute mal das liegt am parsen nur WO.

    W├Ąre nett wenn du mir einen Tipp in die richtige Richtung geben k├Ânntest.

    Danke Chris

    • kill0rz says:

      Hallo Chris,

      das parsing findet in der Datei /acp/lib/class_parse.php statt. Ich vermute, dass mit deinen RegEx’en etwas nicht stimmt. Am besten du meldest dich mal bei Viktor im Forum (http://www.v-gn.de/wbb/board.php?boardid=72) und machst einen neuen Thread auf. Dann die betroffenen Dateien anh├Ąngen, dann kann ich eher helfen als hier ­čÖé

      Viele Gr├╝├če,
      kill0rz

  3. Gauss says:

    Hallo,

    scheinbar hat sich da der functions.php:
    geh├Âren diese beiden Zeilen rein:
    preg_replace_callback(„%\[url\]“.$threadid_pattern.“\[/url\]%iU“, function($matches) use (&$catched_threadids) { $catched_threadids[]=$matches[3];}, $message);
    preg_replace_callback(„%\[url\]“.$postid_pattern.“\[/url\]%iU“, function($matches) use (&$catched_postids) { $catched_postids[]=$matches[3];}, $message);

    Es fehlten in die [] nach $catched_postids.

    Viele Gr├╝├če und danke f├╝r die Anleitung

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht ver├Âffentlicht. Erforderliche Felder sind mit * markiert.

Bitte l├Âse die Rechnung! * Time limit is exhausted. Please reload CAPTCHA.