Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
Одмин

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

Рекомендованные сообщения

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

Поделиться сообщением


Ссылка на сообщение

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

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

@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

 

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

Поделиться сообщением


Ссылка на сообщение

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

Could not successfully run query

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

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

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

Поделиться сообщением


Ссылка на сообщение

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

 

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

Поделиться сообщением


Ссылка на сообщение

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

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

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

 

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

Поделиться сообщением


Ссылка на сообщение

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

 

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

На это пишет:

Table 'salekh_11.members' doesn't exist ,

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

Поделиться сообщением


Ссылка на сообщение

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение

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

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

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...