2016-08-08 12 views
6

Lưu ý: Điều chính mà tôi muốn biết là làm thế nào để ngừng chuyển đổi số nguyên và bit thành chuỗi bằng cách sử dụng php. Tôi không muốn sử dụng mysqldump như nhiều máy chủ không cho phép truy cập vào shell và tôi đã thử nghiệm nó. Đó là lý do, tôi đang sử dụng PHPSao lưu dữ liệu Mysql được chuyển thành chuỗi

Tôi đang dùng bản sao lưu của datbases của tôi mà là trên máy chủ trực tiếp với tài liệu tham khảo liên kết https://davidwalsh.name/backup-mysql-database-php vấn đề là khi tôi mở file mà tôi nhận được là sao lưu, tôi thấy toàn bộ dữ liệu được chuyển đổi thành chuỗi. Vì vậy, cho phép nói rằng tôi có null trong trường ngày, nó được chuyển đổi thành ngày thành 0000-00-00, giá trị bit 0 chuyển thành 1.

Tôi đã sử dụng mysqldump và nó cũng có vấn đề mà tôi đặt vào câu hỏi khác: mysqldump working on local but not on godaddy server

chức năng tôi đang sử dụng là như sau:

function Export_Database($host,$user,$pass,$name, $tables, $backup_name=false) 
    { 
     $mysqli = new mysqli($host,$user,$pass,$name); 
     $mysqli->select_db($name); 
     $mysqli->query("SET NAMES 'utf8'"); 
     foreach($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])) 
         { 
          $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"; 
     } 
     $folder = 'DB_Backup/'; 
     if (!is_dir($folder)) 
     mkdir($folder, 0777, true); 
     chmod($folder, 0777); 

     $date = date('m-d-Y-H-i-s', time()); 
     $filename = $folder."db-backup-".$date; 

     $handle = fopen($filename.'.sql','w+'); 
     fwrite($handle,serialize($content)); 
     fclose($handle); 
    } 
+0

tôi đã sử dụng mysqldump nhưng làm việc của nó tốt trên địa phương mà thôi. Các máy chủ không cho phép truy cập vào các shell @ e4c5 –

+0

Tôi đang làm việc trên một dự án mà tôi cần cung cấp cho người dùng quyền truy cập bất cứ khi nào anh ấy muốn sao lưu cơ sở dữ liệu, anh ấy có thể lấy nó trên trang web của mình bằng cách nhấp vào một số nút @ e4c5 –

+0

yeah .. Nhưng nó không hoạt động trên máy chủ. @ e4c5 –

Trả lời

1

tôi giải quyết bằng cách sử dụng cách sau đây. Ở đây, $ bảng là và mảng của bảng database.I bạn sử dụng liên kết để tham khảo http://php.net/manual/en/mysqli-result.fetch-field-direct.php

function Export_Database($host,$user,$pass,$name, $tables, $backup_name=false) 
     { 
      //value greater than 250 are strings 
      $mysql_data_type_hash = array(
       1=>'tinyint', 
       2=>'smallint', 
       3=>'int', 
       4=>'float', 
       5=>'double', 
       7=>'timestamp', 
       8=>'bigint', 
       9=>'mediumint', 
       10=>'date', 
       11=>'time', 
       12=>'datetime', 
       13=>'year', 
       16=>'bit', 
       //252 is currently mapped to all text and blob types (MySQL 5.0.51a) 
       253=>'varchar', 
       254=>'char', 
       246=>'decimal' 
      ); 


      $mysqli = new mysqli($host,$user,$pass,$name); 
      $mysqli->select_db($name); 
      $mysqli->query("SET NAMES 'utf8'"); 
      foreach($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++) 
         { 
          $datatype=$result->fetch_field_direct($j)->type; 
          //echo $mysql_data_type_hash[$datatype]."<br/>"; 
          $row[$j] = str_replace("\n","\\n", addslashes($row[$j])); 
          if (isset($row[$j]) && trim($row[$j])!=null) 
          { 
           if(($datatype>=10 && $datatype<=13) || $datatype>250) 
           { 
            $content .= '"'.$row[$j].'"' ; 
           } 
           else 
           { 
            $content .= $row[$j] ; 
           } 
          } 
          else 
          { 
           $content .= 'NULL'; 
          }  
          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"; 
      } 

      $folder = 'DB_Backup/'; 
      if (!is_dir($folder)) 
      mkdir($folder, 0777, true); 
      chmod($folder, 0777); 

      $date = date('m-d-Y-H-i-s', time()); 
      $filename = $folder."db-backup-".$date; 

      //Commenting The Warning Given By Mysql When Taking Database Backup 
      $content=str_replace("Warning","-- Warning",$content); 

      $handle = fopen($filename.'.sql','w+'); 
      fwrite($handle,$content); 
      fclose($handle); 
     } 
Các vấn đề liên quan