2

すべてのモデルが拡張する次の Model クラスがあります。

class Model {
    [...]
    protected static $_query; // Query preparated

    public function prepare($query = null) {
        [...] // Connect to PDO, bla bla bla

        self::$_query = self::$link->prepare($query);
    }

    [...]

}

class Login extends Model {
    public function getUser($username = null) {
        self::prepare('SELECT * FROM usuarios WHERE usuario = :username LIMIT 1');
        self::bindValue('username', $username);

        return self::fetch();
    }
}

問題は、テーブルの競合を避けるために mysql にプレフィックスを挿入する必要がありますが、すべてのクエリを編集したくないということです。

clientone_tablename
clienttwo_tablename
clientthree_tablename

これを行うにはどうすればよいですか?クエリを準備するときにテーブルプレフィックスを解析して挿入しますか?

私が知っていることは、カスタム PDO を PHP PDO クラスに拡張することです。

私はこれを見てきました: PDO - テーブルプレフィックスでの作業。しかし、適切に動作しません..

ありがとう!

4

2 に答える 2

1

どこかの変数にあるテーブルプレフィックスを使用するようにクエリを書き直すだけです。テーブル名のすべてのクエリを解析することは、価値があるよりも面倒です。(本当に SQL パーサーを書きたいですか?)

于 2012-04-19T19:06:52.430 に答える
1

したがって、MySQL データベースが 1 つしかなく (Web ホストの最小パッケージ)、クライアントごとにシステムのコピーを保存する必要があると仮定します。

私が提案していたのは、(クライアントごとに) 既にあるように別のテーブル セットを作成することですが、クライアント テーブルでテーブル名を参照しているため、名前は重要ではありません。

私の例を次に示します。クライアント テーブルには、独自のテーブルのテーブル名を格納する必要があります
(例: users_tbl = clientone_users for client id:1)。後で、クライアント テーブルにクエリを実行し、彼/彼女のテーブル名を取得してから使用できます。その結果、ユーザー、ニュース、ページ、およびファイル テーブルに対してクエリが実行されます。

# SQL: new table structure
-- store the names of the clients tables here
CREATE TABLE clients(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    name VARCHAR(50),
    address VARCHAR(250),
    email VARCHAR(50),
    pass BLOB,
    /* table names*/
    users_tbl VARCHAR(70),
    news_tbl VARCHAR(70),
    pages_tbl VARCHAR(70),
    files_tbl VARCHAR(70)
) ENGINE = InnoDB;

# PHP: Some definitions for the table structure
$tbl_names = array("_users","_news","_pages","_files");
$tbl_fields = array();
$tbl_fields[0] = array("id INT","users_col1 VARCHAR(10)","users_col2 VARCHAR(20)");
$tbl_fields[1] = array("id INT","news_col1 DATE",...);
$tbl_fields[2] = array(...);
$tbl_fields[3] = array(...);
// refers to YOUR clients table field names (see above)
$clients_fields = array("users_tbl", "news_tbl", "pages_tbl", "files_tbl");

# PHP: Create a user and create the users database
function createUser($name, $address, $email, $pass, $salt) {
    global $db, $tbl_names, $tbl_fields;
    $success = false;
    if ($db->beginTransaction()) {
        $sql = "INSERT INTO clients(name, address, email, pass)
                     VALUES (?, ?, ?, AES_ENCRYPT(?, ?));"
        $query = $db->prepare($sql);
        $query->execute(array($name, $address, $email, $pass, $salt));
        if ($query->rowCount() == 1) { # if rowCount() doesn't work
            # get the client ID        # there are alternative ways
            $client_id = $db->lastInsertId();
            for ($i=0; $i<sizeof($tbl_names); $i++) {
                $client_tbl_name = $name . $tbl_names[$i];
                $sql = "CREATE TABLE " . $client_tbl_name . "("
                           . implode(',', $tbl_fields[$i]) . ");";
                if (!$db->query($sql)) {
                    $db->rollBack();
                    return false;
                } else {
                    $sql = "UPDATE clients SET ".clients_fields[$i]."=? "
                                       ."WHERE id=?;";
                    $query = $db->prepare($sql);
                    if (!$query->execute(
                            array($client_tbl_name, (int)$client_id)
                                         )) {
                        $db->rollBack();
                        return false;
                    }
                }
            }
            $db->commit();
            $success = true;
        }
        if (!$success) $db->rollBack();
    }
    return $success;
}

# PHP: Get the Client's table names
function getClientsTableNames($client_id) {
    $sql = "SELECT (users_tbl, news_tbl, pages_tbl, files_tbl)
              FROM clients WHERE id=?;";
    $query = $db->prepare($sql);
    if ($query->execute(array((int)$client_id)))
        return $query->fetchAll();
    else
        return null;
}

# PHP: Use the table name to query it
function getClientsTable($client_id, $table_no) {
    $table_names = getClientsTableNames($client_id);
    if ($table_names != null && isset($table_names[$table_no])) {
        $sql = "SELECT * FROM ".$table_names[$table_no].";";
        $query = $db->prepare($sql);
        if ($query->execute(array((int)$client_id)))
            return $query->fetchAll();
    }
    return null;
}
于 2012-04-19T20:38:23.210 に答える