Skip to content
Oleg Grigoriev edited this page Mar 26, 2016 · 6 revisions

Префикс имён таблиц

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

Использование префикса обычно выглядит так:

define('PREFIX_TABLE', 'prefix_');

$sql = 'SELECT * FROM `'.PREFIX_TABLE.'_users` WHERE `user_id`='.$userId;
$result = mysql_query($sql);

goDB предоставляет свои средства для указания префиксов.

Указание префикса

Указать префикс можно при создании объекта подключения с помощью системного параметра конфигурации "_prefix":

$params = [
    'host' => 'localhost',
    'username' => 'test',
    'password' => 'test',
    'dbname' => 'test',
    '_prefix' => 'p_',
];

$db = go\DB\DB::create($params, 'mysql');

Либо уже в процессе работы можно указать или изменить префикс с помощью метода setPrefix(string):

$db->setPrefix($newprefix);

Узнать текущий префикс можно с помощью getPrefix().

Также префикс можно изменить только для единственного запроса с помощью четвёртого аргумента метода query():

$res = $db->query('SELECT * FROM {table}', null, null, 'single_prefix_')->assoc();

Вставка таблицы через {}

Понятно, что go\DB не будет производить синтаксический анализ запроса, выискивать имена таблиц и добавлять к ним префикс. Имена таблиц нужно указать, например, с помощью фигурных скобок:

$db->setPrefix('p_');
$db->query('SELECT * FROM {table}');

То, что находится внутри фигурных скобок считается именами таблиц и для них используется префикс. В итоге будет выполнен запрос:

SELECT * FROM `p_table`

Плейсхолдеры ?t и ?c

При вставке таблиц с помощью плейсхолдера ?t (?table) для них также будет использоваться префикс.

Префикс будет использоваться и для плейсхолдера ?c (?col) при вставке столбца вместе с именем таблицы.

Пример:

$table = 'one';

$pattern = '
    SELECT 
        *
    FROM 
        ?table AS `a`
    LEFT JOIN {two} AS `b` 
        ON ?c=`b`.`y`
    WHERE 
        `a`.`z`=?i
';
$data = [$table, [$table, 'x'], 11];
$result = $db->query($pattern, $data, 'assoc', 'p_');

Будет выполнен запрос:

SELECT 
    *
FROM 
    `p_one` AS `a`
LEFT JOIN `p_two` AS `b` ON 
    `p_one`.`x`=`b`.`y`
WHERE 
    `a`.`z`=11
Clone this wiki locally