• ベストアンサー

データベースに削除機能を追加しようと思ったのですがうまく削除されなく困っています

データベースの出入力は出来たのですが 新たに削除機能を追加しようと思っています。 私的にはこのようなイメージでつくったつもりなのですが・・・ -------------------------------------- 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>

  • PHP
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • wp_
  • ベストアンサー率54% (132/242)
回答No.1

// 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'); } 私だったらこうします。 極大なファイルだった場合は通用しませんが。 もしかしたらもっといい方法があるかもしれません。 ファイルが開けなかった場合や削除・リネームが出来なかった場合の例外などは考慮してません。 予期せぬところでファイル破壊される可能性が無きにしも非ずなので その辺のコードは追記してください。

maxves
質問者

お礼

このサンプルプログラムをアルゴリズムを解析するのに時間がかかってしまい返事が遅れてしまいました。 無事解決致しました。 今のところ色々テストしていますが不具合などが出ていないのでこのプログラムを流用させて頂きます。 この度は、誠にありがとうございました。

その他の回答 (1)

  • swqamy
  • ベストアンサー率37% (11/29)
回答No.2

本当に削除してもいいのですか? 表示さえしなければ良いと思うんですが。 こんな感じです。 ---------------------------------------------- [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,メロン, --------------------------------------------- こんな感じになったりとまだ修正点はいくつかありますが・・・。

maxves
質問者

お礼

現在、データベースの基礎を勉強していましたので、まずは、削除からと考えていました。 ですが、このサンプルプログラムはその他の部分でも大いに参考になるので、解析し今後に繋がるように努力したいと思います。 ご丁寧な対応、誠にありがとうございます。

関連するQ&A

  • エクセルでヘルプ・・・・

    例えばA列に下記のような名前が並んでいたとします。 この中で同じ文字列のセルを含む行を全て削除する方法です。 下記の例では 5,6,7,8,12,13,14 の行を削除するかたちになります。 A     B     C 1 りんご 2 トマト 3 ブドウ 4 バナナ 5 サクランボ 6 サクランボ 7 メロン 8 メロン 9 みかん 10 バナナ 11 ナシ 12 スイカ 13 スイカ 14 スイカ 実際は5000~6000行データの作業になる為、手作業では大変です。 これがもしエクセルの機能で出来るならとても助かります。 宜しくお願いいたします。

  • カンマ区切りのCSVファイルから""を削除したい

    初めて質問いたします 以下のような形式のCSVファイルがあります 例) 品名,数量,単価,金額 "りんご",1,150,150 "バナナ",10,200,2000 "メロン","1,000","2,000","2,000,000" 上記のように、品名にはダブルクォーテションがつき、 数量、単価、金額については桁区切りのカンマが発生する場合、ダブルクォーテーションで囲まれています 上記のようなデータを りんご,1,150,150 バナナ,10,200,2000 メロン,1000,2000,2000000 のように別ファイルへ出力するにはどのようにすればよいでしょうか? プログラムでの処理で、WSHを使ったものを教えていただけますと、幸いです よろしくお願いいたします

  • 配列の差し替えについて

    配列について勉強をしています。 データを差し替えるプログラムを考えていて色々試してみたのですが 下記のような感じでうまく機能しません。 ・指定した箇所に追加書き込みになってしまう。 ・指定箇所が削除され別の箇所に追加書き込みになってしう。 ・まったく機能しなくなったりと困っています。 こんな感じのイメージ結果にしたいのですが・・・ -------------------------------------- dat.csvの中みが下記とします。 サンプル01 サンプル02 サンプル03 サンプル04 ↓↓↓↓↓実行結果↓↓↓↓↓ サンプル01 サンプル02 サンプル05 サンプル04 -------------------------------------- ソース -------------------------------------- 外部からの呼び出しで値が「サンプル03」です。 $edit_data=$_GET["sid"]; $test = "サンプル05"; if($_POST["regist"]){ $Data=file("data.csv"); for($i=0; $i<sizeof($Data);$i++){ $line=explode(",",$Data[$i]); if($edit_data==$line[1]){ array_splice($Data,$i,1,$test); $fp=fopen("data.csv","w"); flock($fp, LOCK_EX); foreach($Data as $item)fputs($fp,$item); fclose($fp); } } } -------------------------------------- まず、外部から「サンプル03」という値を呼び出し $edit_data==$line[1]でCSVデータと照合させました。 一致したらその箇所を「array_splice」で置換えるようにしているはずなんですが・・・ なんともうまく機能しません。。。。 どなたか、知恵を貸していただければと思い投稿させて頂きました。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 【EXCEL2000】2つのリストの合計を出すには?

    リストA リンゴ 3 みかん 5 バナナ 2 スイカ 3 リストB りんご 2 メロン 4 バナナ 3 いちご 2 ↑のような2つのリストがあるとして、 リストC りんご 5 みかん 5 バナナ 5 スイカ 3 メロン 4 いちご 2 リストA・Bの合計がリストCのようにするにはどのような関数を使えばいいかお解りになる方教えてください。 判りづらい質問で申し訳ありません。m(_ _)m ※品名と数量は別セルです。

  • エクセルの置換の事で?

    エクセルの事で質問です。 マクロを使って置換させたいと考えています。(エクセル2003使用) 例 A1 みかん  B1 私が好きなのは***です。彼は***は嫌いです。 A2 りんご  B2 私が好きなのは***です。彼は***は嫌いです。 A3 メロン  B3 私が好きなのは***です。彼は***は嫌いです。 A4 スイカ  B4 私が好きなのは***です。彼は***は嫌いです。 A5 バナナ  B5 私が好きなのは***です。彼は***は嫌いです。 これを A1 みかん  B1 私が好きなのはみかんです。彼はみかんは嫌いです。 A2 りんご  B2 私が好きなのはりんごです。彼はりんごは嫌いです。 A3 メロン  B3 私が好きなのはメロンです。彼はメロンは嫌いです。 A4 スイカ  B4 私が好きなのはスイカです。彼はスイカは嫌いです。 A5 バナナ  B5 私が好きなのはバナナです。彼はバナナは嫌いです。 このようにボタンひとつで置換したいと考えています。 今までやって失敗した事は ツール→マクロ→新しいマクロの記録で手動やってみたのですがどうしても出来ませんでした。 すいませんが、どなかた教えていただけないでしょうか? よろしくお願いいたします。

  • テキストデータから指定行の削除

    phpでサイトを作っています。 テキストデータを一行ずつ表示させ、指定した行を削除したいのですが、どうすればいいのでしょうか? -- data.txt -- aaa,data1, bbb,data1, ccc,data1, ddd,data1, -- php -- <?php $del=$_POST['del_no']; if($del!=""){ $data_all = file("data.txt"); for($i=0;$i<count($data_all);$i++){ $data_array = explode(",",$data_all[$i]); if($data_array[0]!=$del){//削除データ以外を再書き込み $txt="$data_array[0],$data_array[1],\n"; $fp = fopen("data.txt", "w"); flock($fp,1); foreach ($txt as $line) {// 1行ずつファイルへ書き込み? fwrite($fp, $line); } fclose($fp); break; } } } ?> <b>data list</b> <? $data_all = file("data.txt"); for($i=0;$i<count($data_all);$i++){ $data_array = explode(",",$data_all[$i]); echo "$data_array [0]<br />"; echo "<form method=\"post\">"; <input type=\"hidden\"name=\"del_no\" value=\"$data_array[0]\" />";//削除するデータをPOST echo "<input type=\"submit\" value=\"削除\" />"; echo "</form>"; } ?> こうすると、テキストデータが白紙になってしまいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列の中身を入れ替える方法

    非常に初心者的な問題だとは思いますがよろしくお願いします Array ( [0] => みかん [1] => りんご [2] => バナナ [3] => キウイ [4] => メロン [5] => スイカ) 上記のような配列があったとしまして、 [2] => バナナ [3] => キウイ [4] => メロン を、 [2] => イチゴ [3] => もも [4] => さば に変更したいのですが、 どのようにすればよいでしょうか・・・ かれこれ2日ほどやっているのですがわかりません・・・ よろしくお願いします。

    • 締切済み
    • PHP
  • エクセル2010で 項目の抜き出しをしたい

    エクセル2010で 項目の抜き出しをしたいです。 たとえば、A列に りんご りんご バナナ トマト りんご バナナ みかん トマト メロン バナナ リンゴ みかん ぶどう とデータが入っているとき、これらのデータには、 トマト バナナ りんご リンゴ みかん メロン ぶどう という種類のデータが入っているということを簡単に表示する方法が知りたいです。 どうぞよろしくお願いします。

  • 掲示板の記事の削除

    データの削除の覧でのソースについての質問です。 記事が削除されません。原因がわからないので困ってます。 答えをズバリ書いてくれたり、一からでもいいのでこっちのほうが簡単にできるよってのでも良いです。よろしくお願いします <HTML> <HEAD> <META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=sjis"> <FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST" > <TITLE>削除操作</TITLE> </HEAD> <BODY> <BR> <FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST"> <INPUT TYPE ="text" NAME="comment" SIZE="40"><BR> 削除キー<INPUT TYPE="password" NAME="pass" SIZE="10"><BR> <INPUT TYPE ="submit" NAME="regist" VALUE="ボタン"><BR> </FORM> <BR><BR> </CENTER> </BODY> </HTML> <? $data_file = "test01.txt"; if(!isset($code)) { $code = $_POST['code']; } if(!isset($comment)) { $comment = $_POST['comment']; } if(!isset($regit)) { $regist = $_POST['regist']; } if(!isset($delete)) { $delete = $_POST['delete']; } if(!isset($delcode)) { $delcode = $_POST['delcode']; } if(!isset($password)){ $password = $_POST['password']; } if(!isset($pass)) { $pass = $_POST['pass']; } //データの削除 if($delete){ if(($delcode != "") && ($password != "")){ $delfile = file($data_file); $fp = fopen($data_file, "w"); for($i=0; $i<count($delfile); $i++){ list($dcode,$dcomment,$dpass) = split( ",", $delfile[$i]); if ($password == $dpass){ if ($delcode == $dcode) { $delfile[$i] = ""; } } } fputs($fp,$delfile[$i]); fclose($fp); } unset($delfile); } //データの書き込み if($regist){ if(($pass != "") && ($comment != "")){ $code = time(); //アクセス時の秒数 $imput_msg = ( $code .','. $comment .','.$pass); //ファイル操作 $fp = fopen($data_file,"a+"); rewind($fp); fputs($fp,"$imput_msg\n"); fclose($fp); } } //出力処理 $msg = file($data_file); for($i = 0; $i < count($msg); $i++){ list($code2,$comment2,$pass2) = split( ",", $msg[$i]); print "<form method=\"POST\" action=\"$PHP_SELF\">"; print "<input type=\"checkbox\" name=\"delcode\" value=\"$code2\"><br>\n"; print "code2: $code2<br>"; print "comment:$comment2<br>"; print "pass: $pass2<br>"; print " 削除用パスワード:<input type=password size=10 name=password>"; print " <input type=\"submit\" name=\"delete\" value=\"削除\">\n"; print "</form>\n"; } unset($msg); ?>

    • ベストアンサー
    • PHP
  • Excelで同一文字列を検出して隣りのセルに返すなどしたい

    Excelのシートの1列に文字列がずらっと並んでいるとします。本来は「いちご、りんご、ばなな、みかん、すいか、めろん」と、ダブリがないはずの項目ばかりが入力されているはずでしたが、しかし実際は「いちご、りんご、ばなな、りんご、みかん、いちご、すいか、めろん」という風に、いくつかの項目にダブリがあるとします。そこで、そのダブリを発見し、何がダブっているのか手早く知る方法があれば教えてください。関数、もしくはマクロをご存知の方、お願いいたします。