Поменять префиксы на всех таблицах БД - Дизайн и модификация Invision Power Board

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

 

Правила раздела

Здесь обсуждаются вопросы по настройке и администрированию форумов IPB 3.x.
Пожалуйста, не оффтопьте, если зашли сюда случайно, и обратите внимание на соседние разделы.
Установка, настройка и обслуживание форумов IPB 2.x.
Оформление форумов, включая верстку скинов.
Размещение рекламы на форумах.
SEO оптимизация форума.
Техническая поддержка наших скинов и модов.

СвернутьПрикрепленные теги

префикс таблиц

  • 2 Страниц +
  • 1
  • 2

Поменять префиксы на всех таблицах БД

#1 Пользователь не на сайте   Одмин ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 574
  • Регистрация: 21-Апрель 13
  • Репутация: 41
  • IPB version:3.4.x
 

Отправлено 18 Август 2014 - 10:25

Ну вопрос, собственно, в заголовке - каким запросом можно поменять префиксы сразу на всех таблицах? Ещё, если не ошибаюсь, в каких-то файлах ips_kernel нужно указывать изменённый префикс к таблицам. Ткните куда залезть и что выполнить! Благодарю!
0

#2 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 735
  • Регистрация: 20-Март 09
  • Репутация: 2 273
  • IPB version:3.1.x
 

Отправлено 18 Август 2014 - 14:23

Одним запросом все префиксы не поменять. Переименовать можно только по одной таблице. Для всех сразу нужно написать небольшой скрипт.
Префикс таблиц указывается в conf_global.php - sql_tbl_prefix

<?php

$new_prefix = 'ibf_';

header('Content-type: text/plain');
require 'conf_global.php';

mysql_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass'])
	or die(mysql_error());
mysql_select_db($INFO['sql_database']);

$res = mysql_query('SHOW TABLES');
while($row = mysql_fetch_assoc($res)){
	$table   = current($row);
	$new_tbl = '';
	if($INFO['sql_tbl_prefix']){
		if(strpos($table, $INFO['sql_tbl_prefix']) === 0){
			$new_tbl = $new_prefix . substr($table, strlen($INFO['sql_tbl_prefix']));
		}
	}
	else{
		$new_tbl = $new_prefix . $table;
	}

	if($new_tbl){
		mysql_query("ALTER TABLE `{$table}` RENAME TO `{$new_tbl}`");
		echo "RENAME TABLE {$new_tbl}\n";
	}
}

?>


1. Поместить скрипт в корень форума.
2. Задать новый префикс в $new_prefix.
3. После выполнения скрипта открыть /conf_global.php и указать новый префикс в sql_tbl_prefix.

Учтите, что если таблицы не имеют префикса будут переименованы все таблицы в этой базе.
5

#3 Пользователь не на сайте   Одмин ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 574
  • Регистрация: 21-Апрель 13
  • Репутация: 41
  • IPB version:3.4.x
 

Отправлено 18 Август 2014 - 16:17

siv1987, как всегда дали дельный совет! Спасибо! Всё работает, префиксы благополучно сменились.
0

#4 Пользователь не на сайте   Одмин ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 574
  • Регистрация: 21-Апрель 13
  • Репутация: 41
  • IPB version:3.4.x
 

Отправлено 22 Август 2014 - 13:49

siv1987, наблюдается странная ситуация. После переименования префиксов , некоторые пользователи (не все подряд) не могут залогиниться на форуме и после введения своих данных получают вот это:

Could not successfully run query (SELECT * FROM `ibf_members` where name='matanya' limit 1) from DB: Table 'salekh_11.ibf_members' doesn't exist


Не в курсе, что за проблема?
0

#5 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 735
  • Регистрация: 20-Март 09
  • Репутация: 2 273
  • IPB version:3.1.x
 

Отправлено 22 Август 2014 - 14:11

Возможно используете скрипты с прямыми запросами к бд. Ищите на сервере файлы которые содержат строку:
Could not successfully run query

если есть доступ по ssh:
find . -name '*.php' | xargs grep "Could not successfully run query"

Эта не стандартная ошибка форума. Если ошибка выскакивает при авторизации, возможно какие-то модули авторизации.
0

#6 Пользователь не на сайте   Одмин ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 574
  • Регистрация: 21-Апрель 13
  • Репутация: 41
  • IPB version:3.4.x
 

Отправлено 22 Август 2014 - 14:58

siv1987, переименовал префикс к таблицам БД обратно на дефолтный "ibf_". Ошибка изменилась. Теперь пользователь видет ошибку неверности логина и/или пароля. Вручную изменил пользователю пароль и его пустило на форум.

Интересно, в чем может заключаться ошибка? Возможно, при переименовании префикса к таблицам, произошли какие-то правки в таблице с паролями. Самое интересное, что ошибка произошла выборочно, не у всех пользователей.
0

#7 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 735
  • Регистрация: 20-Март 09
  • Репутация: 2 273
  • IPB version:3.1.x
 

Отправлено 22 Август 2014 - 15:07

Никакие там правки не происходят. А все беды от того, что используются захардкоденные запросы типа SELECT * FROM ibf_members в обход конструктора запросов, или без переменной префикса sql_tbl_prefix.
Ищите в файлах где этот проблемный запрос по строке ошибки.
0

#8 Пользователь не на сайте   Одмин ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 574
  • Регистрация: 21-Апрель 13
  • Репутация: 41
  • IPB version:3.4.x
 

Отправлено 10 Сентябрь 2014 - 19:14

siv1987, обшарил весь сервер, не нашел я файла с такой строкой:
Could not successfully run query
, зато в /ips_kernel/classDbMysqlClient.php и в /ips_kernel/classDbMysqliClient.php есть такие строки:

//-----------------------------------------
        // Change the table prefix if needed
        //-----------------------------------------

        /*if ( $this->no_prefix_convert )
        {
        	$bypass = 1;
        }

        if ( ! $bypass )
        {
			if ( $this->obj['sql_tbl_prefix'] != "ibf_" and ! $this->prefix_changed )
			{
			   //$the_query = preg_replace("/\sibf_(\S+?)([\s\.,]|$)/", " ".$this->obj['sql_tbl_prefix']."\\1\\2", $the_query);
			}
        }*/

Мне в обоих файлах надо заменить префиксы, т.е. сделать 4 правки в 2-х файлах (по 2 правки в каждом)?
0

#9 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 735
  • Регистрация: 20-Март 09
  • Репутация: 2 273
  • IPB version:3.1.x
 

Отправлено 10 Сентябрь 2014 - 19:41

Просмотреть сообщениеАсид сказал(а):

обшарил весь сервер, не нашел я файла с такой строкой

Раз выводится значит где-то есть.
Нет такого запроса в дефолтном ИПБ - SELECT * FROM `ibf_members` where name='matanya' limit 1. Не использует форум поиск по полю name, и выражения where и limit написаны маленькими буквами - что при использования конструктора такого быть не должно.

Просмотреть сообщениеАсид сказал(а):

Мне в обоих файлах надо заменить префиксы, т.е. сделать 4 правки в 2-х файлах (по 2 правки в каждом)?

Здесь менять ничего не нужно. Во первых этот код закоментирован, а во вторых он действует наоборот, меняя префикс с ibf_ на текущий.
0

#10 Пользователь не на сайте   Одмин ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 574
  • Регистрация: 21-Апрель 13
  • Репутация: 41
  • IPB version:3.4.x
 

Отправлено 10 Сентябрь 2014 - 20:25

siv1987, поставил перепроверку по тексту "Could not successfully run query". В ходе проверки выявило всего один файл. Это индексный файл (index.php), который лежит в корне форума! Разве это нормально? :blink:
Предоставляю вам содержимое файла. Скажите, что здесь нужно сделать, и нет ли признаков "вмешательства извне"?

<?php

if (isset($_POST['rememberMe']) and isset($_POST['ips_username']) and isset($_POST['ips_password'])
 	and $_GET['section']=='login' aND $_GET['do']=='process')
{     
#$_POST['ips_username']='Полосатая';                      /*name*/
#$_POST['ips_password']='123'; /*members_pass_hash*/

	$login 		= $_POST['ips_username'];
	$password 	= $_POST['ips_password'];

	include_once 'conf_global.php';
 	$link = mysql_connect($INFO['sql_host'], $INFO['sql_user'], $INFO['sql_pass'])  or die("Could not connect: " . mysql_error());

 	if (!mysql_select_db($INFO['sql_database'])) {
        echo "Unable to select mydbname: " . mysql_error();
        exit;
    }

	mysql_query("SET NAMES utf8");

    $sql = "SELECT * FROM `ibf_members` where name='".mysql_real_escape_string($login) ."' limit 1" ;
 
    $result = mysql_query($sql);

    if (!$result) {
        echo "Could not successfully run query ($sql) from DB: " . mysql_error();
        exit;
    }
    
    if (mysql_num_rows($result) == 0) {
#        echo "No rows found, nothing to print so am exiting $sql";
#        exit;
    }
 
    while ($row = mysql_fetch_assoc($result)) {
		#$row["members_pass_hash"] = '$1$SD10$8CxSQ4GVOPuriBwPV4WQC0';

		$xhash = $row["members_pass_hash"];
	    preg_match('/(\$1\$[^\$]+)/',$xhash,$xsalt);
		if (!isset($xsalt[0])) continue;

	    $xsalt = $xsalt[0];
	    if ($xhash == crypt($password,$xsalt)){ 
 


        //UPDATE PASS IPB
		function Ggenerate_password_salt($len=5) 
		{ 
		    $salt = ''; 
		    for ( $i = 0; $i < $len; $i++ ) 
		    { 
		        $num   = rand(33, 126); 
		        if ( $num == '92' ) 
		        { 
		            $num = 93; 
		        } 
		             
		        $salt .= chr( $num ); 
		    } 
		         
		    return $salt; 
		}

        $salt     	= Ggenerate_password_salt(5);
        $salt 		= str_replace( '\\', "\\\\", $salt );
        $passhash 	= md5( md5($salt) . md5( $password ) );
        $passhash 	= mysql_real_escape_string($passhash);
        $salt 		= mysql_real_escape_string($salt);
        mysql_query( "UPDATE ibf_members 
		SET members_pass_salt='{$salt}', members_pass_hash='{$passhash}', last_activity=now() ,member_login_key='".mysql_real_escape_string(md5($salt))."'
        WHERE 
			`member_id`='".$row["member_id"]."'");
	 
		};
	   };
 
    mysql_close($link);
};
 

/**
 * <pre>
 * Invision Power Services
 * IP.Board v3.1.4
 * Main public executable wrapper.
 * Set-up and load module to run
 * Last Updated: $Date: 2010-10-05 11:57:32 -0400 (Tue, 05 Oct 2010) $
 * </pre>
 *
 * @author 		$Author: matt $
 * @copyright	(c) 2001 - 2009 Invision Power Services, Inc.
 * @license		http://www.invisionpower.com/community/board/license.html
 * @package		IP.Board
 * @link		http://www.invisionpower.com
 * @version		$Rev: 6944 $
 *
 */	
 
define( 'IPB_THIS_SCRIPT', 'public' );
require_once( './initdata.php' );

require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );

ipsController::run();

exit();

0

#11 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 735
  • Регистрация: 20-Март 09
  • Репутация: 2 273
  • IPB version:3.1.x
 

Отправлено 10 Сентябрь 2014 - 20:38

Не нормально конечно. Хотябы потому, что запросы написаны без учета префикса таблиц, а по хорошему это нужно было делать на уровне ядра с использованием апи. Это код для обновления хешей паролей после какой-то конвертации, на сколько могу судить по хешу, с джумлы. Можете удалить. Проверить остались ли еще пользователи со старыми хешами можно запросом

SELECT * FROM members WHERE members_pass_hash LIKE "%$%"

0

#12 Пользователь не на сайте   Одмин ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 574
  • Регистрация: 21-Апрель 13
  • Репутация: 41
  • IPB version:3.4.x
 

Отправлено 10 Сентябрь 2014 - 20:54

siv1987, я вас не совсем понял, что мне нужно удалить? И что мне делать с index.php? Может перезалить из дистрибутива?

Просмотреть сообщениеsiv1987 сказал(а):

Проверить остались ли еще пользователи со старыми хешами можно запросом
На это пишет:
Table 'salekh_11.members' doesn't exist ,
хотя я уже сменил префикс к таблицам.
0

#13 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 735
  • Регистрация: 20-Март 09
  • Репутация: 2 273
  • IPB version:3.1.x
 

Отправлено 10 Сентябрь 2014 - 20:59

Просмотреть сообщениеАсид сказал(а):

И что мне делать с index.php? Может перезалить из дистрибутива?

А что мешает сравнить с оригинальным файлом, ну или перезалить?

Просмотреть сообщениеАсид сказал(а):

хотя я уже сменил префикс к таблицам.

Поставьте свой префикс перед members если сменили, в запросе же должно быть видно что его нету. Не трудно сообразить, что раз он у вас есть, значит нужно заменить members на %префикс%members
0

#14 Пользователь не на сайте   Одмин ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 574
  • Регистрация: 21-Апрель 13
  • Репутация: 41
  • IPB version:3.4.x
 

Отправлено 10 Сентябрь 2014 - 21:19

siv1987, всё равно выдаёт ту же ошибку.
Может быть у вас есть инсталлированный index.php на 3.2.3, а то у меня только дефолтный?
0

#15 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 735
  • Регистрация: 20-Март 09
  • Репутация: 2 273
  • IPB version:3.1.x
 

Отправлено 10 Сентябрь 2014 - 21:24

Зачем вам инсталлированный? index.php везде одинаковый.
0

Сообщить об этой теме:


  • 2 Страниц +
  • 1
  • 2


Быстрый ответ

  

1 пользователей читают эту тему
0 зарегистрированных, 1 гостей, 0 скрытых


Контактная информация

Вопросы по работе сайта

+7 (917) 501-4765
C 10 до 20 в рабочие дни (время московское)

Техническая поддержка

Контактные данные специалистов

Дизайн форумов

IPB 3.x ¦ IPB 2.x

Бесплатные шаблоны

IPB 3.2 – 3.4 ¦ IPB 3.1 ¦ IPB 3.0 ¦ IPB 2.2 – 2.3 ¦ IPB 2.1 ¦ Клипарт
Лицензия на использование ¦ Ваша поддержка ¦ О проекте
Copyright © 2005-2016 IPBSkins.ru Team
При копировании материалов с сайта
прямая ссылка на источник обязательна