Одмин Posted August 18, 2014 Share Posted August 18, 2014 Ну вопрос, собственно, в заголовке - каким запросом можно поменять префиксы сразу на всех таблицах? Ещё, если не ошибаюсь, в каких-то файлах ips_kernel нужно указывать изменённый префикс к таблицам. Ткните куда залезть и что выполнить! Благодарю! Link to comment Share on other sites More sharing options...
siv1987 Posted August 18, 2014 Share Posted August 18, 2014 Одним запросом все префиксы не поменять. Переименовать можно только по одной таблице. Для всех сразу нужно написать небольшой скрипт.Префикс таблиц указывается в 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 Link to comment Share on other sites More sharing options...
Одмин Posted August 18, 2014 Author Share Posted August 18, 2014 @siv1987, как всегда дали дельный совет! Спасибо! Всё работает, префиксы благополучно сменились. Link to comment Share on other sites More sharing options...
Одмин Posted August 22, 2014 Author Share Posted August 22, 2014 @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 More sharing options...
siv1987 Posted August 22, 2014 Share Posted August 22, 2014 Возможно используете скрипты с прямыми запросами к бд. Ищите на сервере файлы которые содержат строку:Could not successfully run queryесли есть доступ по ssh:find . -name '*.php' | xargs grep "Could not successfully run query"Эта не стандартная ошибка форума. Если ошибка выскакивает при авторизации, возможно какие-то модули авторизации. Link to comment Share on other sites More sharing options...
Одмин Posted August 22, 2014 Author Share Posted August 22, 2014 @siv1987, переименовал префикс к таблицам БД обратно на дефолтный "ibf_". Ошибка изменилась. Теперь пользователь видет ошибку неверности логина и/или пароля. Вручную изменил пользователю пароль и его пустило на форум. Интересно, в чем может заключаться ошибка? Возможно, при переименовании префикса к таблицам, произошли какие-то правки в таблице с паролями. Самое интересное, что ошибка произошла выборочно, не у всех пользователей. Link to comment Share on other sites More sharing options...
siv1987 Posted August 22, 2014 Share Posted August 22, 2014 Никакие там правки не происходят. А все беды от того, что используются захардкоденные запросы типа SELECT * FROM ibf_members в обход конструктора запросов, или без переменной префикса sql_tbl_prefix.Ищите в файлах где этот проблемный запрос по строке ошибки. Link to comment Share on other sites More sharing options...
Одмин Posted September 10, 2014 Author Share Posted September 10, 2014 @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 More sharing options...
siv1987 Posted September 10, 2014 Share Posted September 10, 2014 обшарил весь сервер, не нашел я файла с такой строкойРаз выводится значит где-то есть. Нет такого запроса в дефолтном ИПБ - SELECT * FROM `ibf_members` where name='matanya' limit 1. Не использует форум поиск по полю name, и выражения where и limit написаны маленькими буквами - что при использования конструктора такого быть не должно. Мне в обоих файлах надо заменить префиксы, т.е. сделать 4 правки в 2-х файлах (по 2 правки в каждом)?Здесь менять ничего не нужно. Во первых этот код закоментирован, а во вторых он действует наоборот, меняя префикс с ibf_ на текущий. Link to comment Share on other sites More sharing options...
Одмин Posted September 10, 2014 Author Share Posted September 10, 2014 @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 More sharing options...
siv1987 Posted September 10, 2014 Share Posted September 10, 2014 Не нормально конечно. Хотябы потому, что запросы написаны без учета префикса таблиц, а по хорошему это нужно было делать на уровне ядра с использованием апи. Это код для обновления хешей паролей после какой-то конвертации, на сколько могу судить по хешу, с джумлы. Можете удалить. Проверить остались ли еще пользователи со старыми хешами можно запросом SELECT * FROM members WHERE members_pass_hash LIKE "%$%" Link to comment Share on other sites More sharing options...
Одмин Posted September 10, 2014 Author Share Posted September 10, 2014 @siv1987, я вас не совсем понял, что мне нужно удалить? И что мне делать с index.php? Может перезалить из дистрибутива? Проверить остались ли еще пользователи со старыми хешами можно запросомНа это пишет:Table 'salekh_11.members' doesn't exist ,хотя я уже сменил префикс к таблицам. Link to comment Share on other sites More sharing options...
siv1987 Posted September 10, 2014 Share Posted September 10, 2014 И что мне делать с index.php? Может перезалить из дистрибутива?А что мешает сравнить с оригинальным файлом, ну или перезалить? хотя я уже сменил префикс к таблицам.Поставьте свой префикс перед members если сменили, в запросе же должно быть видно что его нету. Не трудно сообразить, что раз он у вас есть, значит нужно заменить members на %префикс%members Link to comment Share on other sites More sharing options...
Одмин Posted September 10, 2014 Author Share Posted September 10, 2014 @siv1987, всё равно выдаёт ту же ошибку.Может быть у вас есть инсталлированный index.php на 3.2.3, а то у меня только дефолтный? Link to comment Share on other sites More sharing options...
siv1987 Posted September 10, 2014 Share Posted September 10, 2014 Зачем вам инсталлированный? index.php везде одинаковый. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now