プロが教えるわが家の防犯対策術!

phpでfgetcsv関数を使用して、取得したデータをDBに登録するという作業を行いたいと考えています。

ですが、CSVでNULLの部分の取得が上手くいっていないようで、DBには「NULL」という文字列で取り込まれてしまいます。

「\N」にすることでNULLとして登録出来るという情報があったので、CSVを修正して「NULL」を「\N」にしてみたのですが、やはり「\N」という文字列として登録されてしまいました。

正常にNULLとして認識させるにはどのような対応を行えば良いのでしょうか。

よろしくおねがいします。

A 回答 (3件)

fgetcsvでは、すべての要素が文字列として取り込まれます。

例外的に「改行のみ」の行だと要素数が1でその値がNULLになりますが、それ以外では(空文字列はあっても)NULLはありません。

>CSVでNULLの部分の取得が上手くいっていない

CSVファイルで「NULLの部分」とはどういうものなのでしょうか。ちょっと想像出来ません。「空文字列」をNULLとして扱いたいということでしょうか?

この回答への補足

>CSVでNULLの部分の取得が上手くいっていない

申し訳ありません、上記の記述が良くありませんでした。
正確には私自分でもどのようにすればNULLとして受け取ってもらえるか分からなかったため、文字列でNULLと入れてみたり、「\N」と入れてみたりと試してみました。

agunuzさんが言うように、すべて文字列となってしまうのであれば、CSVに文字列でNULLと入っていた場合には、実際のNULLに変換するなどして対応するのが良いでしょうか?

補足日時:2013/04/17 16:53
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>fgetcsvでは、すべての要素が文字列として取り込まれます。

上記のことを参考に、CSVに保存する際はNULLを文字列として保存して、DBに保存する際は、SQLを行なう前にNULL文字列から、実際のNULLに変換するという処理を行いました。

実際はもっと良い方法があるのかもしれませんが、今のところこの方法で問題なさそうなので、こちらでいきたいと思います。

ほんとうにありがとうございました。

お礼日時:2013/04/19 11:04

そもそも文字列カラムにNULLを指定する意味がないので


''(長さ0の文字)でよいような気がします。

場合によっては、「NULL」という文字列をデータ投入後
UPDATE テーブル SET カラム=NULL WHERE カラム='NULL'
のような処理でもいいかもしれません。
    • good
    • 0
この回答へのお礼

回答頂きありがとうございました。

DB内でカラムによっては空文字列とNULLを使い分けている部分があったので、NULLはNULL、空文字は空文字として一応分けておきたいとい考えておりました。

今回はDB登録の前にNULLを変換するという形を取りましたが、yambejpさんの記述して頂いた内容も、今後参考にさせて頂きます。

ありがとうございました。

お礼日時:2013/04/19 09:45

fgetcsvで得たデータをどうやってSQLに渡そうとしていますか?

この回答への補足

フレームワークにsymfonyを使用しているので、symfonyのDB登録方法で下記のように行なっています。

if($row[0]){
// 更新
$item = Doctrine::getTable('T_USER')->find($row[0]);
} else {
// 新規
$item = new T_USER();
}
$item->setUserId($row[1]);
$item->setName($row[2]);
$item->save();

※$rowの中には1件分(CSVで1行分)のレコードが入っています。


fgetcsvでファイルを取得した際にはすでに文字列となっているようです。

補足日時:2013/04/17 16:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!