【问题标题】:How do I import a .sql file in mysql database using PHP?如何使用 PHP 在 mysql 数据库中导入 .sql 文件?
【发布时间】:2013-11-14 02:31:53
【问题描述】:

我正在尝试通过 PHP 代码导入 .sql 文件。但是,我的代码显示此错误:

There was an error during import. Please make sure the import file is saved in the same folder as this script and check your values:

MySQL Database Name:    test
MySQL User Name:    root
MySQL Password: NOTSHOWN
MySQL Host Name:    localhost
MySQL Import Filename:  dbbackupmember.sql

这是我的代码:

<?php
//ENTER THE RELEVANT INFO BELOW
$mysqlDatabaseName ='test';
$mysqlUserName ='root';
$mysqlPassword ='';
$mysqlHostName ='localhost';
$mysqlImportFilename ='dbbackupmember.sql';
//DONT EDIT BELOW THIS LINE
//Export the database and output the status to the page
$command='mysql -h' .$mysqlHostName .' -u' .$mysqlUserName .' -p' .$mysqlPassword .' ' .$mysqlDatabaseName .' < ' .$mysqlImportFilename;
exec($command,$output=array(),$worked);
switch($worked){
    case 0:
        echo 'Import file <b>' .$mysqlImportFilename .'</b> successfully imported to database <b>' .$mysqlDatabaseName .'</b>';
        break;
    case 1:
        echo 'There was an error during import. Please make sure the import file is saved in the same folder as this script and check your values:<br/><br/><table><tr><td>MySQL Database Name:</td><td><b>' .$mysqlDatabaseName .'</b></td></tr><tr><td>MySQL User Name:</td><td><b>' .$mysqlUserName .'</b></td></tr><tr><td>MySQL Password:</td><td><b>NOTSHOWN</b></td></tr><tr><td>MySQL Host Name:</td><td><b>' .$mysqlHostName .'</b></td></tr><tr><td>MySQL Import Filename:</td><td><b>' .$mysqlImportFilename .'</b></td></tr></table>';
        break;
}
?>

我做错了什么? SQL 文件位于同一目录中。

【问题讨论】:

  • 您确定dbbackupmember.sql 文件与您的脚本存在于同一目录中吗? var_dump( file_exists('dbbackupmember.sql') ); 输出什么?
  • 是的,这是同一个目录,但我不知道为什么它显示错误
  • apache 进程是否有权访问存储转储的文件夹/文件? exec('whoami') 是否返回您的用户名?由于权限的原因,有时 exec 也无法与 apache 进程一起正常工作。

标签: php mysql


【解决方案1】:

如果您使用的是 PHP 7 或更高版本,请尝试以下脚本,

// Name of the file
$filename = 'sql.sql';
// MySQL host
$mysql_host = 'localhost';
// MySQL username
$mysql_username = 'username';
// MySQL password
$mysql_password = 'password';
// Database name
$mysql_database = 'database';
// Connect to MySQL server
$con = @new mysqli($mysql_host,$mysql_username,$mysql_password,$mysql_database);
// Check connection
if ($con->connect_errno) {
   echo "Failed to connect to MySQL: " . $con->connect_errno;
   echo "<br/>Error: " . $con->connect_error;
}
// Temporary variable, used to store current query
$templine = '';
// Read in entire file
$lines = file($filename);
// Loop through each line
foreach ($lines as $line) {
// Skip it if it's a comment
if (substr($line, 0, 2) == '--' || $line == '')
    continue;
// Add this line to the current segment
$templine .= $line;
// If it has a semicolon at the end, it's the end of the query
if (substr(trim($line), -1, 1) == ';') {
// Perform the query
$con->query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . $con->error() . '<br /><br />');
    // Reset temp variable to empty
    $templine = '';
}
}
echo "Tables imported successfully";
$con->close($con);

【讨论】:

    【解决方案2】:

    警告: mysql_* 扩展自 PHP 5.5.0 起已弃用,自 PHP 7.0.0 起已被删除。相反,应该使用mysqliPDO_MySQL 扩展名。在选择 MySQL API 时,另请参阅 MySQL API Overview 以获得更多帮助。
    只要有可能,将文件导入 MySQL 应委托给 MySQL 客户端。

    Raj 的回答很有用,但是(因为 file($filename)) 如果你的 mysql-dump 不适合内存

    ,它将失败

    如果您使用共享主机并且存在限制,例如 30 MB 和 12 秒的脚本运行时间,您必须恢复 x00MB mysql 转储 ,你可以使用这个脚本:

    它将遍历转储文件查询进行查询,如果脚本执行截止日期临近,它将当前文件位置保存在 tmp 文件中,并且自动浏览器重新加载将一次又一次地继续此过程... 如果发生错误,重新加载将停止并显示错误...

    如果您吃完午饭回来,您的数据库将会恢复 ;-)

    noLimitDumpRestore.php:

    // your config
    $filename = 'yourGigaByteDump.sql';
    $dbHost = 'localhost';
    $dbUser = 'user';
    $dbPass = '__pass__';
    $dbName = 'dbname';
    $maxRuntime = 8; // less then your max script execution limit
    
    
    $deadline = time()+$maxRuntime; 
    $progressFilename = $filename.'_filepointer'; // tmp file for progress
    $errorFilename = $filename.'_error'; // tmp file for erro
    
    mysql_connect($dbHost, $dbUser, $dbPass) OR die('connecting to host: '.$dbHost.' failed: '.mysql_error());
    mysql_select_db($dbName) OR die('select db: '.$dbName.' failed: '.mysql_error());
    
    ($fp = fopen($filename, 'r')) OR die('failed to open file:'.$filename);
    
    // check for previous error
    if( file_exists($errorFilename) ){
        die('<pre> previous error: '.file_get_contents($errorFilename));
    }
    
    // activate automatic reload in browser
    echo '<html><head> <meta http-equiv="refresh" content="'.($maxRuntime+2).'"><pre>';
    
    // go to previous file position
    $filePosition = 0;
    if( file_exists($progressFilename) ){
        $filePosition = file_get_contents($progressFilename);
        fseek($fp, $filePosition);
    }
    
    $queryCount = 0;
    $query = '';
    while( $deadline>time() AND ($line=fgets($fp, 1024000)) ){
        if(substr($line,0,2)=='--' OR trim($line)=='' ){
            continue;
        }
    
        $query .= $line;
        if( substr(trim($query),-1)==';' ){
            if( !mysql_query($query) ){
                $error = 'Error performing query \'<strong>' . $query . '\': ' . mysql_error();
                file_put_contents($errorFilename, $error."\n");
                exit;
            }
            $query = '';
            file_put_contents($progressFilename, ftell($fp)); // save the current file position for 
            $queryCount++;
        }
    }
    
    if( feof($fp) ){
        echo 'dump successfully restored!';
    }else{
        echo ftell($fp).'/'.filesize($filename).' '.(round(ftell($fp)/filesize($filename), 2)*100).'%'."\n";
        echo $queryCount.' queries processed! please reload or wait for automatic browser refresh!';
    }
    

    【讨论】:

    • 你的脚本也解决了我的问题!我有 2.4GB 的大 SQL,并且无法控制增加允许的文件大小和查询大小。非常感谢!
    • 这可能与 mysqli 的更新有关——mysql_connect 在 php 5.5 中已弃用并在 7 中删除
    • 使用此脚本时,我遇到了一些特殊字符(ö、ä、²、³..)的问题,但不是在每个表中。使用上面的 ManojGeek 脚本可以正常工作。
    • @user2355808 - 这很奇怪 - 因为展位脚本使用相同的功能并且没有 charset-agnostic-functions (file and mysql-query vs. fgets and mysql-query),也许你的 db-creation 是不同的
    • 注意客户端缓存。此外,刷新时间可以设置为 1,因为在页面加载之前计时器不会运行。
    【解决方案3】:

    警告: mysql_* 扩展自 PHP 5.5.0 起已弃用,自 PHP 7.0.0 起已被删除。相反,应该使用mysqliPDO_MySQL 扩展名。在选择 MySQL API 时,另请参阅 MySQL API Overview 以获得更多帮助。
    只要有可能,将文件导入 MySQL 应委托给 MySQL 客户端。

    我还有其他方法,试试这个

    <?php
    
    // Name of the file
    $filename = 'churc.sql';
    // MySQL host
    $mysql_host = 'localhost';
    // MySQL username
    $mysql_username = 'root';
    // MySQL password
    $mysql_password = '';
    // Database name
    $mysql_database = 'dump';
    
    // 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());
    
    // Temporary variable, used to store current query
    $templine = '';
    // Read in entire file
    $lines = file($filename);
    // Loop through each line
    foreach ($lines as $line)
    {
    // Skip it if it's a comment
    if (substr($line, 0, 2) == '--' || $line == '')
        continue;
    
    // Add this line to the current segment
    $templine .= $line;
    // If it has a semicolon at the end, it's the end of the query
    if (substr(trim($line), -1, 1) == ';')
    {
        // Perform the query
        mysql_query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . mysql_error() . '<br /><br />');
        // Reset temp variable to empty
        $templine = '';
    }
    }
     echo "Tables imported successfully";
    ?>
    

    这对我有用

    【讨论】:

    • 老兄!救了我的命! :D 由于我有大量的转储文件,我需要流式传输文件而不是一次读取所有文件……请参阅此处http://stackoverflow.com/a/13246630/1050264
    • 我也添加了这个:if(substr($line,0,2) == "/*"){continue;}。有帮助。
    • 不要使用它,因为你很快就会内存不足!
    • @Enrique 你能详细说明一下吗:D 我应该先做什么,上传文件 .sql 然后继续上面的脚本!我的问题是数据库更新或替换为新的
    • @FreddySidauruk 您应该上传文件并将其放入脚本所在的同一文件夹中。然后执行脚本。数据库应为空,除非您确定 .sql 文件将正确更新数据库、表、视图等中的所有内容。
    【解决方案4】:

    你可以使用mysqli的multi_query函数如下:

    $sql = file_get_contents('mysqldump.sql');
    
    $mysqli = new mysqli("localhost", "root", "pass", "testdb");
    
    /* execute multi query */
    $mysqli->multi_query($sql);
    

    【讨论】:

    • 这比公认的答案要快得多。准确地说是快了 100 倍。 (我测量过)。
    • 如果由于某种原因您不能使用命令行mysql 命令,那么这是首选选项。使用 multi_query 时要小心,因为它是异步的,之后必须运行阻塞循环。
    • 补充一下 Dharman 所说的,这个问题是你需要能够将整个转储文件读入内存才能工作,所以它只适用于 较小的文件。如果你有一个 1GB 的转储文件,这将由于内存不足而失败。大型转储文件只能通过 MySQL 命令行处理
    【解决方案5】:

    众所周知,MySQL 在 PHP 5.5.0 中已弃用,并在 PHP 7.0.0 ref 中被删除,因此我已将接受的 answer 转换为 mysqli。

    <?php
    // Name of the file
    $filename = 'db.sql';
    // MySQL host
    $mysql_host = 'localhost';
    // MySQL username
    $mysql_username = 'root';
    // MySQL password
    $mysql_password = '123456';
    // Database name
    $mysql_database = 'mydb';
    
    $connection = mysqli_connect($mysql_host,$mysql_username,$mysql_password,$mysql_database) or die(mysqli_error($connection));
    
    // Temporary variable, used to store current query
    $templine = '';
    // Read in entire file
    $lines = file($filename);
    // Loop through each line
    foreach ($lines as $line)
    {
    // Skip it if it's a comment
    if (substr($line, 0, 2) == '--' || $line == '')
        continue;
    
    // Add this line to the current segment
    $templine .= $line;
    // If it has a semicolon at the end, it's the end of the query
    if (substr(trim($line), -1, 1) == ';')
    {
        // Perform the query
        mysqli_query($connection,$templine) or print('Error performing query \'<strong>' . $templine . '\': ' . mysqli_error($connection) . '<br /><br />');
        // Reset temp variable to empty
        $templine = '';
    }
    }
     echo "Tables imported successfully";
    ?>
    

    【讨论】:

    • 这是值得称赞的,但现实情况是这是一种糟糕的方法。我不推荐,我不得不投反对票。改用 MySQL 备份功能或 multi_query(小心)
    【解决方案6】:

    如果您需要用户界面并且想要使用 PDO

    这是一个简单的解决方案

    <form method="post" enctype="multipart/form-data">
        <input type="text" name="db" placeholder="Databasename" />
        <input type="file" name="file">
        <input type="submit" name="submit" value="submit">
    </form>
    
    <?php
    
    if(isset($_POST['submit'])){
        $query = file_get_contents($_FILES["file"]["name"]);
        $dbname = $_POST['db'];
        $con = new PDO("mysql:host=localhost;dbname=$dbname","root","");
        $stmt = $con->prepare($query);
        if($stmt->execute()){
            echo "Successfully imported to the $dbname.";
        }
    }
    ?>
    

    绝对是我的目标。值得一试。

    【讨论】:

      【解决方案7】:
      function restoreDatabase($db_name,$file_path)
      {
      
          //checking valid extension file
          $path_parts = pathinfo($file_path);
          $ext_file = $path_parts['extension'];
          $filename = $path_parts['basename'];
      
          if($ext_file == "sql")
          {
               $c = new Config();
      
               $confJson = $c->getConfig();
               $conf = json_decode($confJson);
      
               $dbhost   = "127.0.0.1";
               $dbuser   = $conf->db_username;  
               $dbpwd    = $conf->db_password;
               $dbname   = $db_name;   
      
               $dumpfile = $file_path;
      
               $is_file = file_exists($file_path);
               if($is_file == TRUE)
               {
      
                   //passthru("/usr/bin/mysqldump --opt --host=$dbhost --user=$dbuser --password=$dbpwd $dbname < $dumpfile");
      
                   //passthru("tail -1 $dumpfile");
                   system('mysql --user='.$dbuser.' --password='.$dbpwd.' '.$db_name.' < '.$file_path);
                   return "Database was restored from $filename ";
      
               }
               else 
               {
                   return "Restore database was aborted due ".$filename." does not exist!";
               }
      
      
          }
          else
          {
              return "Invalid file format.Require sql file to restore this ".$db_name." database. ".$filename." is not sql file format\n(eg. mybackupfile.sql).";
          }
      }
      

      【讨论】:

        【解决方案8】:

        我觉得你可以试试这个代码,它是为我的案例运行的:

        <?php
        
        $con = mysqli_connect('localhost', 'root', 'NOTSHOWN', 'test');
        
        $filename = 'dbbackupmember.sql';
        $handle = fopen($filename, 'r+');
        $contents = fread($handle, filesize($filename));
        
        $sql = explode(";", $contents);
        foreach ($sql as $query) {
        	$result = mysqli_query($con, $query);
        	if ($result) {
        		echo "<tr><td><br></td></tr>";
        		echo "<tr><td>".$query."</td></tr>";
        		echo "<tr><td><br></td></tr>";
        	}
        }
        
        fclose($handle);
        echo "success";
        
        
        ?>

        【讨论】:

          【解决方案9】:

          Grain Script 非常棒,可以节省我的时间。同时 mysql 被贬值,我使用 PDO 重写了 Grain 答案。

              $server  =  'localhost'; 
              $username   = 'root'; 
              $password   = 'your password';  
              $database = 'sample_db';
          
              /* PDO connection start */
              $conn = new PDO("mysql:host=$server; dbname=$database", $username, $password);
              $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);         
              $conn->exec("SET CHARACTER SET utf8");     
              /* PDO connection end */
          
              // your config
              $filename = 'yourFile.sql';
          
              $maxRuntime = 8; // less then your max script execution limit
          
          
              $deadline = time()+$maxRuntime; 
              $progressFilename = $filename.'_filepointer'; // tmp file for progress
              $errorFilename = $filename.'_error'; // tmp file for erro
          
          
          
              ($fp = fopen($filename, 'r')) OR die('failed to open file:'.$filename);
          
              // check for previous error
              if( file_exists($errorFilename) ){
                  die('<pre> previous error: '.file_get_contents($errorFilename));
              }
          
              // activate automatic reload in browser
              echo '<html><head> <meta http-equiv="refresh" content="'.($maxRuntime+2).'"><pre>';
          
              // go to previous file position
              $filePosition = 0;
              if( file_exists($progressFilename) ){
                  $filePosition = file_get_contents($progressFilename);
                  fseek($fp, $filePosition);
              }
          
              $queryCount = 0;
              $query = '';
              while( $deadline>time() AND ($line=fgets($fp, 1024000)) ){
                  if(substr($line,0,2)=='--' OR trim($line)=='' ){
                      continue;
                  }
          
                  $query .= $line;
                  if( substr(trim($query),-1)==';' ){
          
                      $igweze_prep= $conn->prepare($query);
          
                      if(!($igweze_prep->execute())){ 
                          $error = 'Error performing query \'<strong>' . $query . '\': ' . print_r($conn->errorInfo());
                          file_put_contents($errorFilename, $error."\n");
                          exit;
                      }
                      $query = '';
                      file_put_contents($progressFilename, ftell($fp)); // save the current file position for 
                      $queryCount++;
                  }
              }
          
              if( feof($fp) ){
                  echo 'dump successfully restored!';
              }else{
                  echo ftell($fp).'/'.filesize($filename).' '.(round(ftell($fp)/filesize($filename), 2)*100).'%'."\n";
                  echo $queryCount.' queries processed! please reload or wait for automatic browser refresh!';
              }
          

          【讨论】:

          • 我认为您和grain 需要在完成后取消文件指针文件的链接,不是吗?否则,如果您重新上传相同的文件名,它将继续尝试从该最终指针运行
          【解决方案10】:

          解决方案特殊字符

           $link=mysql_connect($dbHost, $dbUser, $dbPass) OR die('connecting to host: '.$dbHost.' failed: '.mysql_error());
          mysql_select_db($dbName) OR die('select db: '.$dbName.' failed: '.mysql_error());
          
          //charset important
          mysql_set_charset('utf8',$link);
          

          【讨论】:

            【解决方案11】:
            // Import data 
            $filename = 'database_file_name.sql';
            import_tables('localhost','root','','database_name',$filename);
            
            function import_tables($host,$uname,$pass,$database, $filename,$tables = '*'){
                $connection = mysqli_connect($host,$uname,$pass)
                or die("Database Connection Failed");
                $selectdb = mysqli_select_db($connection, $database) or die("Database could not be selected"); 
            
            $templine = '';
            $lines = file($filename); // Read entire file
            
            foreach ($lines as $line){
                // Skip it if it's a comment
                if (substr($line, 0, 2) == '--' || $line == '' || substr($line, 0, 2) == '/*' )
                    continue;
            
                    // Add this line to the current segment
                    $templine .= $line;
                    // If it has a semicolon at the end, it's the end of the query
                    if (substr(trim($line), -1, 1) == ';')
                    {
                        mysqli_query($connection, $templine)
                        or print('Error performing query \'<strong>' . $templine . '\': ' . mysqli_error($connection) . '<br /><br />');
                        $templine = '';
                    }
                }
                echo "Tables imported successfully";
            }
            
            
            
            
            // Backup database from php script
            backup_tables('hostname','UserName','pass','databses_name');
            
            function backup_tables($host,$user,$pass,$name,$tables = '*'){
                $link = mysqli_connect($host,$user,$pass);
                if (mysqli_connect_errno()){
                    echo "Failed to connect to MySQL: " . mysqli_connect_error();
                }
            
                mysqli_select_db($link,$name);
                //get all of the tables
                if($tables == '*'){
                    $tables = array();
                    $result = mysqli_query($link,'SHOW TABLES');
                    while($row = mysqli_fetch_row($result))
                    {
                        $tables[] = $row[0];
                    }
                }else{
                    $tables = is_array($tables) ? $tables : explode(',',$tables);
                }
            
                $return = '';
                foreach($tables as $table)
                {
                    $result = mysqli_query($link,'SELECT * FROM '.$table);
                    $num_fields = mysqli_num_fields($result);
                    $row_query = mysqli_query($link,'SHOW CREATE TABLE '.$table);
                    $row2 = mysqli_fetch_row($row_query);
                    $return.= "\n\n".$row2[1].";\n\n";
            
                    for ($i = 0; $i < $num_fields; $i++) 
                    {
                        while($row = mysqli_fetch_row($result))
                        {
                            $return.= 'INSERT INTO '.$table.' VALUES(';
                            for($j=0; $j < $num_fields; $j++) 
                            {
                                $row[$j] = addslashes($row[$j]);
                                $row[$j] = str_replace("\n", '\n', $row[$j]);
                                if (isset($row[$j])) { 
                                    $return.= '"'.$row[$j].'"' ; 
                                } else { 
                                    $return.= '""'; 
                                }
                                if ($j < ($num_fields-1)) { $return.= ','; }
                            }
                            $return.= ");\n";
                        }
                    }
                    $return.="\n\n\n";
                }
            
                //save file
                $handle = fopen('backup-'.date("d_m_Y__h_i_s_A").'-'.(md5(implode(',',$tables))).'.sql','w+');
                fwrite($handle,$return);
                fclose($handle);
            }
            

            【讨论】:

            • 对脚本的作用和工作方式的解释是否有任何更改?
            【解决方案12】:

            我使用此代码并成功运行:

            $filename = 'apptoko-2016-12-23.sql'; //change to ur .sql file
                                        $handle = fopen($filename, "r+");
                                        $contents = fread($handle, filesize($filename));
            
                                        $sql = explode(";",$contents);// 
                                        foreach($sql as $query){
                                            $result=mysql_query($query);
                                            if ($result){
                                             echo '<tr><td><BR></td></tr>';
                                             echo '<tr><td>' . $query . ' <b>SUCCESS</b></td></tr>';
                                             echo '<tr><td><BR></td></tr>';
                                            }
                                        }
                                        fclose($handle);
            

            【讨论】:

              【解决方案13】:
              <?php
              $host = "localhost";
              $uname = "root";
              $pass = "";
              $database = "demo1"; //Change Your Database Name
              $conn = new mysqli($host, $uname, $pass, $database);
              $filename = 'users.sql'; //How to Create SQL File Step : url:http://localhost/phpmyadmin->detabase select->table select->Export(In Upper Toolbar)->Go:DOWNLOAD .SQL FILE
              $op_data = '';
              $lines = file($filename);
              foreach ($lines as $line)
              {
                  if (substr($line, 0, 2) == '--' || $line == '')//This IF Remove Comment Inside SQL FILE
                  {
                      continue;
                  }
                  $op_data .= $line;
                  if (substr(trim($line), -1, 1) == ';')//Breack Line Upto ';' NEW QUERY
                  {
                      $conn->query($op_data);
                      $op_data = '';
                  }
              }
              echo "Table Created Inside " . $database . " Database.......";
              ?>
              

              【讨论】:

                【解决方案14】:
                <?php
                system('mysql --user=USER --password=PASSWORD DATABASE< FOLDER/.sql');
                ?>
                

                【讨论】:

                • 这是推荐的解决方案。将文件导入 MySQL 应始终委托给 MySQL 客户端。
                【解决方案15】:

                我已经测试了你的代码,当你已经导入了数据库或者一些同名的表时,这个错误就会显示出来,而且显示的数组错误是因为你在 exec 括号中添加了,这里是固定版本:

                <?php
                //ENTER THE RELEVANT INFO BELOW
                $mysqlDatabaseName ='test';
                $mysqlUserName ='root';
                $mysqlPassword ='';
                $mysqlHostName ='localhost';
                $mysqlImportFilename ='dbbackupmember.sql';
                //DONT EDIT BELOW THIS LINE
                //Export the database and output the status to the page
                $command='mysql -h' .$mysqlHostName .' -u' .$mysqlUserName .' -p' .$mysqlPassword .' ' .$mysqlDatabaseName .' < ' .$mysqlImportFilename;
                $output=array();
                exec($command,$output,$worked);
                switch($worked){
                    case 0:
                        echo 'Import file <b>' .$mysqlImportFilename .'</b> successfully imported to database <b>' .$mysqlDatabaseName .'</b>';
                        break;
                    case 1:
                        echo 'There was an error during import.';
                        break;
                }
                ?> 
                

                【讨论】:

                • 这是推荐的解决方案。将文件导入 MySQL 应始终委托给 MySQL 客户端。
                猜你喜欢
                • 2015-04-25
                • 1970-01-01
                • 2023-01-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-01-21
                • 2014-07-15
                相关资源
                最近更新 更多