动态创建新的数据库和表

时间:2015-08-07 12:38:20

标签: php laravel laravel-5

我正在阅读帖子"动态创建新的数据库和表格#34; 我试图实现创建模式函数的更新版本:

public static function createSchema($schemaName)
{
    $dbName = "db_{$schemaName}";

    return DB::getSchemaBuilder()
        ->getConnection()
        ->statement("CREATE DATABASE :schema", ['schema' => $dbName ]);
}

但是我收到以下错误:

  

SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;查看与您的MariaDB服务器版本相对应的手册,以便在'附近使用正确的语法?'在第1行(SQL:CREATE DATABASE:schema)

PDO不允许在创建数据库查询上绑定params。因此,我不确定如何尽可能安全地创建数据库。在我必须在我们的网站中引入安全漏洞之前,任何人都可以告诉我。

2 个答案:

答案 0 :(得分:1)

您不能使用CREATE DATABASE和PDO绑定,因为在CREATE DATABASE foo中,foo不是带引号的标识符,它是原始的新数据库名称。您需要自己进行任何健全性检查,而不是依靠参数绑定来保护您。

public static function createSchema($schemaName)
{
    $dbName = "db_{$schemaName}";

    $quotedDbName = preg_replace("/[^_a-zA-Z0-9]+/", "", $dbName);
    return DB::statement("CREATE DATABASE $quotedDbName");
}

有关CREATE DATABASE与PDO绑定的详细信息,请参阅this question

答案 1 :(得分:-1)

public static function createSchema($schemaName)
{
    // We will use the `statement` method from the connection class so that
    // we have access to parameter binding.
    return DB::getConnection()->statement('CREATE DATABASE :schema', ['schema' => 'db_' . $schemaName]);
}

我相信你不需要这里的模式构建器