выберите из MySQL базы данных с 300 таблицами, используя префикс по умолчанию - PullRequest
3 голосов
/ 17 марта 2011

У меня есть программа, которая выбирает из примерно 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 столов.

Ответы [ 4 ]

1 голос
/ 17 марта 2011

Я бы заглянул в класс, чтобы сделать некоторую простую абстракцию запроса или какую-нибудь библиотеку ORM, которая делает это. Образец будет таким.

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('*'));

Это явно далеко от завершения или безопасности. Просто пример того, как абстракционный класс может ускорить ваш sql и дать вам ваши префиксы.

0 голосов
/ 17 марта 2011

Вы можете определить массив с именами таблиц и выполнить цикл по этому массиву.Когда вы добавляете элемент массива в строку, перед этим именем ставите жестко закодированный 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

Затем вы можете добавить все имена таблиц в массив, и префикс будет добавлен автоматически.

0 голосов
/ 17 марта 2011

Как насчет этого?

 $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];
0 голосов
/ 17 марта 2011

Вы могли бы сделать что-то подобное?

$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";

РЕДАКТИРОВАТЬ: Я согласен с комментариями, что это плохая практика ... Альтернативой может быть сохранение префиксов в другой таблице и передача идентификатораэта таблица в 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...