プロが教える店舗&オフィスのセキュリティ対策術

PHPで掲示板の機能の一つである論理削除機能を作成しようと思っています。削除キーに削除パスワードを入力,投稿番号を指示したときに投稿者の記事を削除(物理削除ではありません)するようにしたいのです。スクリプトの一部を記述します。全文は補足に記述させていただきます。削除パスワードの送り方、そのパスワードかを確認、投稿番号の指示の仕方などお教えいただけないでしょうか?
流れ的には記事を書くときに、削除キーに削除パスワードを入力、
投稿を送信したあとに、投稿番号を指示して削除キーに入力した
削除パスワードを入力、削除ボタンを押して投稿を削除としたいのです。

$data = file("data.txt");

$i = 1;
foreach($data as $value){

$view = explode("\t", $value);
list($name, $mail, $body, $dt) = explode("\t",$value);


if( $i < 11 ){

if($mail== ""){

# 削除ボタンが押されたら
if($submit =="削除"){
$submit = $_POST["delete"];
}



#このパスワードなら
if($_delkey == "0123456789"){
$_POST["num"];
}

if ( $num == $view[3] && $pass == "0123456789"){

}


echo "お名前:$view[0]$view[3]<br>";
echo "本文:$view[2]<br>";
echo '<hr size="1" width="80%"><br>';

} else {

echo "お名前:<a href=\"mailto:$mail\">$view[0]</a>$view[3]<br>";

echo "本文:$view[2]<br>";
echo '<hr size="1" width="80%"><br>';

}



} $i++;
}

A 回答 (2件)

手順を説明します。



1、投稿時にDELETEキーを送る。

>削除キー <input type="password" name="delkey" size=8>(記事の削除用。英数字で8文字以内)
としているので問題なし。
英数字以外や最大文字数以上、もしくは削除キーなしが送られてきたときの処理とかを考えなくてはいけませんが、その辺は適当に。


2、データを保存する

>fwrite($file, "$name\t$mail\t$body\t$dt\n\t\t$flag=1".implode("", $data));
ここで記録をしているようですが、ココにDELキーや理論削除フラグの項目を追加します。
あと$dt(記事番号?)のところに \n が入っていますが、これだと正常に動きません。

3、記事表示

記事表示と削除は同時にしてもいいですが、分かりにくいので分けたほうがいいかもしれません。
foreach($data as $value){
の中に同じ
foreach($data as $value){
が入っているので、不具合が起こる場合があります。
$valueを変えたほうがいいと思います。

4、削除する。

できれば投稿時のFORMと分けた方がいいです。
できないわけではありませんが、処理が混乱するので。
    • good
    • 0
この回答へのお礼

ありがとうございます。なんとか削除機能を実装することができました。

お礼日時:2006/06/22 23:22

>削除パスワードの送り方、そのパスワードかを確認、投稿番号の指示の仕方などお教えいただけないでしょうか?



削除機能をつけたいけど、やり方が分からないのでしょうか。
分かるところはどこですか?


$view = explode("\t", $value);
list($name, $mail, $body, $dt) = explode("\t",$value);

で記録されたデータを分割しているのですが、パスワードのデータはありませんね。
ここらへんをいじる。
例えば
list($name, $mail, $body, $dt, $pass) = explode("\t",$value);
として、

if($_delkey == $pass){
$i = 1;
foreach($data as $value){

$view = explode("\t", $value);
list($name, $mail, $body, $dt ,$del_flag) = explode("\t",$value);
if ($_POST["num"] == $dt) {
$value[$i] = "$name\t$mail\t$body\t$dt\t1\n";
}
$i++;
}

とか。
データの型は分からないので予想ですが。

ちなみに、削除パスワードの送り方は、タダ単にFORMを作って送ればいいだけです。

この回答への補足

わかるところは「そのパスワードかを確認」というくらいです。
それも、正解なのかは自信がありませんが。
削除パスワードの送り方はechoとして他のものといっしょに送信しています。
hiddenには投稿番号とその照合などで使おうと思っています。

まだ途中ですが、このような感じで作成しています。
<?php
$hidden = $_POST["NO"];
$text = $_POST["delcode"];
$reset = $_POST["delete"];
$sub = $_POST["DELETE"];
$submit = $_POST["SUBMIT"];
$password =$_POST["delkey"];


if($submit == "送信"){
$num = $_POST["num"];
$name = $_POST["NAME"];
$mail = $_POST["MAIL"];
$body = $_POST["BODY"];


if($name== "" or $body == ""){
header("Location:subject03-02false.php");

exit;
}



#HTML無効
$name = htmlspecialchars("$name");
$mail = htmlspecialchars("$mail");
$body = htmlspecialchars("$body");

#クォートを取り除く
if(get_magic_quotes_gpc()){$neme = stripslashes("$name");}
if(get_magic_quotes_gpc()){$mail = stripslashes("$mail");}
if(get_magic_quotes_gpc()){$body = stripslashes("$body");}


#本文を1000文字まで表示
$body = substr($body, 0, 1000);


$body = str_replace("\r\n","<br>", $body);
$body = str_replace("\t", " ", $body);


$dt = date("y/m/d H:i:s");
$N = "NO";
$data = file("data.txt");

$count = count ($data);
$num = $count++;


#array_shift($data);

$file = fopen("data.txt", "w");
fwrite($file, "$name\t$mail\t$body\t$dt\n\t\t$flag=1".implode("", $data));

fclose($file);

header("Location:subject03-02.php");
exit;
}

# ノーキャッシュヘッダー
header("Expires: Mon,26 Jul 1997 05:00:00 GMT");
header("Last-Modified:".gmdate("D,d M Y H:is")."GMT");
header("Cache-Control: no-cache,must-revaildate");
header("Prodma:no-cache");



echo '
subject03-BBS
<h1>subject-BBS</h1>

<form method="post" action="subject03-02.php" >

お名前 <input type="text" size="20" maxlength="40" name="NAME">
メール <input type="text" size="30" maxlength="60" name="MAIL">

<p>本文<br></p>
<textarea rows="20" cols="80" wrap="soft" name="BODY"></textarea>
<p><input type="submit" name="SUBMIT" value="送信"><input type="reset" name="delete" value="消す"></p>


削除キー <input type="password" name="delkey" size=8>(記事の削除用。英数字で8文字以内)
<p>投稿番号:<input type="text" size=10 name="delcode"><input type="submit" neme="DELETE"value="削除"></p>
<input type="hidden" name="NO" value="$view[3]">

</form>
';

$data = file("data.txt");

$i = 1;
foreach($data as $value){

$view = explode("\t", $value);
list($name, $mail, $body, $dt,$password,$) = explode("\t",$value);


if( $i < 11 ){

if($mail== ""){

#このパスワードならPOSTで送る。
if($_delkey == "0123456789"){
$_POST["num"];
}

$flag = 0;
$flag = 1;

# 削除ボタンが押されたら
if($submit =="削除"){
$sub = $_POST["delete"];//入力された削除キー
$data = file("data.txt");

foreach( $data as $value){
explode("\t",$value);
if($num == $value[3] && $delete == $value[1]){//$value[0]が投稿番号$valet[1]が削除キーと仮定した場合

//削除フラグを1にする処理
if($flag == 1);


}
}
#新しい投稿かつ、そのパスワードが0~9ならPOSTでdeleteを送る。
if ( $num == $view[3] && $pass == "0123456789"){




}


echo "お名前:$view[0]$view[3]<br>";
echo "本文:$view[2]<br>";
echo '<hr size="1" width="80%"><br>';

} else {

echo "お名前:<a href=\"mailto:$mail\">$view[0]</a>$view[3]<br>";

echo "本文:$view[2]<br>";
echo '<hr size="1" width="80%"><br>';

}



} $i++;
}



?>

補足日時:2006/06/20 12:20
    • good
    • 0
この回答へのお礼

ありがとうございます。なんとか削除機能を実装することができました。

お礼日時:2006/06/22 23:23

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