質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • PHP

    20304questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

PHPからLOAD DATA INFILEが実行できない

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 335

nakayash.

score 2

前提・実現したいこと

いつも拝見し勉強させていただいております。
数万行を超えるCSVデータをMYSQL内へ一括登録する為
PHPでサーバーへファイルをアップロード後、
クエリでLOAD DATA LOCAL INFILEを実行させようとしておりますが
DBへ登録が行えません。

エラー等も表示されず解決の糸口が分かりませんのでご相談いたしました。
確認すべき点などございましたらご教授お願いいたします。

発生している問題・エラーメッセージ

PHPにてCSVデータの登録が行えません。
ファイルパス等も間違っておらず、PhpMyadminでクエリを実行したところ
無事に取り込みが行えました、
エラーメッセージ等は特に発生しておりません。

該当のソースコード

//データ一括登録処理
function Insert($Updata){
$err_flg    = false;
$cnt = 1;
$path = '/filepath/'.$Updata;
try{    
if( Empty($this->db) ){
//DBのインスタンスが無い場合は自前で持つ
$this->ConDB();
}
//SQL
$query = "LOAD DATA INFILE '".$path."' INTO TABLE t_sample FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'";

$this->db->stmt = $this->db->dbh->prepare($query);
//実行処理
$this->db->result->tf = $this->db->stmt->execute();

$UpdateResult = $this->db->result->tf;

$this->db->releaseStmt();
$msg = "";
if( $UpdateResult < 1 ){
$err_flg = true;
$msg = "データの取込に失敗しました。\nデータは更新されていません。";
}
}catch( Exception $e ){
echo $e->getMessage();
}
return Array( $err_flg, $msg );
}

試したこと

気になっている点として、$this->db->result->tf が空であることが
$UpdateResultの結果でわかりました。
また、$this->db->stmt->rowCount() で値を確認しようとしましたが0のままでございました。

補足情報(言語/FW/ツール等のバージョンなど)

PHP Version 5.1.6
Mysql version 5.0.77

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+2

とりあえずfile_exists($path)で所在チェックをしてみてください。
またphpから実行しているmysqlの実行ユーザーがfileに対する
権限をもっているか確認する必要もありそうです。

的はずれな確認かもしれませんが、もしpdoで接続しているなら
$stmt = $dbh->prepare($query);
に対するexecuteは
$stmt->execute([]);
で処理しますよね。

また、$stmt->rowCount()を確認してもselect文ではないので
行数を返すことはないと思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/05 17:00

    ご回答くださいましてありがとうございます。
    まず、file_exists($path)で確認したところファイルの存在は確認できました。
    mysqlの実行ユーザーがfileに対する権限をもっているかに関しても
    file_priv の権限を持っていることが確認できました。

    一歩進展がありまして、Apacheのエラーログ内に
    PHP Fatal error: Call to a member function execute() on a non-objectのエラーをみつけました。
    SQLが間違っているのかと思いチェックしましたがPhpMyadminからは問題なく実行できました。

    ご指摘いただいた$stmt->execute([]);に関してですが
    こちらはほかの処理でもうまくいっているので問題点ではないようです。

    他にチェックすべき点がありましたらアドバイスよろしくお願い申し上げます。

    キャンセル

  • 2018/01/05 17:15

    「Call to a member function execute() 」ということは
    executeが使えるオブジェクトではないようですね

    $this->db->stmt->execute(); を発行する前に
    var_dump($this->db->stmt);で確認してみてください

    $this->db->dbhがきちんと得られていないのでしょうかね?
    であればprepareを発行したタイミングで例外が返ると思うんですが
    そちらは通っているっぽいですし・・・

    キャンセル

  • 2018/01/05 18:37

    度々のご回答ありがとうございます。
    var_dump($this->db->stmt); で確認したところ
    objectPDOStatement17 およびクエリの内容が入っておりました。

    的外れなことかもしれませんが
    $query = "LOAD DATA INFILE ~ の箇所をSELECT * などの単純なSQLで実行すると
    きちんと処理を通るところをみると、SQL文が問題なのかもしれません。

    上記でお気になられる点や他にチェックすべき箇所がありましたら
    ご教授くださいませ。

    どうぞよろしくお願いいたします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20304questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。