日本PHPユーザ会 掲示板

日本PHPユーザ会運営の掲示板です。※ただいまテスト運用中です。

日本PHPユーザ会 掲示板 » PHP事はじめ » PHPとSQLiteを使った掲示板

PHPとSQLiteを使った掲示板

ページ: 1

投稿者 投稿
会員
登録者: 5 月 2009
返信数: 2
こんにちわ。PHP初学者で、PHP5とSQLiteを使った掲示板を作成したいと思っています。
以下のように作成したのですが、削除が機能しません。
以下のスクリプトを修正する場合、どうすればよいかどなたかお知恵を拝借いただけませんでしょうか? よろしくお願いいたします。


<?php
$db = sqlite_open('sqbbs.sqlite');
sqlite_query($db, 'create table sqbbs(
id integer primary key,
t timestamp,
msg text,
del boolean default 0);');
?>

<form action="sqbbs.php" method="post">
<p>メッセージ:<br />
<textarea name="msg" rows="2" cols="30"></textarea><br />
<input type="submit" value="送る" />
<input type="reset" value="クリア" /></p>

</form>

<?php
$db = sqlite_open('sqbbs.sqlite')
or die("<p>データベースに接続できませんでした</p>");
if ($_POST['msg'] != '') {
$t = date("Y-m-d H:i:s");
$msg = sqlite_escape_string($_POST['msg']);
$sql = "insert into sqbbs values(NULL, '$t', '$msg', 0)";
$result = sqlite_query($db, $sql)
or die("<p>書き込みに失敗しました</p>");
}
$sql = "select * from sqbbs where Del = 0 order by id desc limit 20";
$result = sqlite_unbuffered_query($db, $sql)
or die("<p>読み出しに失敗しました</p>");
echo "<table border=\"1\">\n";
echo "<tr>
<th>番号</th>
<th>日時</th>
<th>メッセージ</th>
<th>削除</th>
</tr>\n";
while ($a = sqlite_fetch_array($result, SQLITE_ASSOC)) {
echo "<tr>
<td>", $a['id'], "</td>
<td>", $a['t'], "</td>
<td>", htmlspecialchars($a['msg']), "</td>
<td><form><input type='submit' name='Del' value='削除'></td>
<input type='hidden' name='Del' value='1'></form>
</tr>\n";
}
echo "</table>\n";
header('Location: ./sqbbs.php');


//削除処理#1
if (isset($_POST['Del'])) {
$result = sqlite_query($db, $sql);
$sql = "delete from sqbbs where Del = 1";
$result = sqlite_query($db, $sql)
or die("<p>削除できませんでした</p>");
}else{
print (sqlite_changes($db).'件のレコードを削除しました<br/>');
}
header('Location: ./sqbbs.php');
exit;


sqlite_close($db);
?>
« 最終編集者 jan-ken 日時 2009 年 5 月 17 日(日) 15:19. »
会員
登録者: 5 月 2009
返信数: 1
ダイレクトメールでこの方から同じ質問を受けて回答しました。
他の方の二度手間にならないよう、以下に回答内容を書いておきます。

引用
スクリプトを見たところでは、削除するような書き方になっていません。
以下の部分ですが、SQL の delete 文で Del フィールドが 1 の場合に
削除することになっています。しかし、Del フィールドを 1 にする SQL を
実行する部分がスクリプトには見当たりません。

引用
//削除処理#1
if (isset($_POST['Del'])) {
$result = sqlite_query($db, $sql);
$sql = "delete from sqbbs where Del = 1";
$result = sqlite_query($db, $sql)
or die("<p>削除できませんでした</p>");
}else{
print (sqlite_changes($db).'件のレコードを削除しました<br/>');
}
header('Location: ./sqbbs.php');
exit;


対策ですが、以下の 2 通り考えられます。

1. POST 時にメッセージの id を渡し、削除処理でメッセージを削除
$sql = "delete from sqbbs where id = " . (int)$id;

2. POST 時にメッセージの id を渡し、削除処理で Del フラグを設定
$sql = "update sqbbs set Del = 1 where id = " . (int)$id;

データベースからメッセージを削除するのが 1. の方法で、
データベースにメッセージを残しておいて、見られないようにする
のが 2. の方法です。都合の良い方を選択してください。
会員
登録者: 5 月 2009
返信数: 2
ご返信ありがとうございました。

◉削除ボタンを以下のように書き直してみました。

<td><form><input type='submit' name='Del_Rec' value='削除'></td>
<input type='hidden' name='id' value='$id'>



◉削除処理を以下のように書き直してみました。

//削除処理#1
if (isset($_POST['Del_Rec'])) {
$result = sqlite_query($db, $sql);
$sql = "delete from sqbbs where id = " . intval ($id); // 物理削除
//$sql = "update sqbbs set Del = 1 where id = " . intval ($id); // 論理削除
$result = sqlite_query($db, $sql)
or die("<p>削除できませんでした</p>");
}else{
print (sqlite_changes($db).'件のレコードを削除しました<br/>');
}
header('Location: ./sqbbs.php');
exit;



しかしながら、動きません。どこがいけないのでしょうか?
お知恵を拝借いただきたく、よろしくお願いいたします。

ページ: 1

日本PHPユーザ会 掲示板 » PHP事はじめ » PHPとSQLiteを使った掲示板

日本PHPユーザ会 掲示板 は UseBB 1 フォーラムソフトウェア を使用しています