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>