我正在阅读帖子"动态创建新的数据库和表格#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。因此,我不确定如何尽可能安全地创建数据库。在我必须在我们的网站中引入安全漏洞之前,任何人都可以告诉我。
答案 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]);
}
我相信你不需要这里的模式构建器