AtakanAtici
Bunu tavsiye etmiyorum 🙂
ama yine de... şöyle yapabilirsiniz:
Mevcut veritabanı kullanıcısının CREATE DATABASE yetkisi varsa şu şekilde çalışır:
DB::statement("CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
Elbette burada veritabanı adını bir değişkenden almak isteyeceksiniz. CREATE, DROP gibi bazı sql komutlarında binding yapılamadığı için şu çalışmaz:
DB::statement("CREATE DATABASE ? CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci", [
'mydb'
]);
Binding kullanmazsanız da SQL injection'a sebep olabilir çünkü değişken olarak tek kullanım yolu şu:
$name = 'mydb';
DB::statement("CREATE DATABASE {$mydb} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
Bu durumda aklıma gelen en kestirme çözüm veritabanı adını maksimum 5 karakter ile sınırlandırmak, istenmeyen karakterlere izin vermemek vs... bu kısmı araştırmak lazım. Tabi daha sonra bu veritabanı adını Laravel'in kullanmasını sağlama işi var. Bu veritabanı adını bir yerde tutmanız lazım. Bunun en kolay yolu sanırım .env dosyasını sunucuya göndermek ve veritabanı oluşturulduğu sırada kalıcı olarak editlemek:
$dbName = 'mydb';
DB::statement("CREATE DATABASE {$dbName} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
$env = file_get_contents(base_path('.env'));
file_put_contents(
base_path('.env'),
preg_replace('/(DB_DATABASE=)(.*)/', sprintf('${1}%s', $dbName), $env)
);
Dediğim gibi bence yanlış, tavsiye etmiyorum...