2013-11-26 9 views
7

最近私はWebサーバーを移動しましたが、新しいWebサーバーには異なるバージョンのPHPがあります。PDOを使用してphp 5.5からLOAD DATA LOCAL INFILEが機能しない

新しいサーバ:PHP 5.5.3-1ubuntu2(CLI) 古いサーバ:PHP 5.3.10(CLI)

データベースサーバーでは、my.cnfファイルは、ローカル・INFILEを許可するように設定されています。 Iから負荷データをローカルINFILEを使用することができます。私はPDOとPHPを使用して、新しいWebサーバーから接続しようとすると、しかし、私が手

- HeidiSQL 
- The command line client running on the new web server using --local-infile=1 
- PHP, using PDO, from the old web server 

: データベースの問題が発生しました:SQLSTATE [42000]:構文エラーまたはアクセス違反が:1148ザ・使用コマンドは、このMySQLバージョンでは使用できません

のphp.ini:

[MySQL] 
; Allow accessing, from PHP's perspective, local files with LOAD DATA statements 
; http://php.net/mysql.allow_local_infile 
mysql.allow_local_infile = On 

PDOコンストラクタ:

$this->db_conn = new PDO("mysql:host=$host;dbname=$dbname;port=$port", $user, $pass, array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1)); 

また、PHPスクリプトでini_set( 'mysql.allow_local_infile'、1)とini_set( 'mysql.allow_local_infile'、true)を試しました。

ファイルがデータベースサーバーではなくWebサーバーでホストされているため、LOCALキーワードが必要です。

他にPHP 5.5が私に求めているのは何ですか?

+0

...私が知っているとあなたのMySQLバージョン解決doesntの場合は? – Hackerman

+1

これは権限の問題である可能性がありますか?私が知る限り、PDOはこれに関して特別なことはしません。 – tadman

+0

MySQLデータベース: readline 5.1を使用しているredhat-linux-gnu(x86_64)用のmysql Ver 14.14 Distrib 5.1.69。 CentOS 5でホストされています。 すべてのテストで同じユーザーとパスワードを使用していますので、MySQLのアクセス許可の問題ではありません。 PHPスクリプトはrootによって実行されます。 – NotEnoughGolds

答えて

15

は、このコマンドを許可するように両方クライアントとサーバーを設定する必要があります。

  1. は必ずサーバが許可のLOAD DATA LOCAL INFILEを行います。

    <?php 
    
    $dsn = "mysql:host=localhost;dbname=test"; 
    $user = "root"; 
    $password = "root"; 
    $pdo = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_LOCAL_INFILE=>1)); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    
    $pdo->exec("LOAD DATA LOCAL INFILE 'foo.csv' INTO TABLE foo FIELDS TERMINATED BY ','"); 
    

    これは、コンストラクタにドライバオプションの引数に設定する必要があります:MySQLサーバ上で編集しな/etc/my.cnf:あなたのPHPスクリプトでPDO属性を設定し

    [server] 
    local-infile=1 
    
  2. その後のsetAttribute()の呼び出しでは発生しません。

    CentOS Linux 6.5では、PHP 5.5.8とPercona Server 5.6.15で上記のコード例を正常にテストしました。

まだ問題がある場合は、ローカルクライアントを許可していないMySQLクライアントまたはPDOのビルドがある可能性があります。要件は、php.iniのmysql.allow_local_infileオプションは、PDOに関連しないhttp://dev.mysql.com/doc/refman/5.6/en/load-data-local.html

に記述されています。

0

あなたのコードは間違いなく正しいです、あなたのデータベースファイルにエラーがあると、変更する必要はありません。

エラー原因

あなたのエラーの理由は、あなたがコマンドラインを介してデータベースのバックアップを作成してきたように発生すると、カスタムのPHPスクリプトを介してデータをアップロードしようとしています。

ソリューション

解決の問題に利用できる2つの解決策はありますがあります: -

  1. は、コマンドラインを介してデータベースをロードしようとあなたがコマンドラインへのアクセス権を持っていけない場合、あなたはにサービスプロバイダに依頼することができますあなたのためにアップロードします。彼は単純なコマンドを実行しなければならないので。

  2. テキストエディタでdatabseファイルを開き、使用されているエンコーディングのヘッダーを確認します。次にデータを読み込み、デコードしてからinsertコマンドを実行します。

問題はその後

関連する問題