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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

1回答

6615閲覧

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

nakayash.

総合スコア6

PHP

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

0グッド

1クリップ

投稿2018/01/05 07:03

###前提・実現したいこと
いつも拝見し勉強させていただいております。
数万行を超える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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

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

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

投稿2018/01/05 07:26

yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakayash.

2018/01/05 08: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([]);に関してですが こちらはほかの処理でもうまくいっているので問題点ではないようです。 他にチェックすべき点がありましたらアドバイスよろしくお願い申し上げます。
yambejp

2018/01/05 08:15

「Call to a member function execute() 」ということは executeが使えるオブジェクトではないようですね $this->db->stmt->execute(); を発行する前に var_dump($this->db->stmt);で確認してみてください $this->db->dbhがきちんと得られていないのでしょうかね? であればprepareを発行したタイミングで例外が返ると思うんですが そちらは通っているっぽいですし・・・
nakayash.

2018/01/05 09:37

度々のご回答ありがとうございます。 var_dump($this->db->stmt); で確認したところ objectPDOStatement17 およびクエリの内容が入っておりました。 的外れなことかもしれませんが $query = "LOAD DATA INFILE ~ の箇所をSELECT * などの単純なSQLで実行すると きちんと処理を通るところをみると、SQL文が問題なのかもしれません。 上記でお気になられる点や他にチェックすべき箇所がありましたら ご教授くださいませ。 どうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問