Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

Ну вопрос, собственно, в заголовке - каким запросом можно поменять префиксы сразу на всех таблицах? Ещё, если не ошибаюсь, в каких-то файлах 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.

 

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

Опубликовано:
  • Автор

@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.

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

  • 3 недели спустя...
Опубликовано:
  • Автор

@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 везде одинаковый.

Опубликовано:
  • Автор

Какую ту?

Table 'salekh_11.members' doesn't exist

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

Сейчас на странице 0

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.