Перейти к содержимому


Фотография
- - - - -

[PHP 7] Директивы php нормальной работы работы с IPB 1.3


  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 admin

admin

    Administrator

  • Administrators
  • 43 сообщений

Отправлено 06 сен 2016 - 11:33

Думаю, что наступает пора заняться модернизацией кода для http://forums.ibreso...boty-s-ipb-13/)и MySQL 5.
1)
Файл: mySQL.php - тут правок полно.
В частности, было:

 /*========================================================================*/
    // Connect to the database                 
    /*========================================================================*/  
                   
    function connect() {
    //--------------------------
     	// Done SQL prefix yet?
     	//--------------------------
     	
     	if ( ! defined( 'SQL_PREFIX' ) )
     	{
     		$this->obj['sql_tbl_prefix'] = $this->obj['sql_tbl_prefix'] ? $this->obj['sql_tbl_prefix'] : 'ibf_';
     		
     		define( 'SQL_PREFIX', $this->obj['sql_tbl_prefix'] );
     	}
    	if ($this->obj['persistent'])
    	{
    	    $this->connection_id = mysql_pconnect( $this->obj['sql_host'] ,
												   $this->obj['sql_user'] ,
												   $this->obj['sql_pass'] 
												);
        }
        else
        {
			$this->connection_id = mysql_connect( $this->obj['sql_host'] ,
												  $this->obj['sql_user'] ,
												  $this->obj['sql_pass'] 
												);
		}
		
        if ( !mysql_select_db($this->obj['sql_database'], $this->connection_id) )
        {
            echo ("ERROR: Cannot find database ".$this->obj['sql_database']);
        }
		mysql_query("SET NAMES 'cp1251'");
		mysql_query("SET COLLATION_CONNECTION=CP1251_GENERAL_CI");
    }

Сделал так:
 

  /*========================================================================*/
    // Connect to the database                 
    /*========================================================================*/  
                   
    function connect() {
    //--------------------------
     	// Done SQL prefix yet?
     	//--------------------------
     	
     	if ( ! defined( 'SQL_PREFIX' ) )
     	{
     		$this->obj['sql_tbl_prefix'] = $this->obj['sql_tbl_prefix'] ? $this->obj['sql_tbl_prefix'] : 'ibf_';
     		
     		define( 'SQL_PREFIX', $this->obj['sql_tbl_prefix'] );
     	}
    	if ($this->obj['persistent'])
    	{
    	    $this->connection_id = mysqli_pconnect( $this->obj['sql_host'] ,
												   $this->obj['sql_user'] ,
												   $this->obj['sql_pass'] ,
												  $this->obj['sql_database']
												);
        }
        else
        {
			$this->connection_id = mysqli_connect( $this->obj['sql_host'] ,
												  $this->obj['sql_user'] ,
												  $this->obj['sql_pass'] ,
												  $this->obj['sql_database']
												);
		}
		
        if ( !$this->connection_id) 
        {
            echo ("ERROR: Cannot find database ".$this->obj['sql_database']);
        }
		mysqli_query($this->connection_id, "SET NAMES 'cp1251'");
		mysqli_query($this->connection_id, "SET COLLATION_CONNECTION=CP1251_GENERAL_CI");
    }
    

далее в файле:
 
 $this->query_id = mysql_query($the_query, $this->connection_id);
 
заменено на:
 
 $this->query_id = mysqli_query($this->connection_id, $the_query);
 
Т.е. параметры просто меняются местами.
 
далее:
 
$this->record_row = mysql_fetch_array($query_id, MYSQL_ASSOC);
 
заменено на:
 
$this->record_row = mysqli_fetch_array($query_id, MYSQLI_ASSOC);
 
итд по всему файлу, включая выводы ошибок. Подробно расписывать не буду - прикреплю лучше файл mySQL.php к посту, а там сами посмотрите.
Прикрепленный файл mySQL.php   21,31К  1 скачиваний

2)
index.php:
 
Там было вот такое:
 

class info {

	var $member     = array();
	var $input      = array();
	var $session_id = "";
	var $base_url   = "";
	var $vars       = "";
	var $skin_id    = "0";     // Skin Dir name
	var $skin_rid   = "";      // Real skin id (numerical only)
	var $lang_id    = "en";
	var $skin       = "";
	var $lang       = "";
	var $server_load = 0;
	var $version    = "v1.3";
	var $lastclick  = "";
	var $location   = "";
	var $debug_html = "";
	var $perm_id    = "";
	var $forum_read = array();
	var $topic_cache = "";
	var $session_type = "";

	function _info () {
		global $sess, $std, $DB, $INFO;
		
		$this->vars = $INFO;
		
		$this->vars['TEAM_ICON_URL']   = $INFO['html_url'] . '/team_icons';
		$this->vars['AVATARS_URL']     = $INFO['html_url'] . '/avatars';
		$this->vars['EMOTICONS_URL']   = $INFO['html_url'] . '/emoticons';
		$this->vars['mime_img']        = $INFO['html_url'] . '/mime_types';
	}
}

в PHP 7 это приводит к постоянному ворнингу на всех страницах:
 

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP

 
необходимо в этом классе function _info () заменить на: function __construct ()
То же самое нужно произвести практически в 85% файлах форума, где функция в классе имеет то же имя, что и сам класс (заменить функцию на function __construct ()) - проверил - работает и на версиях PHP 5.2.х и выше.
3)
 
index.php
 
Если у кого-то был установлен мод типа cookie IP ban, то
 

$usersip = getenv("REMOTE_ADDR"); 
		if(!$_COOKIE["CookieIp"]) {
			// Mmmm cookie
			setcookie("CookieIp", $usersip, time() + 99*99*99*99);
		}

99*99*99*99 - вот это дело уже приводит к ворнингу
 

parameter 3 to be integer

 
сделал так:
 

setcookie("CookieIp", $usersip, time() + 9999999);

4)
admin.php:
 
Если у кого установлен мод учета поисковиков mod_spider, то получаем ошибку:
 

Fatal error: 'break' not in the 'loop' or 'switch' context in

//-- mod_spider begin
    if ($IN['act'] == "op" && $IN['code'] == "spider") {
        if (file_exists(ROOT_PATH."sources/mods/spider/mod_spider_ad_func.php")) {
            require ROOT_PATH."sources/mods/spider/mod_spider_ad_func.php";
        } else {
            die("Could not call required function from file 'sources/mods/spider/mod_spider_ad_func.php'<br>Does it exist?");
        }
       break;
    }
//-- mod_spider end

убираем из этого участка:
 

break;

5)
 
ipchat.php:
 

$DB = @mysql_connect( $db_info['host'], $db_info['user'], $db_info['pass'] );

if ( ! @mysql_select_db( $db_info['database'] ) )
{
	die_nice();
	
	//-- script exits --//
}

заменен на:
 

$DB = @mysqli_connect( $db_info['host'], $db_info['user'], $db_info['pass'], $db_info['database'] );

if ( ! $DB )
{
	die_nice();
	
	//-- script exits --//
}
if ( ! $member = @mysql_fetch_array( $query_id, MYSQL_ASSOC ) )

на:
 

if ( ! $member = @mysqli_fetch_array( $query_id, MYSQLI_ASSOC ) )

вот такое:
 

$query_id = @mysql_query("SELECT m.mgroup, m.password, m.name, m.id  FROM {$db_info['tbl_prefix']}members m
						  WHERE m.name='".addslashes($username)."' LIMIT 1"
						 ,$DB);

заменил на такое:
 

$query_id = @mysqli_query($DB, "SELECT m.mgroup, m.password, m.name, m.id  FROM {$db_info['tbl_prefix']}members m
						  WHERE m.name='".addslashes($username)."' LIMIT 1"
						 );

это:
 

@mysql_close();

на это:
 

@mysqli_close($access);

прикреплю файл, т.к. еще там есть участки
Прикрепленный файл ipchat.php   5,63К  0 скачиваний
 
6)
jcounter.php (это файл, по-моему из мода статистики, в оригинальном Прикрепленный файл jcounter.php   5,46К  0 скачиваний
 
7)
 
postwarn.php (это файл, по-моему из мода предупреждений или защиты от перебора пароля Secure login - уже не помню, в оригинальном

вот это хозяйство:
 

$n = mysql_num_rows(mysql_query("SELECT * FROM ibf_awards WHERE mid='{$member['id']}'"));
if ($n > 0)
        {
                $member['awards'] = "Награды:  <a href='{$ibforums->vars['board_url']}/index.php?act=Awards&id={$member['id']}'>$n</a>";
        }
        else
        {
                $member['awards']  = "Награды: <i>Нет</i>";
        }

в PHP 7 приводит к фатальной ошибке и для mysqli_query требуется задать еще параметры, поэтому удалил этот код:

 

10)
 
У тех, у кого установлены моды BB-кодов, Secure login (Для тех, кто не в курсе поясню, что пока (на момент написания этого поста есть сайт
https://www1.rwb-essen.de/ibforen/index.php?ind=downloads&op=section_view&idev=1' rel='nofollow external'>https://www1.rwb-essen.de/ibforen/index.php?ind=downloads&op=section_view&idev=1, где еще чего-то там кумекают по версии Прикрепленный файл Mod_mySQL5_1_0_2.zip   52,58К  0 скачиваний - коррекция под MySQL 5.x .
Прикрепленный файл Mod_sec_update_131_2_8_0.zip   1,21МБ  0 скачиваний - это обновление безопасности от немцев (последняя правка 14.06.2015), включающая навероты по безопасности, тот самый антибрут и пр. - ставить или не ставить - решайте сами.
Прикрепленный файл Update_IPB_13_131.zip   3,26К  0 скачиваний - Это Обновление с http://ddd.ru/forums...d8b14&act=lang' rel='nofollow external'>Настройка языков выдает ошибку:

mySQL query error: select ibf_languages.*, count(ibf_members.id) as mcount from ibf_languages left join ibf_members on(ibf_members.language=ibf_languages.ldir) where (ibf_members.language is not null or ibf_members.language = 'en') group by ibf_languages.ldir order by ibf_languages.lname

mySQL error: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ddd.ibf_languages.lid' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

В MySQL 5.6 все работает. Как видно, в 5.7 надо решать вопросы нововведений, из-за которых идут ошибки

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column

https://dev.mysql.co...-handling.html' rel='nofollow external'>https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html


Читать дальше




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных