LOAD DATA LOCAL INFILE fails - from php, to mysql (on Amazon rds)

后端 未结 5 1905
忘掉有多难
忘掉有多难 2020-12-09 14:08

We\'re moving our database from being on the webserver to a separate server (from an Amazon EC2 webserver to an RDS instance.)

We have a LOAD DATA INFILE that worked

5条回答
  •  庸人自扰
    2020-12-09 14:36

    Here's a check list to rule out this nasty bug:


    1- Grant the user FILE privileges in MySQL, phpMyAdmin generaly does not cover this privilege:

    GRANT FILE ON *.* TO 'db_user'@'localhost';
    

    2- Edit my.cnf in /etc/mysql/ or your mysql path:

    [mysql]
    local-infile=1
    [mysqld]
    local-infile=1
    

    3- In php.ini at /etc/php5/cli/ or similar:

    mysql.allow_local_infile = On
    

    Optionally you can run ini_set in your script:

    ini_set('mysql.allow_local_infile', 1);
    

    4- The database handler library must use the correct options.
    PDO:

    new PDO('mysql:host='.$db_host.'.;dbname='.$db_name, $db_user, $db_pass,
    array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1));
    

    mysqli:

    $conn = mysqli_init();
    mysqli_options($conn, MYSQLI_OPT_LOCAL_INFILE, true);
    mysqli_real_connect($conn,server,user,code,database);
    

    5- Make sure that the INFILE command uses the absolute path to the file and that it exists:

    $sql = "LOAD DATA INFILE '".realpath(is_file($file))."'";
    

    6- Check that the target file and parent directory are readable by PHP and by MySQL.

    $ sudo chmod 777 file.csv
    

    7- If you are working locally you can remove the LOCAL from your SQL:

    LOAD DATA INFILE
    

    Instead of:

    LOAD DATA LOCAL INFILE
    

    Note: Remember to restart the MySQL and PHP services if you edit their configuration files.

    Hope this helps someone.

提交回复
热议问题