【问题标题】:Import .sql file via PHP upload通过 PHP 上传导入 .sql 文件
【发布时间】:2013-06-06 11:19:16
【问题描述】:

我正在上传文件以恢复备份表(.sql 格式)... 以下代码用于上传 .sql 文件:

<form enctype="multipart/form-data" method="post">

<font style="font-size:18px;">File to import:</font><br />

<input size='30' type='file' name='filename'>

<input type="submit" name="submit" value="Upload File">
</form>

提交后,如下代码:

set_time_limit ( 0 );

   //Upload File 
    if (isset($_POST['submit'])) { 
       if (is_uploaded_file($_FILES['filename']['tmp_name'])) { 
    if (move_uploaded_file($_FILES['filename']['tmp_name'], $_FILES['filename']['name'])) {



$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '';
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
  die('Could not connect: ' . mysql_error());
}
$table_name = "items";

$backup_file = $_FILES['filename']['name'];

if(!file_exists($backup_file)){
    echo "File Not Exists";
}

$sql = "LOAD DATA INFILE '$backup_file' INTO TABLE $table_name";

mysql_select_db('MM_db');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
  die('Could not load data : ' . mysql_error());
}
echo "Loaded  data successfully\n";
mysql_close($conn);
fclose($handle); 
     }
     ?>
     <script>
     alert('Items Uploaded Successfully');
     </script>
     <?php  
exit();
       }
    }

在上传时,我收到此错误:

Could not load data : File 'c:\wamp\bin\mysql\mysql5.5.24\data\MM_db\items.sql' not found (Errcode: 2)

它好像没有找到我的 items.sql 文件,虽然我已经通过 file_exists($backup_file) 检查了它是否存在,但我仍然面临这个问题。我认为文件上传代码可能缺少某些内容?

【问题讨论】:

  • 请不要这样做。您在此处获得了 访问控制。如果有的话,您应该使用 phpMyAdmin 而不是自己滚动。请记住LOAD DATA INFILE 需要将文件保存在 MySQL 服务器上,而不是 Web 服务器上。
  • @tadman 对不起,但你错了,如果我将 $backup_file 值替换为特定的文件路径 - 示例 C:/items.sql 并删除整个文件上传......它会像魅力一样工作,但我更喜欢以更具挑战性的方式做事!
  • 该路径必须与 MySQL 服务器进程位于同一台机器上。在这种情况下,可能是同一台机器。

标签: php mysql database upload


【解决方案1】:

LOAD DATA INFILE 无法执行在 SQL 脚本中找到的 SQL 语句。它期望文件包含带有符号选项作为分隔符和定界符的文本数据。它不识别 SQL 语句。

如果您在 SQL 脚本上使用 LOAD DATA INFILE,那么您只会将文本 SQL 语句加载到数据库中,这与执行 SQL 语句本身有很大不同。

如果您需要在脚本中执行 SQL 语句,您可以在 phpMyAdmin 应用程序中找到执行此操作的代码。从头开始复制此功能比听起来要困难得多。请参阅我对以下内容的回答中的示例:

更好的解决方案是使用shell_exec()执行一个SQL脚本来启动mysql客户端,并将上传的SQL脚本作为输入。

但@tadman 是正确的,这是一件危险且不安全的事情,允许用户输入发送您逐字执行的 SQL 脚本。您无法知道他们将在该脚本文件中包含哪些恶意查询!

【讨论】:

    【解决方案2】:

    我使用file_get_contents() 访问文件内容并使用 PDO 执行代码。

        if (isset($_FILES['data'])) {
            if (is_uploaded_file($_FILES['filename']['tmp_name'])) { 
                if (move_uploaded_file($_FILES['filename']['tmp_name'], $_FILES['filename']['name'])) {
                    $db = new PDO('dns', 'user', 'pass');
                    $sql = file_get_contents($_FILES['filename']['name']);                  
                    $data = $db->prepare($sql);
                    $data->execute();
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2017-10-19
      • 2011-08-10
      • 2017-06-25
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-17
      • 2016-02-22
      相关资源
      最近更新 更多