mysqlでテーブル間の情報参照の上、リンクを表示する
受付中
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,373
会員制掲示板をphp+mysqlで作ってます。
ユーザーごとに投稿が表示されるのですが、 自分の投稿以外は「投稿編集」「投稿削除」できないようにしたいです。 (※「投稿編集」「投稿削除」のリンクを表示させない)
例:testuserでログインしたらtestuser以外のユーザーの投稿は 「投稿編集」「投稿削除」のリンクを表示させない
【posts】テーブルのuser_idは【users】テーブルのidの値が入るようになってます。 その値同士が同じであれば「投稿編集」「投稿削除」のリンクを表示するという構成です。
実装はしたものの、正常に動作しません。 どこが間違っているのかご教示願います。
テーブル情報はこんな感じ。 【users】
create table users (
id int primary key auto_increment,
name varchar(255),
email varchar(255),
created_at datetime,
password varchar(255)
);
【posts】
create table posts (
id int primary key auto_increment,
user_id int,
name varchar(255),
title varchar(255),
content text,
created_at datetime,
updated_at datetime
);
サンプルコードは以下です。
<?php
session_start();
require_once('config.php');
require_once('functions.php');
if (empty($_SESSION['id'])) {
header('Location: login.php');
exit;
}
//var_dump($_SESSION['id']);
//var_dump($_SESSION['name']);
$dbh = connectDatabase();
$sql = "select * from posts";
$stmt = $dbh->prepare($sql);
$stmt->execute();
$posts = $stmt->fetchAll(PDO::FETCH_ASSOC);
//var_dump($posts);
$dbh = connectDatabase();
$sql = "select * from users";
$stmt = $dbh->prepare($sql);
$stmt->execute();
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>ELITES Blog</title>
<link type="text/css" rel="stylesheet" href="reset.css">
<link type="text/css" rel="stylesheet" href="style.css">
</head>
<body>
<div id="wrapper">
<nav>
<ul>
<li class="on"><a href="index.php">ホーム</a></li>
<li class="on"><a href="list.php">日記一覧</a></li>
<li class="on"><a href="add.php">日記追加</a></li>
<li class="on"><a href="logout.php">ログアウト</a></li>
</ul>
</nav>
<h1>ELITES Blog</h1>
<h2>ELITES 公式開発ブログ</h2>
<h3>投稿されたブログ一覧</h3>
<?php if (count($posts)) : ?>
<?php foreach($posts as $post) : ?>
<ul>
<li class="link"><a href="detail.php?id=<?php echo h($post['id'])?>"><?php echo h($post['title'])?>(作成日:<?php echo h($post['updated_at'])?>)</a>
<?php if (h($users['id']) == h($post['user_id'])) : ?>
|[<a href="edit.php?id=<?php echo h($post['id'])?>">編集</a>]|[<a href="delete.php?id=<?php echo h($post['id'])?>">削除</a>]
<?php endif ?>
</li>
</ul>
<?php endforeach ?>
<?php else : ?>
投稿された日記はありません。
<?php endif ?>
<footer>
<p><a href="http://nowall.co.jp">株式会社 NOWALL</a></p>
<small>2015 NOWALL,Inc. All Right Reserved.</small>
</footer>
</div>
</body>
</html>
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
すみません。phpはあまり詳しくないので検討違いかもしれませんが。。
「testuserでログインしたらtestuser以外のユーザーの投稿は 「投稿編集」「投稿削除」のリンクを表示させない」のであれば、下記のようにするのが正しいような気がします。 $_SESSION['id']にログインした人のuserテーブル上のidが入っているという前提です。
<?php if (h($users['id']) == h($post['user_id'])) : ?>
を
<?php if (h($_SESSION['id']) == h($post['user_id'])) : ?>
または、プログラム上部でusersデータ全体を取得しているところ(これはなぜですか?)で、ログインした人のデータだけを取得して、そのuserデータのidとループ内の各postのuser_idと比較すればよいのではないでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.33%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
退会済みユーザー
2015/12/06 17:58
config.php
functions.php
の実装を提示してください。
moredeep
2015/12/07 09:20
正常に動作しません。と書くより、どうなっているかを書いたほうがいいです。