Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как проще поменять названия таблиц


Автор: len4ixa 26.11.2009, 20:00
В скрипте вызываются таблицы с бд, нужно поставить префикс перед ними. Но проблема: в бд это изменение 20 таблиц, а потом в скрипте изменения офигенного множетсва обращений. Как лучше и проще поменять названия бд?  

Автор: Pitlord 26.11.2009, 21:08
Изначально скрипт должен проектироваться так, чтобы префикс или имена таблиц лежали в одном конфигурационном файле. Если это не так, то да, придётся как-то переписать SQL-запросы в скрипте — вручную или вспомогательным скриптом.

Автор: len4ixa 27.11.2009, 08:25
Цитата

вспомогательным скриптом

 smile  smile 

Автор: Pitlord 27.11.2009, 18:32
Это сильно зависит от конкретного кода.

Автор: len4ixa 27.11.2009, 20:30
Игра gladiators, все в tpl файле, подключаются функции. Что еще сказать?

Автор: nerezus 27.11.2009, 20:35
Цитата

Что еще сказать?
 Видимо, сумму ;)
Для вас это решение оптимально.

Автор: Ипатьев 27.11.2009, 20:47
странно. это это за запросы такие, которые лежат в tpl файле

Автор: Pitlord 27.11.2009, 20:49
Цитата(len4ixa @  27.11.2009,  20:30 Найти цитируемый пост)
Игра gladiators, все в tpl файле

SQL-запросы?

Автор: len4ixa 28.11.2009, 19:40
Цитата

SQL-запросы? 

Ну а какие еще, если я о таблицах говорю. Сори, в php запросы лежат, нету smarty и tpl, спать хотелось, когда писала)
Цитата

Видимо, сумму ;)

Суть в том, что у меня в целях не что-то создать, а чему-то научиться. Причем не ищу обучающих софистов.

Автор: nerezus 28.11.2009, 19:42
Цитата

Суть в том, что у меня в целях не что-то создать, а чему-то научиться.
 Тогда вопрос в топе не верный. Ага, мне лучше знать, просто прими это как факт.

Если хочешь научиться - то отпиши. Можешь в этой же теме. Я дам необходимый материал.

Автор: len4ixa 28.11.2009, 19:45
Отписываюсь)) В топе все правильно, pit писал про проги, которые переделывают код, я попросила насчет этого подробнее...

Автор: nerezus 28.11.2009, 19:51
1) Рефакторинг автоматическими средствами не пойдет - все слишком сложно.
2) Если SQL-запросы в шаблонах, то код - полное ###.
3) Начни с книги Гутманса. На books.ru сейчас она стоит 150р. Ее хватит надолго.

Автор: Pitlord 28.11.2009, 21:55
Цитата(nerezus @  28.11.2009,  19:51 Найти цитируемый пост)
1) Рефакторинг автоматическими средствами не пойдет - все слишком сложно.

Тут всего лишь замена, поэтому как раз несложно.

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

Код

<?php

function rec_preg_replace($pattern, $rep, $dir, $exception = array())
{
    if( @preg_match($pattern, '') === false )
        return;

    $dir = chop($dir, '/\\');

    $dh = opendir($dir);

    while( ( $file = readdir($dh) ) !== false )
    {
        if( $file == '.' || $file == '..' || in_array($file, $exception) )
            continue;

        if( is_file($dir . '/' . $file) )
        {
            $contents = file_get_contents($dir . '/' . $file);
            $contents = preg_replace($pattern, $rep, $contents);
            file_put_contents($dir . '/' . $file, $contents);
        }
        else
        {
            rec_preg_replace($pattern, $rep, $dir . '/' . $file, $exception);
        }
    }

    closedir($dh);
}

rec_preg_replace('/(?<=\\s|`)(таблица1|таблица2|таблица3)(?=\\s|`|.)/', '{$tbl_prefix}_\\0', './dir');
?>


Произойдёт замена "таблица1" на "{$tbl_prefix}_таблица1" во всех файлах директории dir. Конкретный пример расчитан на то, что SQL-запрос взят в двойные кавычки.

Потом остаётся написать в конфигурационном файле
Код

<?php

$tbl_prefix = 'my_prefix';

?>


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

Автор: nerezus 28.11.2009, 22:09
Цитата

Необходимо составить регулярное выражение, выцепляющее имена таблиц в SQL-запросах. 
 Что же за ругулярак будет, которая предуспмотрит все варианты, в.т. числе и запросы, котрые строятся через работу со строками в несколько строк ;)
Полноценная реализация невозможна.

Автор: len4ixa 28.11.2009, 22:20
Цитата

3) Начни с книги Гутманса. На books.ru сейчас она стоит 150р. Ее хватит надолго.

Цитата

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

Автор: Pitlord 28.11.2009, 22:29
Цитата(nerezus @  28.11.2009,  22:09 Найти цитируемый пост)
Что же за ругулярак будет, которая предуспмотрит все варианты, в.т. числе и запросы, котрые строятся через работу со строками в несколько строк ;)
Полноценная реализация невозможна. 

А она и не требуется, тут какой-то частный случай.

Автор: Simpliest 29.11.2009, 11:24
Цитата(len4ixa @  28.11.2009,  21:20 Найти цитируемый пост)
 а про посвящение в одну из методик решения поставленной задачи. 

Посвящаем. 

1. Обычно префиксы(если они вообще есть) у таблиц по всему приложению не меняют.

2. Если вы пишете скрипт под какие-то выкаблучные shared-хостинги, то предусмотрите это на этапе написания
Код

$query = 'SELECT * FROM ' . DB_TABLE_PREFIX . 'users WHERE id = ?';


Оба метода полностью избавляют вас от поставленной задачи - она у вас просто не возникнет smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)