🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

934閲覧

PHP 詳細表示がしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2021/02/25 11:38

編集2021/02/25 13:11

PHPで詳細表示をしたく現在実装しています。

テーブルは以下のように記載しています。
以下はusersテーブル
イメージ説明
以下はtweetsテーブル
イメージ説明
詰まっている部分としては詳細表示の際に、ログインしているユーザーでかつそれを投稿したユーザーである場合は、編集と削除ができる。

テーブルはusersテーブル、tweetsテーブルを使用しています。
ここで、usersテーブルのログインしているユーザーとtweetsテーブルの投稿した記事を紐付けるSQL文を書いて行きたいと思っています。

そして、詳細の際に、選択した特定の一点のみを取得するSQL文に詰まっています。

SQL分でSELECT * FROM tweets Where id=?;のように記載することも可能だと思うのですが、その深い部分が理解できないため、?は使わずにgetLoginUserIdという関数を使っています。
また、$_SESSION['user']['id'])==$user_idと記載してログインしているユーザーが投稿したユーザーと同一であると記載したかったのですが、フレームワークではなく生のPHPで書くとなるとそのような記事がなかなか見当たらず詰まってしまいます。
原因、実現したいこととして解決策のご提示をお願いします。

//show.php <?php session_start(); require('../common/auth.php'); require('../common/database.php'); require('../common/head_info.php'); $user_id = getLoginUserId(); $database_handler = getDatabaseConnection(); $tweets=$database_handler->prepare('SELECT * FROM tweets where id=user_id;'); $tweets->execute(); $tweet = $tweets->fetch(); ?> <?php require('../common/header.php'); ?> <div class="main-top"> <div class="community-show"> <article> <h1 class="item-name"><?php print($tweet['title']);?></h1> <div class="item-main-content"><?php print($tweet['content']);?></div> <?php if(!empty($_SESSION['user']['id'])==$user_id) { ?> <a href="edit.php?id=<?php print($tweet['id']);?>">編集する</a> <a href="delete.php?id=<?php print($tweet['id']);?>">削除する</a> <button type="submit" class="btn btn-danger" formaction="./tweets/delete.php"><i class="fas fa-trash-alt"></i></button> <?php } ?> </article> </div> </div>
//auth.php <?php /** * ログインしているユーザーIDを取得する * @return |null */ function getLoginUserId() { if (isset($_SESSION['user'])) { return $_SESSION['user']['id']; } return null; }
//database.php <?php /** * PDOを使ってデータベースに接続する * @return PDO */ function getDatabaseConnection() { try { $database_handler = new PDO('mysql:dbname=aaa;host = 127.0.0.1;port=8889;charset=utf8', 'root', 'root'); //PDO::ERRMODE_EXCEPTIONの値を設定することでエラーが発生したときに、PDOExceptionの例外を投げるように設定。 // $database_handler->setAttribute(setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING)); } catch (PDOException $e) { echo "DB接続に失敗しました。<br />"; echo $e->getMessage(); exit; } return $database_handler; }
//head_info.php <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet"> <link rel="stylesheet" href="../public/css/style.css"> </head> <body> <script src='https://code.jquery.com/jquery-3.4.1.min.js'></script> </body>
//ユーザー登録用register.php <?php session_start(); require('../common/database.php'); require('../common/validate.php'); require('../common/head_info.php'); ?> <?php //POST送信された場合 if(!empty($_POST)) { $name = $_POST['name']; $email = $_POST['email']; $pass = $_POST['pass']; $pass_re = $_POST['pass_re']; //未入力チェック validateNot($name, 'name'); validateNot($email, 'email'); validateNot($pass, 'pass'); validateNot($pass_re, 'pass_re'); if(empty($err_msg)) { //ニックネームの最大文字数チェック validateNameMaxLen($name, 'name'); //メールアドレスの重複チェック //メールアドレスの形式チェック //パスワードの最大文字数チェック validatePassMaxLen($pass,'pass'); //パスワードの最小文字数チェック validatePassMinLen($pass,'pass'); //パスワードの半角英数字チェック if(empty($err_msg)) { try { //DB接続処理 $database_handler = getDatabaseConnection(); // プリペアドステートメントで SQLをあらかじめ用意しておく if($statement = $database_handler->prepare('INSERT INTO users (name, email, password) VALUES (:name, :email, :password)')){ $password = password_hash($pass, PASSWORD_DEFAULT); //指定された変数名にパラメータをバインド(紐付け) $statement->bindParam(':name', $name); $statement->bindParam(':email', $email); $statement->bindParam(':password', $password); $statement->execute(); } // ユーザー情報保持 $_SESSION['user'] = [ 'id' => $database_handler->lastInsertId() ]; }catch(Exception $e) { error_log('エラー発生:' . $e -> getMessage()); $err_msg['common'] = message05; exit; } header('Location:../tweets/index.php'); exit; } } } ?> <?php require('../common/header.php'); ?> <div class='main-top'> <div class='form-register'> <div class="form-register-list"> <h2><i class="fas fa-user-plus"></i>ユーザー登録</h2> <form action="" method='post' class='form'> <label> <input type="text" name='name' placeholder="ニックネーム" value="<?php print(htmlspecialchars($_POST['name'],ENT_QUOTES));?>"> <div class="error_mes"> <?php if(!empty($err_msg['name'])) echo $err_msg['name']; ?> </div> </label> <label> <input type="text" name='email' placeholder="メールアドレス" value="<?php print(htmlspecialchars($_POST['email'],ENT_QUOTES));?>"> <div class="error_mes"> <?php if(!empty($err_msg['email'])) echo $err_msg['email']; ?> </div> </label> <label> <input type="password" name='pass' placeholder="パスワード" value="<?php print(htmlspecialchars($_POST['pass'],ENT_QUOTES));?>"></br> <div class="error_mes"> <?php if(!empty($err_msg['pass'])) echo $err_msg['pass']; ?> </div> <span class='form-rule'>※英数字8文字以上</span> </label> <label> <input type="password" name='pass_re' placeholder="パスワード確認" value="<?php print(htmlspecialchars($_POST['pass_re'],ENT_QUOTES));?>"></br> <div class="error_mes"> <?php if(!empty($err_msg['pass_re'])) echo $err_msg['pass_re']; ?> </div> <span class='form-rule'>※英数字8文字以上</span> </label> <div class='button-container'> <input type="submit" value='登録する'> </div> </form> </div> </div> </div> <?php require('../common/footer.php'); ?>
//tweetの一覧 <?php session_start(); require('../common/validate.php'); require('../common/database.php'); require('../common/head_info.php'); $database_handler = getDatabaseConnection(); $tweets=$database_handler->prepare('SELECT * FROM tweets ORDER BY id DESC;'); $tweets->execute(); ?> <?php require('../common/header.php'); ?> <div class="main-top"> <?php if(!empty($_SESSION['user']['id'])) { ?> <div class="community-create"> <div class="tweet-top"> <a href="../tweets/create.php">投稿する</a> </div> </div> <?php } ?> <div class="create-list"> <div class="create-list-container"> <div class="create-list-top"> <p> aaa </p> </div> <?php if(!empty($tweets)){ ?> <ul class="create-list-content"> <?php foreach($tweets as $tweet): ?> <li class="list-menu"> <div class="title-list"> <p><a href="community01_show.php?id=<?php print($tweet['id']);?>"><?php print(mb_substr($tweet['title'],0,50)); ?></a></p> </div> </li> <?php endforeach; ?> </ul> <?php }else{ ?> <p style="text-align:center;line-height:20;">投稿はまだありません</p> <?php } ?> </div> </div> </div> <?php require('../common/footer.php'); ?>
//tweetのshow.php <?php session_start(); require('../common/auth.php'); require('../common/validate.php'); require('../common/database.php'); require('../common/head_info.php'); $user_id = getLoginUserId(); $database_handler = getDatabaseConnection(); $tweets=$database_handler->prepare('SELECT * FROM tweets WHERE id=?;'); $tweets->execute(); $tweet = $tweets->fetch(); ?> <?php require('../common/header.php'); ?> <div class="main-top"> <div class="community-show"> <article> <h1 class="item-name"><?php print($tweet['title']);?></h1> <div class="item-main-content"><?php print($tweet['content']);?></div> <?php if($tweet['user_id']==$user_id) { ?> <a href="community01_edit.php?id=<?php print($tweet['id']);?>">編集する</a> <a href="community01_delete.php?id=<?php print($tweet['id']);?>">削除する</a> <button type="submit" class="btn btn-danger" formaction="./tweets/delete.php"><i class="fas fa-trash-alt"></i></button> <?php } ?> </article> </div> </div>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2021/02/25 11:42

記載のSQLが正しくないのでSQLが分からないのかPDOが分からないのかが分からない
退会済みユーザー

退会済みユーザー

2021/02/25 11:44

すみません。PDOがわからないです。
hentaiman

2021/02/25 11:53

と言う事はPDOの情報が見つからない事だけが問題って事ですか phpマニュアルにコピペで使えるサンプルコード付きで説明載ってますよ
退会済みユーザー

退会済みユーザー

2021/02/25 11:59

いえ、PDOの情報が見つからないだけではなく、 実際に投稿したユーザーがログインしているユーザーと一致しているかどうかの記載の仕方がわからないです。 phpマニュアルでSQLと検索してもどれがヒットするのか分かりません。
hentaiman

2021/02/25 12:10

質問文に自分でSQL書いてるじゃん(構文エラーだけど) とりあえずマニュアルのサンプルコード使ってそのSQL実行してはどうですか?質問文の内容が概ね合ってるならそれで一致してるか判別出来ると思いますが そのSQL自体が間違ってるのなら誰にも答えは分かりませんけど
退会済みユーザー

退会済みユーザー

2021/02/25 12:14

上記の記載だとログインしているユーザーがIDならばになります。 マニュアルというのはどれですか? 検索しても出てこなかったので
m.ts10806

2021/02/25 12:21

> !empty($_SESSION['user']['id']) これだとempty()の結果(true/false)と$user_idを比べてますが、問題ないですか?
hentaiman

2021/02/25 12:25

いや知らんけど idとuser_idの違いとかそのの比較で問題があるかなんてキミしか知らねーし 未解決の大量の過去質問の中に類似の要件無かったんですか?
m.ts10806

2021/02/25 13:12

SQLで提示されないと環境作れないのです。 画像で提示されてもコピペできません。手で見ながら打つのは非常に手間です。 phpMyAdminならエクスポート機能でCREATE TABLEが吐き出せます。
guest

回答1

0

詰まっている部分としては詳細表示の際に、ログインしているユーザーでかつそれを投稿したユーザーである場合は、編集と削除ができる。

なら、投稿者以外も「見れる」し、投稿者のIDは投稿テーブルに入っていると
勝手に推測しました(テーブル定義ないから推測でしかありませんが)

それなら、発行するSQLは投稿テーブルに対して指定の投稿を取得する(id)だけでいいです。
取得結果、user_idが入っているならそのuser_idとセッション情報を条件式としてください。

投稿2021/02/25 12:24

編集2021/02/25 12:25
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/25 12:28

はい、そうです。 というと以下のような記載ですか? 'SELECT * FROM tweets WHERE id=?;' また、!empty($_SESSION['user']['id'])ではなく、if($tweet['user_id']==$user_id) {に変更しました。 しかし、まだ不安で、投稿したユーザーとログインしているユーザーが一致していることにならないためどのように記載したら良いでしょうか?
m.ts10806

2021/02/25 12:32

$user_id ↑これ、どこから来たんですか?
退会済みユーザー

退会済みユーザー

2021/02/25 12:37

これはログインしているユーザー情報を取得するために自分で記載しただけです。
m.ts10806

2021/02/25 12:40 編集

質問者自身しか知らないことが多すぎます。 コードは仮、テーブル定義も不明、セッションへの格納も不明 では赤の他人が応えられることはほぼないです(なので「推測」と前置きしたうえで考え方だけ答えた) 具体的で的確な回答が欲しいのでしたら関係する実装は全て提示してください。
退会済みユーザー

退会済みユーザー

2021/02/25 13:06

はい、すみません。訂正します。 テーブルの定義ですが、usersテーブルは、id,name,passwordで構成。tweetsテーブルはid,user_id,title,contentで定義してあります。 セッションの格納は、ユーザー情報を保持する際は、以下のように記載しています。 // ユーザー情報保持 $_SESSION['user'] = [ 'id' => $database_handler->lastInsertId() ];
m.ts10806

2021/02/25 13:09

テーブル定義はCREATE TABLEで提示してください。 型は大事です。 というか、質問本文に記載してください。
m.ts10806

2021/02/25 13:09

ところで、既に解決可能な情報は最初の時点で提示したはずですが、何が分からないのでしょう。
退会済みユーザー

退会済みユーザー

2021/02/25 13:13

実際に投稿したユーザーと、ログインしているユーザーが一致しているかどうかの記載の仕方が分かりません。質問本文にテーブル定義を記載しました。
m.ts10806

2021/02/25 13:17

>実際に投稿したユーザー それはご自身がご存知でしょう 投稿者の保存処理を作ったのは誰? >ログインしているユーザー それはご自身がご存知でしょう ログイン処理とセッションへの保管処理を作ったのは誰? 「自分が作ったものが分からない」というのでしたら こちらが応えられるものはないです。 設計を重々見直してください。(ないなら作ってください)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問