【问题标题】:No File created with SELECT * INTO OUTFILE没有使用 SELECT * INTO OUTFILE 创建文件
【发布时间】:2018-02-12 10:22:50
【问题描述】:

我在共享主机上工作,我必须使用 PHP 导出 MySQL 数据库,因为我有一个客户希望能够导入和导出他们的数据库。

我搜索了互联网,发现看起来很简单,我在主机的子目录中创建了以下文件。

<?php
    include "connect.php";

    if($conn->connect_errno > 0) {
        die('Connection failed [' . $db->connect_error . ']');
    }

    $tableName  = 'questions';
    $backupFile = 'backup/mytable.sql';
    $query      = "SELECT * INTO OUTFILE '$backupFile' FROM $tableName";
    $result = mysqli_query($conn,$query);
?>

我试过了,它似乎可以工作(error_log 文件中没有错误。),但它没有创建文件。

我尝试了不同的输出文件夹、文件和文件类型,但这改变了一切。

我发现其他人用INTO OUTFILE进行了探测,因为mysql用户没有足够的权限。我怎样才能知道呢?那它不应该给我一个错误吗?

是否有一个简单(或不简单)的替代 INTO OUTFILE,我可以使用 PHP 运行并创建一个可以稍后导入的文件?

【问题讨论】:

  • 如果我没记错的话,INTO OUTFILE 是相对于数据库服务器的文件系统上的一个目录。不是您的脚本正在运行的那个。由于您使用的是共享主机,因此它们很可能不在同一台服务器上,或者如果它们在同一台服务器上,那么您需要使用指向您想要文件的位置的绝对路径。
  • mysqli_query 是否返回 true?如果不是,mysqli_error 的结果是什么?你在哪里寻找文件? (在数据库服务器上,我希望...)
  • @KarlHofmann 就像我说的,它可能不在那个服务器上(或者如果是,也许你没有读取权限)
  • 如果查询失败,那么 mysqli_error 至少应该给你一些东西。
  • @KarlHofmann 我只见过hand-rolling stuff using fputcsv 的人,但我想有它的库......

标签: php mysql database download


【解决方案1】:

$backupFile

中删除单引号

这样

 $query      = "SELECT * INTO OUTFILE $backupFile FROM $tableName";

否则,它会将其读取为字符串,而不是您存储备份文件路径的变量。

【讨论】:

    【解决方案2】:

    改变

    $backupFile = 'backup/mytable.sql';
    

    $backupFile = sys_get_temp_dir() . '/mytable.sql';
    

    那么,假设DB和PHP引擎运行在同一台主机上,可以读取$backupFile

    【讨论】:

      【解决方案3】:

      This 解决了我的问题。 我不得不改变一些小东西(和 mysql 到 mysqli)。 不是最好的解决方案,但它也适用于共享主机。

      【讨论】:

        猜你喜欢
        • 2010-11-05
        • 2011-05-14
        • 2011-02-21
        • 2013-03-24
        • 1970-01-01
        • 2014-10-04
        • 1970-01-01
        • 2011-08-10
        • 1970-01-01
        相关资源
        最近更新 更多