У меня есть программа, которая выбирает около 200 таблиц с префиксом. например, PBN_products, PBN_address, PBN_others. Вместо добавления префикса в каждую таблицу для оператора select существует ли способ определить префикс как значение по умолчанию и сделать выбор?
$prefix=GET['prefix']; mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD); mysql_select_db(DB_DATABASE); $sql = 'SELECT price, description, title, cost'. 'FROM products, address, others';
Как определить префикс, который нельзя включить во все таблицы? У меня 200 таблиц.
Я бы посмотрел в класс, чтобы сделать простую абстракцию запроса или какую-то ORM lib, которая делает это. Образец будет таким.
class Query { function from($tbl){ return new Table($tbl); } } class Table { var $prefix = 'PBN_'; var $tblname = ''; function Table($name){ $this->tblname = $this->prefix.$name; } function select($cols, $where = false, $order = false, $limit = false){ $query = "SELECT {$cols} FROM {$this->tblname}"; if($where) $query .= " WHERE ".$where; //add where if($order) $query .= " ORDER BY ".$order; //add order if($limit) $query .= " LIMIT ".$limit; //add limit return $query; } } $q = new Query; $results = mysql_query($q->from('products')->select('*'));
Это, очевидно, нигде не является полным или безопасным. Просто пример того, как класс абстракции может ускорить работу вашего сайта, а также ваши префиксы для вас.
Вы можете определить массив с именами таблиц и пропустить этот массив. Когда вы добавляете элемент массива в строку, поставьте «PBN_» с жестким кодом перед этим именем.
$arr = array("products","address","others"); $sql = "SELECT price, description, title, cost FROM "; foreach ($arr as $tablename) { $sql = $sql . "PBN_" . $tablename . ", "; } $sql = substr($sql, 0, -2); // Remove last comma
Затем вы можете добавить все имена таблиц в массив, и префикс будет автоматически добавлен.
Как насчет чего-то подобного?
$prefix = GET['prefix']; // add prefix to table names foreach (array("products", "address", "others") as &$table) { $table = $prefix.$table; } mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD); mysql_select_db(DB_DATABASE); $sql = 'SELECT price, description, title, cost'. 'FROM '.$table[0].', '.$table[1].', '.$table[2];
Вы могли бы сделать что-то подобное?
$prefix = ''; if(isset($_GET['prefix'])){ $prefix = mysql_real_escape_string(stripslashes($_GET['prefix'])); } $sql = "SELECT price, description, title, cost FROM {$prefix}products, {$prefix}address, {$prefix}others";
EDIT: Я согласен с комментариями, что это плохая практика … Альтернативой будет сохранение префиксов в другой таблице и передача идентификатора этой таблицы в GET. Это сделает вас менее доступными для SQL-инъекций.
$prefix = ""; if(isset($_GET['prefixid'])){ $prefixid = mysql_real_escape_string(stripslashes($_GET['prefixid'])); $query = "SELECT prefix FROM prefixes WHERE prefixid = $prefixid"; $result = mysql_query($query); $prefix = mysql_result($result, 0, 0); } $sql = "SELECT price, description, title, cost FROM {$prefix}products, {$prefix}address, {$prefix}others";