Jump to content

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


Одмин
 Share

Recommended Posts

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

Link to comment
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
Link to comment
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

 

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

Link to comment
Share on other sites

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

Could not successfully run query

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

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

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

Link to comment
Share on other sites

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

 

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

  • 3 weeks later...

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

Link to comment
Share on other sites

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

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

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

 

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

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

Link to comment
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();

Link to comment
Share on other sites

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

 

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

Link to comment
Share on other sites

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

 

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

На это пишет:

Table 'salekh_11.members' doesn't exist ,

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

Link to comment
Share on other sites

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

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

 

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

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

Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...