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

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

ただいまの
回答率

89.20%

phpのzip関数でDB登録したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 743

double16k

score 16

失礼しました、コードを記入いたします。
PHPでzipファイルをアップロード展開 -> csv読み込み -> DB登録のシステムを作成しています。

//ファイルパス
$path = $tmp_name;

//zipファイルをオープン
$zip = zip_open($path);

if( $zip ){

  while( $entry = zip_read($zip) ) {

    $csv_file = basename(zip_entry_name($entry));

    //zip内のファイルをオープン
    zip_entry_open($zip, $entry, "r");

    //オープンしたファイルを読み込む
    $entry_content = zip_entry_read($entry, zip_entry_filesize($entry));
    $entry_content = mb_convert_encoding($entry_content, "UTF-8", "SJIS-win");

    zip_entry_close($entry);
  }            
}
zip_close($zip);

コピーして修正していますので、構文の書き間違いがあるかもしれませんがエラーはでていません。
4つcsvファイルをzipで圧縮していますが、4つともweb上では見えています。
(テスト1,テスト2,テスト3)
(テストa,テストb,テストc)
(テストq,テストd,テストf)
(テストs,テストw,テストz)
のような形です。

$entry_content は、
(テスト1,テスト2,テスト3)のような形で取得されます。

この $entry_content のデータをDBに登録したいのですが、
mysqlでinsert intoする場合、データを('テスト1','テスト2','テスト3')のようにする必要があると思います。
はじめは、explode関数を使い配列にしてから「'」or「"」を付加使用と思ったのですが、
csvファイルのセルに「,」が含まれている場合、
$entry_contentの中は、("テス,ト1",テスト2,テスト3)
のような「"テス,ト1"」というデータが返ってきます。
この場合explodeを使ってもきちんと登録できないため、どのようにすればうまくDBに登録できるかアドバイスをいただけないでしょうか。

--------------------追記--------------------
Kosuke_Shibuya 様からのDBの登録の仕方について
私の質問が悪かったので、追記いたします。
csvのセルに「,」がなければ("テス,ト1",テスト2,テスト3)のように取得されず
(テスト1,テスト2,テスト3)のようになるので、
explodeで配列にし「'」をつけて登録はできます。

実際セルに「,」がなければ
insert into table (test1,test2,test3) VALUE ('テスト1','テスト2','テスト3');
で登録可能です。

質問したいのは、csvのセルに「,」が付いていた場合("テス,ト1",テスト2,テスト3)になるので
explodeで配列にすると
array[0] = "テス
array[1] = ト1"
となってしまうので、これでは登録ができません。
csvのセルに「,」があっても
array[0] = テスト1 にする方法はないでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/07/22 12:48

    困っているのはMySQLへの登録の仕方ですよね?該当部分のコードを提示していただかないと、指摘のしようがありません。

    キャンセル

  • aaklakakakka

    2017/07/22 13:11

    レコードの区切り文字列ではないカンマはエスケープされていたりするとか、なんらかの手段で区切り文字列としてのカンマとそうではないカンマの区別可能な何かがありますか?

    キャンセル

  • double16k

    2017/07/22 13:32

    csvのセルに「,」があった場合("テス,ト1",テスト2,テスト3)が、返ってきますが、やはり正規表現かなにかでやるしかないのでしょうか。

    キャンセル

回答 1

checkベストアンサー

+1

$a = '"テス,ト1",テスト2,テスト3';
$ret = str_getcsv($a, ",", '"');

print_r($ret);

結果
Array
(
    [0] => テス,ト1
    [1] => テスト2
    [2] => テスト3
)


explodeじゃなくて、専用の関数を使いましょう。str_getcsvです。

それにしても質問のタイトルがおかしいですね。

追記

もしかしてデータ自体が("テス,ト1",テスト2,テスト3)って形なんですかね?
だとすると、

$a = '("テス,ト1",テスト2,テスト3)';
$a = trim($a, '()');

っていう風に括弧を取ってやればいいですね。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/07/22 14:41

    質問が悪く申し訳ありません、まさに一番目のような形です。
    ありがとうございます!m(__)m

    キャンセル

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

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