Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
Одмин

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

Recommended Posts

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

Share this post


Link to post
Share on other sites

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

Префикс таблиц указывается в 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.

 

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

  • Upvote 5

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

@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

 

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

Share this post


Link to post
Share on other sites

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

Could not successfully run query

если есть доступ по ssh:

find . -name '*.php' | xargs grep "Could not successfully run query"

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Ищите в файлах где этот проблемный запрос по строке ошибки.

Share this post


Link to post
Share on other sites

@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 правки в каждом)?

Share this post


Link to post
Share on other sites

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

Раз выводится значит где-то есть.

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

 

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

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

Share this post


Link to post
Share on other sites

@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();

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

 

Проверить остались ли еще пользователи со старыми хешами можно запросом

На это пишет:

Table 'salekh_11.members' doesn't exist ,

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

Share this post


Link to post
Share on other sites

@siv1987, всё равно выдаёт ту же ошибку.

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...