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

PHPで掲示板の機能の一つである論理削除機能を作成しようと思っています。削除キーに削除パスワードを入力して、削除ボタンを入力(または投稿番号を指示)したときに投稿者の記事を削除(物理削除ではありません)するようにしたいのです。投稿番号や削除キー、削除ボタンは作成したのですが、hiddenやif文を使用することまではわかったのですが、肝心のスクリプト部分がどうしてわからないのです。なにか例のようなものでも記述していただけないでしょうか?
よろしくお願いいたします。

A 回答 (4件)

>moon_nightさん


フォロー感謝です。

>msnxlさん
#1 のソースで、1つ勘違いされそうなところを見つけましたので、注釈を。

view_item(); // 記事表示関数の呼び出し

これはPHPに用意された関数ではなく、ユーザー定義関数としています。
記事表示部のロジックを省略したかったので、便宜上、ユーザー定義関数として記述しました。
view_item という関数は存在しませんので、ご注意ください。

この回答への補足

ありがとうございます!

補足日時:2006/06/16 11:54
    • good
    • 0
この回答へのお礼

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

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

やりかたのヒントだけ。



<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="deleat" value="消す"></p>

<form method="post" action="subject03-02.php" >
  <input type="hidden" name="action" value="delete">
削除キー <input type="password" name="delkey" size=8>(記事の削除用。英数字で8文字以内)
<p>投稿番号:<input type="text" size=10 name=delcode><input type="submit" value="削除"></p>
</form>

</form>

FORMの中にFORMを入れてはいけません。
FORMの中に作るとすると、削除ボタンにNAMEをつけて、そのデータが飛んできた場合は、投稿番号の記事に削除フラグを立てればいいわけです。
削除用のFORMだけ別にできればそれのほうがやりやすいかもしれません。

例えば、
<input type="password" name="delkey" size=8>
<input type="text" size=10 name=delcode>
<input type="submit" name="delete" value="削除">
として、

# 削除ボタンが押されたら
if ($_POST['delete']) {
# パスワード確認
if ($_POST['delkey'] == $PASS) {
# 該当の記事に削除フラグを立てる
}
}
といった感じになるかと思います。

この回答への補足

$flag = 1;

if( $i < 11 ){

if($mail== ""){

# 削除ボタンが押されたら
if ($_POST['delete']) {
# パスワード確認
($_POST["password"] == "0123456789");

if ($_POST["delkey"] == $PASS) {
if( $flag == 1 ){
fwrite($file, "$name\t$mail\t$body\t$num\t$dt\n".implode("", $data));

}else{
}

# パスワード確認
($_POST["password"] == "0123456789");でポストで数字を送るような感じではだめでしょうか?
また、 フラグで1ならばfwrite($file, "$name\t$mail\t$body\t$num\t$dt\n".implode("", $data));
としてみました。素人考えでご迷惑をかけます。

補足日時:2006/06/16 13:26
    • good
    • 0
この回答へのお礼

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

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

↓で述べたこととかぶりますが、解らない関数を調べてから実践してみませんか?


基本的な事は、#1 で述べたつもりです。

OKWave 投稿番号、投稿削除と投稿修正機能
http://okwave.jp/kotaeru.php3?q=2216874&rev=1

私が手直ししたソースを紹介するのは簡単ですが、それだと覚える機会を失ってしまいます。
やはり、こういうことは自分で試して結果を見て、失敗や成功を乗り越えていった方が覚えが早いと思います。
「他人のソースを見て勉強する」には、ソース内に含まれている関数や仕組みを理解して使わないと応用力がつきませんので。

試してみても、解らなければ質問してください。
長くなるようであれば、この記事をブックマークに入れてチェックしておきます。

この回答への補足

丁寧なご回答ありがとうございます。ご忠告を踏まえた上で、取り組みます。おそらく、長くなると思います。

補足日時:2006/06/16 09:06
    • good
    • 0

ログフォーマットがどのようになっているのか解りませんので、説明が簡単なCSV形式だと仮定します。



名前<>本文<>記事No<>削除キー
Ken<>こんにちは<>100<>1234

という形式のCSVがあるとします。
これにもう1つ、論理削除が行われているかどうかのフラグ用のカラムを追加すればよいと思います。

論理削除フラグ<>名前<>本文<>記事No<>削除キー
1<>Ken<>こんにちは<>100<>1234

ログを読み込むときに、論理削除フラグを読み込んで表示するか否かを判定すれば、期待通りの動作になるでしょう。
(上例では、1 なら論理削除されたと見なして表示せず、0なら論理削除されていないと見なして表示する、という動作を想定しています。)
カラムを増やしたくないという場合は、削除キーを格納している箇所で「削除キー+削除キー許可していない文字+論理削除フラグ」という連結データにする、という代用法もあります。
例えば、「削除キーに @ は使えない」ようにして、論理削除したときには削除キーを格納している部分を「1@1234」とする。
(削除キー = 1234, 論理削除フラグ = 1 です。)
記事表示時に、削除キーをチェックして論理削除したか否かを判定する。
以下に、「削除キー+論理削除フラグ」の複合型の例を示します。

/* 論理削除処理 */
$dat = "$name<>$msg<>$item_num<>1@".$del_key;// 名前, 本文, 記事No, 削除キー + 論理削除フラグの初期化

/* 通常の記事投稿処理 */
$dat = "$name<>$msg<>$item_num<>0@".$del_key;// 名前, 本文, 記事No, 削除キー + 論理削除フラグの初期化

/* 記事表示部 */
list($name, $msg, $item_num, $delkey_dat) = explode('<>', $dat);// 記事を展開
if(preg_match('/'.'^0@'.'/', $delkey_dat, $match)){// 論理削除フラグが 0 だった時
view_item();// 記事表示関数の呼び出し
}

> hiddenやif文を使用することまではわかったのですが、肝心のスクリプト部分がどうしてわからないのです。
参考までにお聞きしたいのですが、hidden とは何を指すのでしょう?
PHPの関数名ではなさそうですが…。

この回答への補足

すみません。hiddenとは<input type="hidden"> の隠しデータを送信するHTMLタグのことです。ログを作成しなければならないのですね。
とりあえず、今できているスクリプトを記載します。

<?php
$reset = $_POST["deleat"];
$submit = $_POST["SUBMIT"];

if($submit == "送信"){

$name = $_POST["NAME"];
$mail = $_POST["MAIL"];
$body = $_POST["BODY"];
$hidden = $_POST["action"];
$password = htmlspecialchars($_POST["delkey"]);





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");
$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$num\t$dt\n".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="deleat" value="消す"></p>

<form method="post" action="subject03-02.php" >
  <input type="hidden" name="action" value="delete">
削除キー <input type="password" name="delkey" size=8>(記事の削除用。英数字で8文字以内)
<p>投稿番号:<input type="text" size=10 name=delcode><input type="submit" value="削除"></p>
</form>

</form>
';

$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== "" ){


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/16 07:56
    • good
    • 0
この回答へのお礼

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

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

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