- ベストアンサー
PHPからMySQL CSVファイルのアップロード
- XAMPP(1.6)を使用してPHPからMySQLにCSVファイルをアップロードしようとしています。しかし、54MBのCSVファイルをアップロードする際にタイムアウトエラーが発生してしまいます。
- タイムアウト時間やphp.iniの設定変更を試しても解決せず、そのためLOADコマンドを使用しようとしましたが、構文エラーが発生してしまいます。
- 「unexpected T_VARIABLE」というエラーメッセージが表示され、24行目付近に構文エラーがあることがわかります。正しいCSVファイルの読み込み方法を教えていただきたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>$sql ="load data infile '$fl' into tabale $pol fields terminated by ',' enclosed by '"' lines terminated by '\r\n';" enclodes by のあとで、二重引用符の中で二重引用符が出てきてしまいますよね?キチンとescapeしてください。 http://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.double $sql ="load data infile '$fl' into tabale $pol fields terminated by ',' enclosed by '\"' lines terminated by '\r\n';" というか54MBのファイルをhttpでアップロードというのはいくらなんでも無謀な気はします。とりあえずテストは少量のデータで行ってみてください(問題の切り分けが出来なくなりそうなので・・)。
その他の回答 (2)
- shimix
- ベストアンサー率54% (865/1590)
loadにするにしても、「アップロードして所定の名前で保存」までで一度htmlを返して、ボタンか何かで「loadのSQL文を投げる」ように処理を分けた方がインタフェイスとしてはいいと思います。アップロードのPOSTのまま待つと余計に待ちが長く感じるので。 同様に、insertでも途中経過を(xxx件追加しましたを何件かおきに)表示してやればいいように思います。出力制御系の関数で出来ます。 http://d.hatena.ne.jp/shimooka/20070426/1177571621 ob_flushする前に(ブラウザがバッファしないように)空白をたくさんprintしておくのが技ですかね(汗
補足
shimixさん ありがとうございます。 ob_flush なものがあるんですね。 先ほどのものも登録に3分かかり、その後DBを除いたところ、なぜか93件の漏れが・・・ コマンドプロンプトからだと漏れないんですが、色々と調べる箇所が あるようです。 DB登録後に計算式をあてはめて、csvとして吐き出したいのですが、まだまだ先は流そうです。
- shimix
- ベストアンサー率54% (865/1590)
>10件ほどのテストファイルで試してみましたが、失敗してしまいました... >他に原因があるようですので調べてみます。 とりあえずは$sqlにセットした内容をprint $sqlで確認して、同じような内容がSQL文単独で実行可能かどうかチェックしてくださいね。私は投げたことがないSQL文のときは、必ずphpMyAdminなどで投げてみてからphpに組み込みます(小心者なので・・)。 54MBは・・ファイルの転送だけFTPにするとか、HTTPのままとしてもZIPにして(テキストなので劇的に減るはず)でアップロードしてサーバ側で展開して使うとか、何か考えたほうがいいでしょうねぇ。
お礼
shimixさん 度々ありがとうございます。 配列の状態でタイムアウトを3分にしたところ、登録はできました。。。が3分は実用レベル的に問題があるので、やはりloadで色々試してみます。
お礼
shimixさん ありがとうございます。 10件ほどのテストファイルで試してみましたが、失敗してしまいました...他に原因があるようですので調べてみます。 コマンドプロンプトなどをまったく触ったことのない人間がデータを触るのでhttpからと思ったのですが。。。