通过PHP上传导入.sql文件

时间:2013-06-10 18:00:09

标签: php mysql database upload

我正在进行文件上传以恢复备份表(.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)检查了它是否存在,但我仍然面临着这个问题。我认为文件上传代码可能缺少某些东西吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

我使用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();
            }
        }
    }