-
Notifications
You must be signed in to change notification settings - Fork 11
prefix
Префикс имён таблиц используется при разработке систем и модулей, которые могут устанавливаться на уже рабочую базу данных. В этой базе могут уже быть заняты имена таблиц, которые нужны данному модулю.
Использование префикса обычно выглядит так:
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
(?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