11

MySQLLOAD DATA LOCAL INFILEコマンドを使用していますが、次のエラーが発生します。

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1148 The used 
command is not allowed with this MySQL version: LOAD DATA LOCAL INFILE 
'/tmp/phpI0ox54' INTO TABLE `dev_tmp` FIELDS TERMINATED BY ',' ENCLOSED 
BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES; Array ( ) in 
dc_real_estate_form_submit() (line 147 of /PATH/TO/PHP/SCRIPT).

LOAD DATA LOCAL infile を許可するには、どの設定を変更できますか?

使用している Drupal 7 コードは次のとおりです。

$sql = "LOAD DATA LOCAL INFILE '".$file."'
    INTO TABLE `dev_tmp`
    FIELDS
        TERMINATED BY ','
        ENCLOSED BY '\"'
    LINES
    TERMINATED BY '\\r\\n'
    IGNORE 1 LINES";

db_query($sql);
4

5 に答える 5

28

MySQL でローカル ファイルをロードすることはセキュリティ上の問題であり、デフォルトではオフになっています。可能であればオフのままにしておきます。許可されていない場合、次のエラーが発生します。

ERROR 1148 (42000): The used command is not allowed with this MySQL version

ソリューション:

  1. --local-infile=1mysql コマンドラインで引数を使用します。

    端末で MySQL を起動するときは、次の--local-infile=1ような引数を含めます。

    mysql --local-infile=1 -uroot -p
    
    mysql>LOAD DATA LOCAL INFILE '/tmp/foo.txt' INTO TABLE foo 
    COLUMNS TERMINATED BY '\t';
    

    次に、コマンドが許可されます。

    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
    
  2. または、パラメーターを mysql デーモンに送信します。

    mysqld --local-infile=1
    
  3. または my.cnf ファイルに設定します (これはセキュリティ上のリスクです)。

    mysqlmy.cnfファイルを見つけて、ルートとして編集します。

    local-infilemysqld および mysql 指定子の下に次の行を追加します。

    [mysqld]
    local-infile 
    
    [mysql]
    local-infile 
    

    ファイルを保存し、mysql を再起動します。もう一度やってみる。

詳細については、http: //dev.mysql.com/doc/refman/5.1/en/load-data-local.htmlを参照してください。

于 2012-10-10T22:01:19.307 に答える
2

MySQL サーバーで使用することに加えてlocal-infile(これを /etc/my.cnf ファイルに入れることもできます)、PDO を有効にして許可する必要もあります。

<?php
$pdo = new PDO($dsn, $user, $password, 
    array(PDO::MYSQL_ATTR_LOCAL_INFILE => true)
);

そうしないとlocal-infile、MySQL サーバーの値に関係なく、機能しません。

于 2014-01-02T22:22:42.183 に答える
0

従来の mysql_connect にはclient_flag、mysql パラメータの設定に使用できるパラメータ ' ' もあります。

client_flags パラメーターは、次の定数の組み合わせにすることができます: 128 (LOAD DATA LOCAL 処理を有効にする)、MYSQL_CLIENT_SSL、MYSQL_CLIENT_COMPRESS、MYSQL_CLIENT_IGNORE_SPACE、または MYSQL_CLIENT_INTERACTIVE。詳細については、MySQL クライアント定数に関するセクションを参照してください。SQL セーフ モードでは、このパラメーターは無視されます。 http://php.net/function.mysql-connect

例:

$db = mysql_connect($host, $user, $pass, FALSE, 128);

ただし、次のエラーが発生する場合もあります。

ERROR 29 (HY000): File '/var/www/.../mysql_import.csv' not found (Errcode: 13)

その場合、App Armor の設定を確認して、MySQL がファイルシステム上のインポート ファイルにアクセスできるようにする必要があります。

特に私は追加しました:

  /import/ r,
  /import/* rw,

MySQL に /import への読み取り/書き込みアクセスを許可するには

例: App Armor プロファイルのサンプル

cat /etc/apparmor.d/usr.sbin.mysqld 

# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30 2007
#include <tunables/global>

/usr/sbin/mysqld {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/user-tmp>
  #include <abstractions/mysql>
  #include <abstractions/winbind>

  capability dac_override,
  capability sys_resource,
  capability setgid,
  capability setuid,

  network tcp,

  /etc/hosts.allow r,
  /etc/hosts.deny r,

  /etc/mysql/*.pem r,
  /etc/mysql/conf.d/ r,
  /etc/mysql/conf.d/* r,
  /etc/mysql/*.cnf r,
  /usr/lib/mysql/plugin/ r,
  /usr/lib/mysql/plugin/*.so* mr,
  /usr/sbin/mysqld mr,
  /usr/share/mysql/** r,
  /var/log/mysql.log rw,
  /var/log/mysql.err rw,
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
  /var/log/mysql/ r,
  /var/log/mysql/* rw,
  /var/run/mysqld/mysqld.pid w,
  /var/run/mysqld/mysqld.sock w,
  /run/mysqld/mysqld.pid w,
  /run/mysqld/mysqld.sock w,

  # Custom import folders start
  # These folders will also be read/writeable by mysql.
  /import/ r,
  /import/* rw,
  # Custom import folders end

  /sys/devices/system/cpu/ r,

  # Site-specific additions and overrides. See local/README for details.
  #include <local/usr.sbin.mysqld>
}

その後、MySQL は/importディレクトリからファイルを読み取ることができました。

于 2014-04-02T08:37:15.100 に答える