DestroyController.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. declare(strict_types=1);
  3. namespace PhpMyAdmin\Controllers\Server\Databases;
  4. use PhpMyAdmin\ConfigStorage\RelationCleanup;
  5. use PhpMyAdmin\Controllers\AbstractController;
  6. use PhpMyAdmin\DatabaseInterface;
  7. use PhpMyAdmin\Message;
  8. use PhpMyAdmin\Query\Utilities;
  9. use PhpMyAdmin\ResponseRenderer;
  10. use PhpMyAdmin\Template;
  11. use PhpMyAdmin\Transformations;
  12. use PhpMyAdmin\Url;
  13. use PhpMyAdmin\Util;
  14. use function __;
  15. use function _ngettext;
  16. use function array_filter;
  17. use function count;
  18. use function is_array;
  19. use function is_string;
  20. final class DestroyController extends AbstractController
  21. {
  22. /** @var DatabaseInterface */
  23. private $dbi;
  24. /** @var Transformations */
  25. private $transformations;
  26. /** @var RelationCleanup */
  27. private $relationCleanup;
  28. public function __construct(
  29. ResponseRenderer $response,
  30. Template $template,
  31. DatabaseInterface $dbi,
  32. Transformations $transformations,
  33. RelationCleanup $relationCleanup
  34. ) {
  35. parent::__construct($response, $template);
  36. $this->dbi = $dbi;
  37. $this->transformations = $transformations;
  38. $this->relationCleanup = $relationCleanup;
  39. }
  40. public function __invoke(): void
  41. {
  42. global $selected, $errorUrl, $cfg, $dblist, $reload;
  43. if (
  44. ! $this->response->isAjax()
  45. || (! $this->dbi->isSuperUser() && ! $cfg['AllowUserDropDatabase'])
  46. ) {
  47. $message = Message::error();
  48. $json = ['message' => $message];
  49. $this->response->setRequestStatus($message->isSuccess());
  50. $this->response->addJSON($json);
  51. return;
  52. }
  53. $selected_dbs = isset($_POST['selected_dbs']) && is_array($_POST['selected_dbs']) ? $_POST['selected_dbs'] : [];
  54. $selected_dbs = array_filter($selected_dbs, static function ($database): bool {
  55. return is_string($database)
  56. && ! Utilities::isSystemSchema($database, true)
  57. && $database !== ($GLOBALS['cfg']['Server']['pmadb'] ?? '');
  58. });
  59. if ($selected_dbs === []) {
  60. $message = Message::error(__('No databases selected.'));
  61. $json = ['message' => $message];
  62. $this->response->setRequestStatus($message->isSuccess());
  63. $this->response->addJSON($json);
  64. return;
  65. }
  66. $errorUrl = Url::getFromRoute('/server/databases');
  67. $selected = $selected_dbs;
  68. $numberOfDatabases = count($selected_dbs);
  69. foreach ($selected_dbs as $database) {
  70. $this->relationCleanup->database($database);
  71. $aQuery = 'DROP DATABASE ' . Util::backquote($database);
  72. $reload = true;
  73. $this->dbi->query($aQuery);
  74. $this->transformations->clear($database);
  75. }
  76. $dblist->databases->build();
  77. $message = Message::success(
  78. _ngettext(
  79. '%1$d database has been dropped successfully.',
  80. '%1$d databases have been dropped successfully.',
  81. $numberOfDatabases
  82. )
  83. );
  84. $message->addParam($numberOfDatabases);
  85. $json = ['message' => $message];
  86. $this->response->setRequestStatus($message->isSuccess());
  87. $this->response->addJSON($json);
  88. }
  89. }