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

php mysqlに関してド初心者です。簡易掲示板を作成する課題があるのですが、どう調べてもわからない箇所があり、まいっています。1つは編集、削除の際にパスワードの入力を求める。具体的にはパスワード入力ができるようにしたformを表示し入力させる。2つめは入力されたパスワードと書き込み時に保存したパスワードを比較し、一致の場合のみ編集削除が動作するようにする。というものです。どう書けばいいのかさえわかりません。教えて頂けたら有り難いです

gooドクター

A 回答 (3件)

#2です



別途おなじような質問をなげているようですが
この回答が役にたたなかったなら別にそれでいいので
ベストアンサーなし質問を閉じてから
別途質問をたてるのがマナーじゃない?
    • good
    • 1
この回答へのお礼

すみません。このサイトを利用するのが初めてであまりやり方がわかっていません。
せっかくお答え頂いたのに不愉快にさせてしまい申し訳ありません。

お礼日時:2015/11/02 22:57

>例えばコードはどのように書けばいいのでしょうか



ちょっと丸投げすぎなので、例示しても理解できるか怪しいですが・・・

(1)準備
mysqlにデータベースtestdbをつくり、
ユーザーテーブルuserテーブルと掲示板keijibanテーブルを作っておきます
CREATE DATABASE `testdb`;
CREATE TABLE `testdb`.`user`(
`uid` int not null primary key
,`user` varchar(100) unique key
,`password` varchar(100)
,`nickname` varchar(100) unique key
);
CREATE TABLE `testdb`.`keijiban`(
`mid` int not null auto_increment primary key
,`uid` int not null
,`title` varchar(100)
,`message` text
,`created` datetime
);

(2)サンプルデータ
ユーザーテーブルにhogeとfugaの2名を追加
掲示板に5メッセージ追加しておきます
INSERT INTO `testdb`.`user` VALUES
(1,'hoge','hogehoge','hoge taro')
,(2,'fuga','fugafuga','fuga jiro');
INSERT INTO `testdb`.`keijiban`(`uid`,`title`,`message`,`created`) VALUES
(1,'aaa','a',now())
,(1,'bbb','b',now())
,(2,'ccc','c',now())
,(1,'ddd','d',now())
,(3,'eee','e',now());

(3)phpソース
エラー回避や、セキュリティ対策をごっそり削ってあるので公開するときには
かなり補強する必要がありますが、とりあえず以下のソースで動きます

<?php
$user = '・・・・';
$password = '・・・・';//dbにアクセスできるユーザーとパスワードを指定

$dsn = 'mysql:host=localhost; dbname=testdb';
$pdo = new PDO($dsn, $user,$password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
session_start();
if($_POST["x"]==="logout"){
$_SESSION["uid"]="";
$_SESSION["nickname"]="";
}
$uid=$_SESSION["uid"];
$nickname=isset($_SESSION["nickname"])?$_SESSION["nickname"]:"";
if($_POST["x"]==="login"){
$data=array($_POST["user"],$_POST["password"]);
$query="SELECT `uid`,`nickname` FROM `user` WHERE `user`=? and `password`=?";
$stmt = $pdo->prepare( $query);
$stmt->execute($data);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$uid= isset($row["uid"])?$row["uid"]:"";
$_SESSION["uid"]=$uid;
$nickname=isset($row["nickname"])?$row["nickname"]:"";
$_SESSION["nickname"]=$nickname;
}
?>
<form method="post">
user:<input type="text" name="user"><br>
password:<input type="text" name="password"><br>
<input type="submit" name="x" value="login">
<input type="submit" name="x" value="logout"><br>
<?PHP
if($nickname!==""){
print "your name is ".htmlspecialchars($nickname);
}else{
print "not login";
}
?>
</form>
<hr>
<form method="post">
title:<input type="text" name="title"><br>
<textarea name="message"></textarea><br>
<input type="submit" name="x" value="send"><br>
</form>
<?PHP
if($_POST["x"]==="send" and $_POST["title"]!==""){
$data=array($_POST["title"],$_POST["message"],$uid);
$query="INSERT INTO `keijiban` SET `title`=?,`message`=?,`uid`=?,created=now()";
$stmt = $pdo->prepare( $query);
$stmt->execute($data);
}
if($_GET["x"]==="del" and $_GET["mid"]!==""){
$data=array($_GET["mid"],$uid);
$query="DELETE FROM `keijiban` WHERE mid=? and uid=?";
$stmt = $pdo->prepare( $query);
$stmt->execute($data);
}

$query="select mid,uid,created,title from keijiban order by mid desc";
$stmt = $pdo->query($query);
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
print $row["created"].":".$row["title"];
if($row["uid"]==$uid){
print '<input type="button" value="del" onclick="location.href=\'?x=del&amp;mid='.$row["mid"].'\'">';
}
print "<br>";
}
?>
    • good
    • 0
この回答へのお礼

ありがとうございます。とても助かります。実際にやってみますが、また疑問なところがあればお聞きしたいので、お手数おかけ致しますがよろしくお願い申し上げます

お礼日時:2015/11/02 14:36

1会話につき1レコードをつくり、レコード上に削除用パスワードを保存しておけばよいでしょう


ただし削除用パスワードを会話のたびに設定するのはかなりわずらわしいですね
あまり現実的ではないかもしれません。

むしろ普通レコードには書き込んだユーザーのユーザーIDを保存するでしょうから、
ログインユーザーのIDと合致したとき削除可能だとみなせばよいでしょう。
通常はユーザーIDはセッションで保持しているので参照は簡単です

またもしログインしないで書き込みをする仕組みを想定しているのであれば
匿名だとすぐに便所の落書き状態になるのでお勧めしません
    • good
    • 0
この回答へのお礼

つらい・・・

ありがとうございます。例えばコードはどのように書けばいいのでしょうか?

お礼日時:2015/11/02 12:12

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

gooドクター

人気Q&Aランキング