- ベストアンサー
データベースに削除機能を追加しようと思ったのですがうまく削除されなく困っています
データベースの出入力は出来たのですが 新たに削除機能を追加しようと思っています。 私的にはこのようなイメージでつくったつもりなのですが・・・ -------------------------------------- dat.csvの中みが下記とします。 りんご バナナ スイカ メロン 削除フォームにバナナを打ち込み実行するとバナナが削除され繰上げされる。 りんご スイカ メロン -------------------------------------- 判る範囲で組んでみたのですが 全て削除してしまったり、上から順番に削除してしまったり、削除機能自体が機能しなくなったりと 困っています。 何方か知恵を貸して頂ければと思います。 宜しくお願いいたします。 ■現状のソース <?php if($_POST["dell"]){ $dele = $_POST["dele_ad"]; $Data=file("dat.csv"); for($i=0;$i<sizeof($Data);$i++){ $dele_ad = explode(",",$Data[$i]); if($dele_ad == $dele ){ array_splice($dele_ad,$i,1); } } $fp=fopen("dat.csv","w"); flock($fp, LOCK_EX); foreach($Data as $line)fputs($fp,$line); fclose($fp); print "削除しました"; } ?> <form action="<?=$_SERVER[ "PHP_SELF" ]?>" method="POST"> <input name="dele_ad" type="text" value="" size="40"> <input type="submit" name="dell" value="削除"> </form>
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
// fopen $fhn_read = fopen('dat.csv','r'); $fhn_write = fopen('dat.csv.tmp','w'); // fhn_readを行ごとに回す while(! feof($fhn_read)) { $data = fgets($fhn_read,1000); // 削除該当データの場合はスルー if(trim($data) == $_POST['dele_ad']) { } // それ以外はfhn_writeへ出力 else { fwrite($fhn_write,$data); } } // fclose fclose($fhn_write); fclose($fhn_read); // 削除済みのデータを実データへ移動 if(file_exists('dat.csv.tmp')) { unlink('dat.csv'); rename('dat.csv.tmp','dat.csv'); } 私だったらこうします。 極大なファイルだった場合は通用しませんが。 もしかしたらもっといい方法があるかもしれません。 ファイルが開けなかった場合や削除・リネームが出来なかった場合の例外などは考慮してません。 予期せぬところでファイル破壊される可能性が無きにしも非ずなので その辺のコードは追記してください。
その他の回答 (1)
- swqamy
- ベストアンサー率37% (11/29)
本当に削除してもいいのですか? 表示さえしなければ良いと思うんですが。 こんな感じです。 ---------------------------------------------- [dat.csv] 0,りんご 0,バナナ 0,スイカ 0,メロン --------------------------------------------- [php] <?php if($_POST["dell"]){ $dele=$_POST["dele_ad"]; if($dele!=""&&$dele!=Null){ $row = 1; $NArray = Array(); $Line = ""; $handle = fopen("dat.csv","r"); while(($data = fgetcsv($handle,1000,",")) !== FALSE){ $num = count($data); for($c = 0;$c < $num;$c++){ //既に削除されているデータは読み込まない if($data[0] != "1"){ if($data[$c] == $dele){ //削除する項目に「1」(削除フラグ)を追加 $data[0] = "1"; } } } for($c = 0;$c < $num;$c++){ if($c < $num){ $Line = $Line.$data[$c].","; }else{ $Line = $Line.$data[$c]; } } /*============================= 1行づつ配列に格納 イメージ) $NArray[0]) 0,りんご $NArray[1]) 1,バナナ $NArray[2]) 0,スイカ $NArray[3]) 0,メロン ===============================*/ $NArray[$row]=$Line; $Line = ""; $row++; } fclose($handle); //書込みのため再度開く $handle = fopen("dat.csv","w"); foreach($NArray as $line){ //1行づつ取り出して書込み fputcsv($handle,split(',',$line)); } fclose($handle); } //再表示 $handle = fopen("dat.csv","r"); while(($data = fgetcsv($handle,1000,",")) !== FALSE){ $num = count($data); if($data[0]!="1"){ for($c = 1;$c < $num;$c++){ if($c < $num){ print $data[$c]." "; }else{ print $data[$c]; } } print "<br>\n"; } } fclose($handle); }else{ //画面に表示 $handle = fopen("dat.csv","r"); while(($data = fgetcsv($handle,1000,",")) !== FALSE){ $num = count($data); if($data[0]!="1"){ for($c = 1;$c < $num;$c++){ if($c < $num){ print $data[$c]." "; }else{ print $data[$c]; } } print "<br>\n"; } } fclose($handle); } ?> <form action="<?=$_SERVER['PHP_SELF']?>"method="POST"> <input name="dele_ad"type="text"value=""size="40"> <input type="submit"name="dell"value="削除"> </form> --------------------------------------------- とこんな感じではどうでしょうか? まあ、実行するとCSVの中身が --------------------------------------------- 0,りんご, 1,バナナ, 0,スイカ, 0,メロン, --------------------------------------------- こんな感じになったりとまだ修正点はいくつかありますが・・・。
お礼
現在、データベースの基礎を勉強していましたので、まずは、削除からと考えていました。 ですが、このサンプルプログラムはその他の部分でも大いに参考になるので、解析し今後に繋がるように努力したいと思います。 ご丁寧な対応、誠にありがとうございます。
お礼
このサンプルプログラムをアルゴリズムを解析するのに時間がかかってしまい返事が遅れてしまいました。 無事解決致しました。 今のところ色々テストしていますが不具合などが出ていないのでこのプログラムを流用させて頂きます。 この度は、誠にありがとうございました。