DeleteController.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. declare(strict_types=1);
  3. namespace PhpMyAdmin\Controllers\Table;
  4. use PhpMyAdmin\DatabaseInterface;
  5. use PhpMyAdmin\DbTableExists;
  6. use PhpMyAdmin\Operations;
  7. use PhpMyAdmin\Relation;
  8. use PhpMyAdmin\RelationCleanup;
  9. use PhpMyAdmin\Response;
  10. use PhpMyAdmin\Sql;
  11. use PhpMyAdmin\Template;
  12. use PhpMyAdmin\Transformations;
  13. use PhpMyAdmin\Url;
  14. use PhpMyAdmin\Util;
  15. use function is_array;
  16. use function sprintf;
  17. class DeleteController extends AbstractController
  18. {
  19. /** @var DatabaseInterface */
  20. private $dbi;
  21. /**
  22. * @param Response $response
  23. * @param string $db Database name.
  24. * @param string $table Table name.
  25. * @param DatabaseInterface $dbi
  26. */
  27. public function __construct($response, Template $template, $db, $table, $dbi)
  28. {
  29. parent::__construct($response, $template, $db, $table);
  30. $this->dbi = $dbi;
  31. }
  32. public function rows(): void
  33. {
  34. global $db, $goto, $sql_query, $table, $disp_message, $disp_query, $PMA_Theme, $active_page;
  35. $mult_btn = $_POST['mult_btn'] ?? '';
  36. $original_sql_query = $_POST['original_sql_query'] ?? '';
  37. $selected = $_POST['selected'] ?? [];
  38. $relation = new Relation($this->dbi);
  39. $sql = new Sql(
  40. $this->dbi,
  41. $relation,
  42. new RelationCleanup($this->dbi, $relation),
  43. new Operations($this->dbi, $relation),
  44. new Transformations(),
  45. $this->template
  46. );
  47. if ($mult_btn === __('Yes')) {
  48. $default_fk_check_value = Util::handleDisableFKCheckInit();
  49. $sql_query = '';
  50. foreach ($selected as $row) {
  51. $query = sprintf(
  52. 'DELETE FROM %s WHERE %s LIMIT 1;',
  53. Util::backquote($table),
  54. $row
  55. );
  56. $sql_query .= $query . "\n";
  57. $this->dbi->selectDb($db);
  58. $this->dbi->query($query);
  59. }
  60. if (! empty($_REQUEST['pos'])) {
  61. $_REQUEST['pos'] = $sql->calculatePosForLastPage(
  62. $db,
  63. $table,
  64. $_REQUEST['pos']
  65. );
  66. }
  67. Util::handleDisableFKCheckCleanup($default_fk_check_value);
  68. $disp_message = __('Your SQL query has been executed successfully.');
  69. $disp_query = $sql_query;
  70. }
  71. $_url_params = $GLOBALS['url_params'];
  72. $_url_params['goto'] = Url::getFromRoute('/table/sql');
  73. if (isset($original_sql_query)) {
  74. $sql_query = $original_sql_query;
  75. }
  76. $active_page = Url::getFromRoute('/sql');
  77. $this->response->addHTML($sql->executeQueryAndSendQueryResponse(
  78. null,
  79. false,
  80. $db,
  81. $table,
  82. null,
  83. null,
  84. null,
  85. null,
  86. null,
  87. $goto,
  88. $PMA_Theme->getImgPath(),
  89. null,
  90. null,
  91. $sql_query,
  92. null
  93. ));
  94. }
  95. public function confirm(): void
  96. {
  97. global $db, $table, $sql_query, $url_params, $err_url, $cfg;
  98. $selected = $_POST['rows_to_delete'] ?? null;
  99. if (! isset($selected) || ! is_array($selected)) {
  100. $this->response->setRequestStatus(false);
  101. $this->response->addJSON('message', __('No row selected.'));
  102. return;
  103. }
  104. Util::checkParameters(['db', 'table']);
  105. $url_params = ['db' => $db, 'table' => $table];
  106. $err_url = Util::getScriptNameForOption($cfg['DefaultTabTable'], 'table');
  107. $err_url .= Url::getCommon($url_params, '&');
  108. DbTableExists::check();
  109. $this->render('table/delete/confirm', [
  110. 'db' => $db,
  111. 'table' => $table,
  112. 'selected' => $selected,
  113. 'sql_query' => $sql_query,
  114. 'is_foreign_key_check' => Util::isForeignKeyCheck(),
  115. ]);
  116. }
  117. }