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

解決済みの質問

PHP データの削除と個々の時間を書きだす

PHPでプログラムを作成したいのですが、ninusyo.phpというphpプログラムからrireki.dataデータファイルを読み込みます。
//問題はここから。
ログインした個々の時間を書きだして、ログアウトボタンを押すとメールアドレスや名前などが消える。というプログラムが出来ません。

ヒントでも構いませんから、教えて頂けると嬉しいです。
以下、ソースです。なお、DBではありません。
<?php
//受け渡しデータ
//ml:メールアドレスのkey,メールアドレスは半角英数字24桁
//name:名前のkey,名前は半角英数字9桁
//pass(メールアドレスと同じ):パスワードのkey,半角英数字24桁
//mode:書き込みのkey, $modeとして使用。

//パラメータの取得
$ml=trim($_REQUEST['ml']);
$name=trim($_REQUEST['name']);
$pass=trim($_REQUEST['pass']);
$mode=trim($_REQUEST['mode']);
//データの入力
print '<form action="ninsyo.php" method="post">';
print ' 名    前 :<input type="text" size="10" name="name" value=" "><br>';
print '  パスワード :<input type="text" size="25" name="pass" value=" "><br>';
print 'メールアドレス:<input type="text" size="25" name="ml" value=" "><br>';
print'         <input type="submit" value="ログイン"><br>';
print'<input type="hidden" name="mode" value="write">';
print'</form>';
//終了 データの入力
//ファイルの追加
if($ml != null){
$fp=fopen("./rireki.data","at");
//$today = date("Y/m/d H:i:s");
fputs($fp,"\n".$ml.",".$name.",".$pass.",".$today);
fclose($fp);
}
//終了 ファイルの追加
}
//終了 エラー表示
// 削除データの入力
print '<form action="ninsyo.php" method="post">';
print '          <input type="text" size="10" name="sakujo">';
print '<input type="submit" value="名前deログアウト">';
print '<input type="hidden" name="mode" value="write">';
print '</form>';
// 終了 削除データの入力
// ファイルの読み込み
$fp=fopen("./rireki.data","r");
while(!feof($fp)){
$tmp_a[]=mb_ereg_replace("\n","",fgets($fp));
}fclose($fp);
$num_data=count($tmp_a);
for($i=0;$i<$num_data;$i++){
$mail_a= explode(",", $tmp_a[$i]);
for($j=0;$j<4;$j++){
$namae_a[$i][$j]=$mail_a[$j];
}
}
// 終了 ファイルの読み込み
// データのソート select_sort
// 削除データの削除
if($sakujo!=null){
for($i=0; $i<$num_data; $i++){
if($namae_a[$i][0]==$sakujo){
$namae_a[$i][0]=$namae_a[$num_data-1][0];
$namae_a[$i][1]=$namae_a[$num_data-1][1];
$namae_a[$i][2]=$namae_a[$num_data-1][2];
$namae_a[$num_data-1][0]="";
$namae_a[$num_data-1][1]="";
$namae_a[$num_data-1][2]="";
break;
}
}
}
// 終了 削除データの削除

宜しくお願いします。

投稿日時 - 2011-03-03 15:30:28

QNo.6564799

すぐに回答ほしいです

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

次のような方法でデータ削除するようにプログラムを作っては如何でしょうか?

【処理1】 履歴ファイル(rireki.data)を読み込みでオープン

【処理2】 対象データ削除後のファイル(rireki.tmp)を書き込みでオープン

【処理3】 履歴ファイル(rireki.data)のデータを1行読み込む。(データがない場合は処理6へ)

【処理4】 削除対象の名前を持つデータ行であれば次の行データを参照する(処理3へ)

【処理5】 削除対象の名前を持つデータ行でなければ
       対象データ削除後ファイル(rireki.tmp)に行データを書き込む(処理3へ)

【処理6】 履歴ファイル(rireki.data)を削除

【処理7】 対象データ削除後のファイル(rireki.tmp)を履歴ファイル(rireki.data)のファイル名称に変更



以下は実装サンプルになります。ご参考までに。

<?php
//受け渡しデータ
//ml:メールアドレスのkey,メールアドレスは半角英数字24桁
//name:名前のkey,名前は半角英数字9桁
//pass(メールアドレスと同じ):パスワードのkey,半角英数字24桁

//パラメータの取得
$ml=trim($_REQUEST['ml']);
$name=trim($_REQUEST['name']);
$pass=trim($_REQUEST['pass']);
$sakujo=trim($_REQUEST["sakujo"]);

if (trim($ml)) {

$fp=fopen("./rireki.data","at");
$today = date("Y/m/d H:i:s");
fputcsv($fp, array($ml, $name, $pass, $today), ",", "\"");
fclose($fp);

} else if (trim($sakujo)) {

//対象データ削除後の履歴ファイル
$newfp = fopen("./rireki.tmp", "a");

//履歴ファイル
$fp=fopen("./rireki.data","r");

while(($data = fgetcsv($fp)) !== FALSE) {

if ($data[1] == $sakujo) {
continue;
}

//対象データ削除後の履歴ファイルに書き込み
fputcsv($newfp, $data);
}
fclose($fp);
fclose($newfp);

//履歴ファイル削除
unlink("./rireki.data");

//対象データ削除後の履歴ファイルを履歴ファイルに名前変更
rename("./rireki.tmp", "./rireki.data");
}
?>
<html>
<head>
<title>QNo6564799</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<form action="ninsyo.php" method="post">
名 前:<input type="text" size="10" name="name" value=""><br>
パスワード :<input type="text" size="25" name="pass" value=""><br>
メールアドレス:<input type="text" size="25" name="ml" value=""><br>
<input type="submit" value="ログイン"><br>
</form>

<form action="ninsyo.php" method="post">
<input type="text" size="10" name="sakujo">
<input type="submit" value="名前deログアウト">
</form>

</html>

投稿日時 - 2011-03-03 23:50:50

お礼

回答ありがとうございます。
参考にさせて頂きました。

#1さん、お礼が遅くなってしまい、申し訳ありません。

rename("./rireki.tmp", "./rireki.data");
ここの所で、Warning: rename(./rireki.tmp,./rireki.data) [function.rename]: Permission denied in のように表示されてしまいます。
パーミッションがrireki.tmpとrireki.data共に777です。

インターネットを使い、調べましたが良く分からない状態です。
ワーニングを表示させないようにするには、どのようにすれば良いのか
分かる方がいましたら、教えて頂けると嬉しいです。

投稿日時 - 2011-03-18 14:16:55

ANo.1

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

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

回答(1)

あなたにオススメの質問