PMA\libraries\Table::rename PHP Method

rename() public method

renames table
public rename ( string $new_name, string $new_db = null ) : boolean
$new_name string new table name
$new_db string new database name
return boolean success
    public function rename($new_name, $new_db = null)
    {
        $lowerCaseTableNames = Util::cacheGet('lower_case_table_names', function () {
            return $GLOBALS['dbi']->fetchValue("SELECT @@lower_case_table_names");
        });
        if ($lowerCaseTableNames) {
            $new_name = strtolower($new_name);
        }
        if (null !== $new_db && $new_db !== $this->getDbName()) {
            // Ensure the target is valid
            if (!$GLOBALS['dblist']->databases->exists($new_db)) {
                $this->errors[] = __('Invalid database:') . ' ' . $new_db;
                return false;
            }
        } else {
            $new_db = $this->getDbName();
        }
        $new_table = new Table($new_name, $new_db);
        if ($this->getFullName() === $new_table->getFullName()) {
            return true;
        }
        // Allow whitespaces (not trailing) in $new_name,
        // since we are using $backquoted in getting the fullName of table
        // below to be used in the query
        if (!Table::isValidName($new_name, true)) {
            $this->errors[] = __('Invalid table name:') . ' ' . $new_table->getFullName();
            return false;
        }
        // If the table is moved to a different database drop its triggers first
        $triggers = $this->_dbi->getTriggers($this->getDbName(), $this->getName(), '');
        $handle_triggers = $this->getDbName() != $new_db && $triggers;
        if ($handle_triggers) {
            foreach ($triggers as $trigger) {
                $sql = 'DROP TRIGGER IF EXISTS ' . Util::backquote($this->getDbName()) . '.' . Util::backquote($trigger['name']) . ';';
                $this->_dbi->query($sql);
            }
        }
        /*
         * tested also for a view, in MySQL 5.0.92, 5.1.55 and 5.5.13
         */
        $GLOBALS['sql_query'] = '
            RENAME TABLE ' . $this->getFullName(true) . '
                  TO ' . $new_table->getFullName(true) . ';';
        // I don't think a specific error message for views is necessary
        if (!$this->_dbi->query($GLOBALS['sql_query'])) {
            // Restore triggers in the old database
            if ($handle_triggers) {
                $this->_dbi->selectDb($this->getDbName());
                foreach ($triggers as $trigger) {
                    $this->_dbi->query($trigger['create']);
                }
            }
            $this->errors[] = sprintf(__('Failed to rename table %1$s to %2$s!'), $this->getFullName(), $new_table->getFullName());
            return false;
        }
        $old_name = $this->getName();
        $old_db = $this->getDbName();
        $this->_name = $new_name;
        $this->_db_name = $new_db;
        // Renable table in configuration storage
        PMA_REL_renameTable($old_db, $new_db, $old_name, $new_name);
        $this->messages[] = sprintf(__('Table %1$s has been renamed to %2$s.'), htmlspecialchars($old_name), htmlspecialchars($new_name));
        return true;
    }

Usage Example

Example #1
0
 /**
  * Test for rename
  *
  * @return void
  */
 public function testRename()
 {
     $table = 'PMA_BookMark';
     $db = 'PMA';
     Util::cacheSet('lower_case_table_names', false);
     $table = new Table($table, $db);
     //rename to same name
     $table_new = 'PMA_BookMark';
     $result = $table->rename($table_new);
     $this->assertEquals(true, $result);
     //isValidName
     //space in table name
     $table_new = 'PMA_BookMark ';
     $result = $table->rename($table_new);
     $this->assertEquals(false, $result);
     //empty name
     $table_new = '';
     $result = $table->rename($table_new);
     $this->assertEquals(false, $result);
     //dot in table name
     $table_new = 'PMA_.BookMark';
     $result = $table->rename($table_new);
     $this->assertEquals(false, $result);
     $table_new = 'PMA_BookMark_new';
     $db_new = 'PMA_new';
     $result = $table->rename($table_new, $db_new);
     $this->assertEquals(true, $result);
     //message
     $this->assertEquals("Table PMA_BookMark has been renamed to PMA_BookMark_new.", $table->getLastMessage());
 }
All Usage Examples Of PMA\libraries\Table::rename