Опубликовано: 18 августа 201411 г Ну вопрос, собственно, в заголовке - каким запросом можно поменять префиксы сразу на всех таблицах? Ещё, если не ошибаюсь, в каких-то файлах ips_kernel нужно указывать изменённый префикс к таблицам. Ткните куда залезть и что выполнить! Благодарю!
Опубликовано: 18 августа 201411 г Одним запросом все префиксы не поменять. Переименовать можно только по одной таблице. Для всех сразу нужно написать небольшой скрипт.Префикс таблиц указывается в 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. Учтите, что если таблицы не имеют префикса будут переименованы все таблицы в этой базе.
Опубликовано: 18 августа 201411 г Автор @siv1987, как всегда дали дельный совет! Спасибо! Всё работает, префиксы благополучно сменились.
Опубликовано: 22 августа 201411 г Автор @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 Не в курсе, что за проблема?
Опубликовано: 22 августа 201411 г Возможно используете скрипты с прямыми запросами к бд. Ищите на сервере файлы которые содержат строку:Could not successfully run queryесли есть доступ по ssh:find . -name '*.php' | xargs grep "Could not successfully run query"Эта не стандартная ошибка форума. Если ошибка выскакивает при авторизации, возможно какие-то модули авторизации.
Опубликовано: 22 августа 201411 г Автор @siv1987, переименовал префикс к таблицам БД обратно на дефолтный "ibf_". Ошибка изменилась. Теперь пользователь видет ошибку неверности логина и/или пароля. Вручную изменил пользователю пароль и его пустило на форум. Интересно, в чем может заключаться ошибка? Возможно, при переименовании префикса к таблицам, произошли какие-то правки в таблице с паролями. Самое интересное, что ошибка произошла выборочно, не у всех пользователей.
Опубликовано: 22 августа 201411 г Никакие там правки не происходят. А все беды от того, что используются захардкоденные запросы типа SELECT * FROM ibf_members в обход конструктора запросов, или без переменной префикса sql_tbl_prefix.Ищите в файлах где этот проблемный запрос по строке ошибки.
Опубликовано: 10 сентября 201411 г Автор @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 правки в каждом)?
Опубликовано: 10 сентября 201411 г обшарил весь сервер, не нашел я файла с такой строкойРаз выводится значит где-то есть. Нет такого запроса в дефолтном ИПБ - SELECT * FROM `ibf_members` where name='matanya' limit 1. Не использует форум поиск по полю name, и выражения where и limit написаны маленькими буквами - что при использования конструктора такого быть не должно. Мне в обоих файлах надо заменить префиксы, т.е. сделать 4 правки в 2-х файлах (по 2 правки в каждом)?Здесь менять ничего не нужно. Во первых этот код закоментирован, а во вторых он действует наоборот, меняя префикс с ibf_ на текущий.
Опубликовано: 10 сентября 201411 г Автор @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();
Опубликовано: 10 сентября 201411 г Не нормально конечно. Хотябы потому, что запросы написаны без учета префикса таблиц, а по хорошему это нужно было делать на уровне ядра с использованием апи. Это код для обновления хешей паролей после какой-то конвертации, на сколько могу судить по хешу, с джумлы. Можете удалить. Проверить остались ли еще пользователи со старыми хешами можно запросом SELECT * FROM members WHERE members_pass_hash LIKE "%$%"
Опубликовано: 10 сентября 201411 г Автор @siv1987, я вас не совсем понял, что мне нужно удалить? И что мне делать с index.php? Может перезалить из дистрибутива? Проверить остались ли еще пользователи со старыми хешами можно запросомНа это пишет:Table 'salekh_11.members' doesn't exist ,хотя я уже сменил префикс к таблицам.
Опубликовано: 10 сентября 201411 г И что мне делать с index.php? Может перезалить из дистрибутива?А что мешает сравнить с оригинальным файлом, ну или перезалить? хотя я уже сменил префикс к таблицам.Поставьте свой префикс перед members если сменили, в запросе же должно быть видно что его нету. Не трудно сообразить, что раз он у вас есть, значит нужно заменить members на %префикс%members
Опубликовано: 10 сентября 201411 г Автор @siv1987, всё равно выдаёт ту же ошибку.Может быть у вас есть инсталлированный index.php на 3.2.3, а то у меня только дефолтный?
Ну вопрос, собственно, в заголовке - каким запросом можно поменять префиксы сразу на всех таблицах? Ещё, если не ошибаюсь, в каких-то файлах ips_kernel нужно указывать изменённый префикс к таблицам. Ткните куда залезть и что выполнить! Благодарю!