こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

phpで取引業者の管理ページを作成していたところ問題が発生しました。

phpで取引業者の管理ページを作成していたところ問題が発生しました。
取引業者で特定の会社のデーターの削除と社名からの検索が出来るようにしたいのですが、データーの配列をふやしたところ削除も検索も出来なくなってしまいました。
データーはCSVを使っております。
(以前簡単なデーターで実験してみた時はできたのですが、)

---sample.csv---
○○社 , 03-1111-2222 , 東京都東京区1-1-1 , http://abc.com , adc@def.jp , 丸山丸男
××社 , 03-1111-3333 , 東京都東京区1-1-2 , http://bcd.com , bcd@efg.jp , 罰山罰男
△△社 , 03-1111-4444 , 東京都東京区1-1-3 , http://cde.com , cde@fgh.jp , 三角三太

--include.php---
function tu_delete($fname,$name){
$file = fopen($fname,'r');
$file2 = fopen("data/temp",'w');
$data = fgetcsv($file,1000);
fputs($file2,implode(',',$data));
while (!feof($file)) {
$data = fgetcsv($file,1000);
$find = mb_convert_encoding($data[0],'UTF-8','SJIS');
if ($data != "" && mb_substr_count($find,$name) == 0){
fputs($file2,("\r\n".implode(",",$data)));
}
}
fputs($file2,"\r\n");
fclose($file);
fclose($file2);
unlink($fname);
rename('data/temp',$fname);
}

function tu_showFindData($fname,$name){
$file = fopen($fname,'r');
$data = fgetcsv($file,1000);
$n = count($data);
echo '<table border=1>';
$data = fgetcsv($file,1000);
while (!feof($file)) {
$data = fgetcsv($file,1000);
$find = mb_convert_encoding($data[0],'UTF-8','SJIS');
if (mb_substr_count($find,$name) != 0){
echo '<tr>';
for ($i = 0; $i < $n;$i++) {
echo '<td>'. mb_convert_encoding($data[$i],'UTF-8','SJIS') . "</td>";
}
}
echo '</tr>';
}
echo '</table>';
fclose ($file);
}

---form.html---
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>form1</title>
</head>
<body>
<form action='find.php' method='GET'>
社名:<input type="text" name="name" />
<input type="submit" value="検索"/>
</form>
</body>
</html>

---delet.html---
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>delet</title>
</head>
<body>
<form action='delet.php' method='GET'>
社名:<input type="text" name="name" />
<input type="submit" value="削除"/>
</form>
</body>
</html>

現在新規登録のみが可能となっています。
文字入力数が限られており必要な部分のコードのみ表示しましたので分かりにくいかもしれませんが宜しくお願いします。

投稿日時 - 2010-09-09 11:05:57

QNo.6169500

困ってます

質問者が選んだベストアンサー

fgetcsvは、内部ローケルを考慮して動作するので、サーバの文字コードがUTF-8やEUCだったりすると、正常に読み込めなくなったりします。
また、fgetcsvは、""で囲まれている文字を読んだり(RFC4180で策定されたCSV形式)結構便利ではあるんですが、なぜか、円マークをエスケープ文字として読んで、文字化け起こしたりと結構面倒です。
特に、SJISですと、「表」とか「名」とかで文字化けると思います(5C問題とかで検索してみてください)


質問者さんが作ったCSVの仕様が、
「必ず一行が1レコード」というものであるならば、普通にfgets関数で読んできてexplodeしたほうがよいと思います。

<?php
while (!feof($file)) {
$data = fgets($file,1000); //普通に一行読み込み
$data = rtrim($data); //最後の改行をとりさる
$data = explode(",", $data); //カンマで文字列を配列に分解

$find = mb_convert_encoding($data[0],'UTF-8','SJIS');
if ($data != "" && mb_substr_count($find,$name) == 0){
fputs($file2,("\r\n".implode(",",$data)));
}
}


?>

投稿日時 - 2010-09-11 02:03:20

お礼

なかなか時間がとれず返信が遅れてすみませんでした。

$data = rtrim($data); //最後の改行をとりさる
$data = explode(",", $data); //カンマで文字列を配列に分解

if ($data != "" && mb_substr_count($find,$name) == 0){
fputs($file2,("\r\n".implode(",",$data)));

上記の部分をコードを加えたところまだ正常に動作しておりませんが、色々と試してみてやはりうまくいかなければまた質問させて頂きます。

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

投稿日時 - 2010-09-16 01:50:22

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(1)