1<?php 2/* vim: set expandtab sw=4 ts=4 sts=4: */ 3/** 4 * Helper for multi submit forms 5 * 6 * @package PhpMyAdmin 7 */ 8 9use PhpMyAdmin\CentralColumns; 10use PhpMyAdmin\Message; 11use PhpMyAdmin\MultSubmits; 12use PhpMyAdmin\Response; 13use PhpMyAdmin\Sql; 14use PhpMyAdmin\Template; 15use PhpMyAdmin\Util; 16 17if (! defined('PHPMYADMIN')) { 18 exit; 19} 20 21$request_params = array( 22 'clause_is_unique', 23 'from_prefix', 24 'goto', 25 'mult_btn', 26 'original_sql_query', 27 'query_type', 28 'reload', 29 'selected', 30 'selected_fld', 31 'selected_recent_table', 32 'sql_query', 33 'submit_mult', 34 'table_type', 35 'to_prefix', 36 'url_query' 37); 38 39foreach ($request_params as $one_request_param) { 40 if (isset($_POST[$one_request_param])) { 41 $GLOBALS[$one_request_param] = $_POST[$one_request_param]; 42 } 43} 44$response = Response::getInstance(); 45 46global $db, $table, $clause_is_unique, $from_prefix, $goto, 47 $mult_btn, $original_sql_query, $query_type, $reload, 48 $selected, $selected_fld, $selected_recent_table, $sql_query, 49 $submit_mult, $table_type, $to_prefix, $url_query, $pmaThemeImage; 50 51$multSubmits = new MultSubmits(); 52 53/** 54 * Prepares the work and runs some other scripts if required 55 */ 56if (! empty($submit_mult) 57 && $submit_mult != __('With selected:') 58 && (! empty($_POST['selected_dbs']) 59 || ! empty($_POST['selected_tbl']) 60 || ! empty($selected_fld) 61 || ! empty($_POST['rows_to_delete'])) 62) { 63 define('PMA_SUBMIT_MULT', 1); 64 if (! empty($_POST['selected_dbs'])) { 65 // coming from server database view - do something with 66 // selected databases 67 $selected = $_POST['selected_dbs']; 68 $query_type = 'drop_db'; 69 } elseif (! empty($_POST['selected_tbl'])) { 70 // coming from database structure view - do something with 71 // selected tables 72 $selected = $_POST['selected_tbl']; 73 $centralColumns = new CentralColumns($GLOBALS['dbi']); 74 switch ($submit_mult) { 75 case 'add_prefix_tbl': 76 case 'replace_prefix_tbl': 77 case 'copy_tbl_change_prefix': 78 case 'drop_db': 79 case 'drop_tbl': 80 case 'empty_tbl': 81 $what = $submit_mult; 82 break; 83 case 'check_tbl': 84 case 'optimize_tbl': 85 case 'repair_tbl': 86 case 'analyze_tbl': 87 case 'checksum_tbl': 88 $query_type = $submit_mult; 89 unset($submit_mult); 90 $mult_btn = __('Yes'); 91 break; 92 case 'export': 93 unset($submit_mult); 94 include 'db_export.php'; 95 exit; 96 case 'copy_tbl': 97 $views = $GLOBALS['dbi']->getVirtualTables($db); 98 list($full_query, $reload, $full_query_views) 99 = $multSubmits->getQueryFromSelected( 100 $submit_mult, $table, $selected, $views 101 ); 102 $_url_params = $multSubmits->getUrlParams( 103 $submit_mult, $reload, $action, $db, $table, $selected, $views, 104 isset($original_sql_query)? $original_sql_query : null, 105 isset($original_url_query)? $original_url_query : null 106 ); 107 $response->disable(); 108 $response->addHTML( 109 $multSubmits->getHtmlForCopyMultipleTables($action, $_url_params) 110 ); 111 exit; 112 case 'show_create': 113 $show_create = Template::get( 114 'database/structure/show_create' 115 ) 116 ->render( 117 array( 118 'db' => $GLOBALS['db'], 119 'db_objects' => $selected, 120 'dbi' => $GLOBALS['dbi'], 121 ) 122 ); 123 // Send response to client. 124 $response->addJSON('message', $show_create); 125 exit; 126 case 'sync_unique_columns_central_list': 127 $centralColsError = $centralColumns->syncUniqueColumns( 128 $selected 129 ); 130 break; 131 case 'delete_unique_columns_central_list': 132 $centralColsError = $centralColumns->deleteColumnsFromList( 133 $selected 134 ); 135 break; 136 case 'make_consistent_with_central_list': 137 $centralColsError = $centralColumns->makeConsistentWithList( 138 $GLOBALS['db'], 139 $selected 140 ); 141 break; 142 } // end switch 143 } elseif (isset($selected_fld) && !empty($selected_fld)) { 144 // coming from table structure view - do something with 145 // selected columns 146 // handled in StructrueController 147 } else { 148 // coming from browsing - do something with selected rows 149 $what = 'row_delete'; 150 $selected = $_REQUEST['rows_to_delete']; 151 } 152} // end if 153 154if (empty($db)) { 155 $db = ''; 156} 157if (empty($table)) { 158 $table = ''; 159} 160$views = $GLOBALS['dbi']->getVirtualTables($db); 161 162/** 163 * Displays the confirmation form if required 164 */ 165if (!empty($submit_mult) && !empty($what)) { 166 unset($message); 167 168 if (strlen($table) > 0) { 169 include './libraries/tbl_common.inc.php'; 170 $url_query .= '&goto=tbl_sql.php&back=tbl_sql.php'; 171 } elseif (strlen($db) > 0) { 172 include './libraries/db_common.inc.php'; 173 174 list( 175 $tables, 176 $num_tables, 177 $total_num_tables, 178 $sub_part, 179 $is_show_stats, 180 $db_is_system_schema, 181 $tooltip_truename, 182 $tooltip_aliasname, 183 $pos 184 ) = Util::getDbInfo($db, isset($sub_part) ? $sub_part : ''); 185 186 } else { 187 include_once './libraries/server_common.inc.php'; 188 } 189 190 // Builds the query 191 list($full_query, $reload, $full_query_views) 192 = $multSubmits->getQueryFromSelected( 193 $what, $table, $selected, $views 194 ); 195 196 // Displays the confirmation form 197 $_url_params = $multSubmits->getUrlParams( 198 $what, $reload, $action, $db, $table, $selected, $views, 199 isset($original_sql_query)? $original_sql_query : null, 200 isset($original_url_query)? $original_url_query : null 201 ); 202 203 204 if ($what == 'replace_prefix_tbl' || $what == 'copy_tbl_change_prefix') { 205 $response->disable(); 206 $response->addHTML( 207 $multSubmits->getHtmlForReplacePrefixTable($action, $_url_params) 208 ); 209 } elseif ($what == 'add_prefix_tbl') { 210 $response->disable(); 211 $response->addHTML($multSubmits->getHtmlForAddPrefixTable($action, $_url_params)); 212 } else { 213 $response->addHTML( 214 $multSubmits->getHtmlForOtherActions($what, $action, $_url_params, $full_query) 215 ); 216 } 217 exit; 218 219} elseif (! empty($mult_btn) && $mult_btn == __('Yes')) { 220 /** 221 * Executes the query - dropping rows, columns/fields, tables or dbs 222 */ 223 if ($query_type == 'primary_fld') { 224 // Gets table primary key 225 $GLOBALS['dbi']->selectDb($db); 226 $result = $GLOBALS['dbi']->query( 227 'SHOW KEYS FROM ' . Util::backquote($table) . ';' 228 ); 229 $primary = ''; 230 while ($row = $GLOBALS['dbi']->fetchAssoc($result)) { 231 // Backups the list of primary keys 232 if ($row['Key_name'] == 'PRIMARY') { 233 $primary .= $row['Column_name'] . ', '; 234 } 235 } // end while 236 $GLOBALS['dbi']->freeResult($result); 237 } 238 239 if ($query_type == 'drop_tbl' 240 || $query_type == 'empty_tbl' 241 || $query_type == 'row_delete' 242 ) { 243 $default_fk_check_value = Util::handleDisableFKCheckInit(); 244 } 245 246 list( 247 $result, $rebuild_database_list, $reload_ret, 248 $run_parts, $execute_query_later, $sql_query, $sql_query_views 249 ) = $multSubmits->buildOrExecuteQuery( 250 $query_type, $selected, $db, $table, $views, 251 isset($primary) ? $primary : null, 252 isset($from_prefix) ? $from_prefix : null, 253 isset($to_prefix) ? $to_prefix : null 254 ); 255 //update the existed variable 256 if (isset($reload_ret)) { 257 $reload = $reload_ret; 258 } 259 260 if ($query_type == 'drop_tbl') { 261 if (!empty($sql_query)) { 262 $sql_query .= ';'; 263 } elseif (!empty($sql_query_views)) { 264 $sql_query = $sql_query_views . ';'; 265 unset($sql_query_views); 266 } 267 } 268 269 // Unset cache values for tables count, issue #14205 270 if ($query_type === 'drop_tbl' && isset($_SESSION['tmpval'])) { 271 if (isset($_SESSION['tmpval']['table_limit_offset'])) { 272 unset($_SESSION['tmpval']['table_limit_offset']); 273 } 274 275 if (isset($_SESSION['tmpval']['table_limit_offset_db'])) { 276 unset($_SESSION['tmpval']['table_limit_offset_db']); 277 } 278 } 279 280 if ($execute_query_later) { 281 $sql = new Sql(); 282 $sql->executeQueryAndSendQueryResponse( 283 null, // analyzed_sql_results 284 false, // is_gotofile 285 $db, // db 286 $table, // table 287 null, // find_real_end 288 null, // sql_query_for_bookmark 289 null, // extra_data 290 null, // message_to_show 291 null, // message 292 null, // sql_data 293 $goto, // goto 294 $pmaThemeImage, // pmaThemeImage 295 null, // disp_query 296 null, // disp_message 297 $query_type, // query_type 298 $sql_query, // sql_query 299 $selected, // selectedTables 300 null // complete_query 301 ); 302 } elseif (!$run_parts) { 303 $GLOBALS['dbi']->selectDb($db); 304 $result = $GLOBALS['dbi']->tryQuery($sql_query); 305 if ($result && !empty($sql_query_views)) { 306 $sql_query .= ' ' . $sql_query_views . ';'; 307 $result = $GLOBALS['dbi']->tryQuery($sql_query_views); 308 unset($sql_query_views); 309 } 310 311 if (! $result) { 312 $message = Message::error($GLOBALS['dbi']->getError()); 313 } 314 } 315 if ($query_type == 'drop_tbl' 316 || $query_type == 'empty_tbl' 317 || $query_type == 'row_delete' 318 ) { 319 Util::handleDisableFKCheckCleanup($default_fk_check_value); 320 } 321 if ($rebuild_database_list) { 322 // avoid a problem with the database list navigator 323 // when dropping a db from server_databases 324 $GLOBALS['dblist']->databases->build(); 325 } 326} else { 327 if (isset($submit_mult) 328 && ($submit_mult == 'sync_unique_columns_central_list' 329 || $submit_mult == 'delete_unique_columns_central_list' 330 || $submit_mult == 'add_to_central_columns' 331 || $submit_mult == 'remove_from_central_columns' 332 || $submit_mult == 'make_consistent_with_central_list') 333 ) { 334 if (isset($centralColsError) && $centralColsError !== true) { 335 $message = $centralColsError; 336 } else { 337 $message = Message::success(__('Success!')); 338 } 339 } else { 340 $message = Message::success(__('No change')); 341 } 342} 343