2016-04-11 36 views
-2

我正在兩個平臺上工作。一個是裝有XAMPP的Windows 10計算機,另一個是裝有缺省Apache,PHP和MySQL的Mac OS X El Capitan。目標是將從遠程服務器下載的.sql文件導入本地服務器。代碼如下:mysqli multi_query只能在XAMPP中使用?

$dbhost = 'localhost'; 
$dbuser = 'someuser'; 
$dbpass = 'somepassword'; 
$dbname = 'somedb'; 

$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname); 
if ($mysqli->connect_error) { 
    die('Error : ('. $mysqli->connect_errno .') '. $mysqli->connect_error); 
} 

$filename = "somesql.sql"; 
$sqlSource = file_get_contents($filename); 
$cmp = $mysqli->multi_query($sqlSource); 
if($cmp){ $message = 'Import Successful'; } 
else{ $message = 'Import Unsuccessful | '.$mysqli->error; } 

然而,上述代碼在XAMPP工作在Windows 10計算機上,但不能在Mac OS X.在Mac OS X,它在某種程度上僅執行了從CREATE TABLE語句tablename .sql文件但不包含INSERT INTO表名VALUES位。它不會產生任何錯誤。

它也不能在Windows中使用Apache,PHP和MySQL單獨安裝。

有沒有我錯過的或者是否有一個配置,我需要調整,使其在Mac OS X上工作?

編輯:下面是生成的SQL文件,somesql.sql:

CREATE TABLE `sometable` (
`id` smallint(9) unsigned NOT NULL AUTO_INCREMENT, 
`var_1` varchar(200) DEFAULT NULL, 
`var_2` varchar(200) DEFAULT NULL, 
`var_3` varchar(200) DEFAULT NULL, 
`int_1` int(100) DEFAULT NULL, 
`int_2` int(100) DEFAULT NULL, 
`int_3` int(100) DEFAULT NULL, 
`text_1` text COMMENT 'depot address', 
`text_2` text, 
`text_3` text, 
`decimal_1` decimal(10,2) DEFAULT NULL, 
`decimal_2` decimal(10,2) DEFAULT NULL, 
`decimal_3` decimal(10,2) DEFAULT NULL, 
`datetime_1` datetime DEFAULT NULL, 
`datetime_2` datetime DEFAULT NULL, 
`datetime_3` datetime DEFAULT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `var_1` (`var_1`) 
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=latin1; 


INSERT INTO sometable VALUES 
("2","BN","","","","","","Some details","","","","","","","",""), 
("3","MK","","","","","","Some other details","","","","","","","",""), 
("4","CH","","","","","","Some other other details","","","","","","","",""); 
+0

檢查'file_get_contents'它返回什麼? – Saty

+0

發佈'somesql.sql'文件的代碼以及 – Nehal

+0

@Saty我已編輯帖子以包含生成的sql文件。 – ddz1507

回答

0

那麼事實證明,我不得不調整正被用於導出SQL文件它被導入前的代碼。顯然,感謝記錄他工作的編碼人員,實際上從here複製了導出腳本。

Export_Database($mysqlHostName,$mysqlUserName,$mysqlPassword,$DbName, $tables=array("table1","table2","table3"), $backup_name="somesql.sql"); 

function Export_Database($host,$user,$pass,$name, $tables=false, $backup_name=false) 
{ 
    $mysqli = new mysqli($host,$user,$pass,$name); 
    $mysqli->select_db($name); 
    $mysqli->query("SET NAMES 'utf8'"); 

    $queryTables = $mysqli->query('SHOW TABLES'); 
    while($row = $queryTables->fetch_row()) 
    { 
     $target_tables[] = $row[0]; 
    } 
    if($tables !== false) 
    { 
     $target_tables = array_intersect($target_tables, $tables); 
    } 
    foreach($target_tables as $table) 
    { 
     $result   = $mysqli->query('SELECT * FROM '.$table); 
     $fields_amount = $result->field_count; 
     $rows_num  = $mysqli->affected_rows; 
     $res   = $mysqli->query('SHOW CREATE TABLE '.$table); 
     $TableMLine  = $res->fetch_row(); 
     $content  = (!isset($content) ? '' : $content) . "\n\n".$TableMLine[1].";\n\n"; 

     for ($i = 0, $st_counter = 0; $i < $fields_amount; $i++, $st_counter=0) 
     { 
      while($row = $result->fetch_row()) 
      { //when started (and every after 100 command cycle): 
       if ($st_counter%100 == 0 || $st_counter == 0) 
       { 
         $content .= "\nINSERT INTO ".$table." VALUES"; 
       } 
       $content .= "\n("; 
       for($j=0; $j<$fields_amount; $j++) 
       { 
        $row[$j] = str_replace("\n","\\n", addslashes($row[$j])); 
        if (isset($row[$j])) 
        { 

         if($row[$j] === ''){ $content .= 'NULL'; } 
         else{ 
          if(is_numeric($row[$j])){ $content .= $row[$j]; } 
          else{ $content .= '"'.$row[$j].'"'; } 
         } 
        } 
        else 
        { 
         $content .= '""'; 
        }  
        if ($j<($fields_amount-1)) 
        { 
          $content.= ','; 
        }  
       } 
       $content .=")"; 
       //every after 100 command cycle [or at last line] ....p.s. but should be inserted 1 cycle eariler 
       if ((($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num) 
       { 
        $content .= ";"; 
       } 
       else 
       { 
        $content .= ","; 
       } 
       $st_counter=$st_counter+1; 
      } 
     } $content .="\n\n\n"; 
    } 
    //$backup_name = $backup_name ? $backup_name : $name."___(".date('H-i-s')."_".date('d-m-Y').")__rand".rand(1,11111111).".sql"; 
    //$backup_name = $backup_name ? $backup_name : $name."-".time().".sql"; 
    $backup_name = $backup_name ? $backup_name : "somesql.sql"; 
    header('Content-Type: application/octet-stream'); 
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-disposition: attachment; filename=\"".$backup_name."\""); 
    echo $content; exit; 
} 

所以生成的SQL文件將生產出這樣的事情:

CREATE TABLE `sometable` (
`id` smallint(9) unsigned NOT NULL AUTO_INCREMENT, 
`var_1` varchar(200) DEFAULT NULL, 
`var_2` varchar(200) DEFAULT NULL, 
`var_3` varchar(200) DEFAULT NULL, 
`int_1` int(100) DEFAULT NULL, 
`int_2` int(100) DEFAULT NULL, 
`int_3` int(100) DEFAULT NULL, 
`text_1` text COMMENT 'depot address', 
`text_2` text, 
`text_3` text, 
`decimal_1` decimal(10,2) DEFAULT NULL, 
`decimal_2` decimal(10,2) DEFAULT NULL, 
`decimal_3` decimal(10,2) DEFAULT NULL, 
`datetime_1` datetime DEFAULT NULL, 
`datetime_2` datetime DEFAULT NULL, 
`datetime_3` datetime DEFAULT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `var_1` (`var_1`) 
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=latin1; 

INSERT INTO sometable VALUES 
(2,"BN",NULL,NULL,NULL,NULL,NULL,"Some details",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), 
(3,"MK",NULL,NULL,NULL,NULL,NULL,"Some other details",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), 
(4,"CH",NULL,NULL,NULL,NULL,NULL,"Some other other details",NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); 

的關鍵部分是這條線上面的功能:

if($row[$j] === ''){ $content .= 'NULL'; } 
else{ 
    if(is_numeric($row[$j])){ $content .= $row[$j]; } 
    else{ $content .= '"'.$row[$j].'"'; } 
} 

現在我能在兩個系統中導入sql文件沒有錯誤。