2015-11-18 3 views
0

У меня есть .sql файл и вы хотите заменить уже существующую базу данных, нажав кнопку. Все работает нормально. Кроме запроса create. Есть ли запрос или команда для импорта целых баз данных?MySQL заменить базу данных

$filename = 'file.sql'; 
    // MySQL host 
    $mysql_host = 'localhost'; 
    // MySQL username 
    $mysql_username = 'user'; 
    // MySQL password 
    $mysql_password = 'pw'; 
    // Database name 
    $mysql_database = 'dbName'; 

    // Connect to MySQL server 
    mysql_connect($mysql_host, $mysql_username, $mysql_password) or die('Error connecting to MySQL server: ' . mysql_error()); 
    // Select database 
    mysql_select_db($mysql_database) or die('Error selecting MySQL database: ' . mysql_error()); 

    $drop_db = "DROP DATABASE dbName"; 

    mysql_query($drop_db) or die ("error"); 

    $create_db = ""; 
+0

Возможный дубликат [Как я могу импортировать базу данных MySQL из терминала?] (Http://stackoverflow.com/questions/4546778/how-can-i-import-a-database-with-mysql -from-terminal) –

+0

не должно быть в/из терминала – Valcone

+0

https://www.phpmyadmin.net/ –

ответ

1

Вы могли бы попробовать что-то вроде:

$cmds=array_filter(file($filename)); 
foreach($cmds as $cmd){ 
    echo $cmd; 
} 

Если выглядит нормально заменителя эхо для mysql_query($cmd) ... совершенно непроверенные кстати.

$sql=array(); 
    $sourcefile='C:\data\db_20101222_0957.sql'; 

    $cmds = file($sourcefile, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES); 
    foreach($cmds as $cmd){ 

     if (substr($cmd, 0, 2) == '--' || $cmd == '' || substr($cmd,0, 2)=='/*') continue; 

     $sql[]=$cmd; 

     if (substr(trim($cmd), -1, 1) == ';'){ 
      /* Query */ 
      $query=implode(PHP_EOL, $sql); 
      /* Execute query */ 

      echo '<pre>',$query,'</pre>'; 

      $sql=array(); 
     } 
    } 
+0

спасибо, что ответит! Я попробую. – Valcone

+0

Если вам нужно подумать (я должен думать чаще), вероятно, будут проблемы ~, если каждое из операторов в вашем файле sql находится в одной строке, тогда, вероятно, будет хорошо, bbut, если каждое утверждение занимает несколько строк, вы необходимо будет использовать другой код, чтобы убедиться, что вы определяете, где начинается и заканчивается каждое утверждение. – RamRaider

+0

некоторые делаю и некоторые нет. Я думаю, что проще заменить таблицы в базе данных, не так ли? – Valcone

1

У меня есть. Решение состоит в том, чтобы удалить таблицы не всю базу данных.

function resetClient() { 
    $erg = false; 
    try { 
     // get all tablenames 
     $sql = "SHOW TABLES FROM dbName"; 
     $res = $this->conn->query($sql); 

     $this->conn->query("SET FOREIGN_KEY_CHECKS=0"); 

     // drop all tables in db 
     if (is_object($res)) { 
      if (($res->num_rows > 0)) { 
       while ($row = $res->fetch_row()) { 
        $this->conn->query ("DROP TABLE " . $row[0]); 
       } 
      } 
     } 

     $this->conn->query("SET FOREIGN_KEY_CHECKS=1"); 

     //pause 
     time_nanosleep(0, 250000000); 

     // create tables from script 
     $sql = file_get_contents('./scripts/file.sql'); 
     $this->conn->multi_query($sql); 

     $erg = true; 

     error_log(date("Y-m-d H:i:s")." - DB resetted\n", 3, 
      "./scripts/success.log"); 
    } catch (Exception $e) { 
     // log 
     error_log(date("Y-m-d H:i:s")." - DB error\n" 
      . "resetClientDB() \n" 
      . "Reset error \n" 
      . $e->getMessage() . "\n" , 3, 
      "./scripts/error.log"); 
    } 
    return $erg; 
} 
Смежные вопросы