PHP+SQLiteでTwitterのようなアプリをつくる(3)の続きです。今回はプロフィールの編集機能を追加します。
Contents
プロフィールを表示する
まずプロフィールを表示できるようにします。
ShowContents関数を変更します。
functions.php
1 2 3 4 5 6 7 8 |
//function ShowContents($db){ // ShowArticles($db); //} function ShowContents($db){ ShowProfile($db); // 後述 ShowArticles($db); } |
ShowProfile関数はページ上部にそのユーザーのプロフィールを表示します。/?user=XXXにアクセスするとユーザーIDがXXXの投稿一覧が表示されるようにしているので、isset( $_GET[“user”])であればプロフィールを表示します。ただ/?user=XXXにアクセスしてもXXXというユーザーが存在しない場合もあるので、その場合は「該当するユーザーはいません」と表示させます。
ユーザーが存在する場合はそのユーザーが設定しているプロフィールが表示されます。またトップページへのリンクも表示されます。そしてログインしているユーザー自身のプロフィールが表示されている場合はプロフィール編集ページへのリンクも表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
function ShowProfile($db){ // トップページにアクセスした場合はサイト名を表示 if(!isset( $_GET["user"]) && !isset( $_GET["article"]) && !isset( $_GET["rt"])){ echo '<h1 class = "mt-1 mb-4">鳩でもわかる ぴよったー</h1>'; return; } if(!isset( $_GET["user"])) return; echo '<div class = "profile">'; $user_name = GetUserNameFromUserID($db, $_GET["user"]); echo '<h1 class = "mt-1 mb-4">'.$user_name.' さんの投稿</h1>'; $prof_image_path = GetProfileImagePath($db, $_GET["user"]); $prof_text = GetProfileText($db, $_GET["user"]); if(ExistUser($db, $_GET["user"])){ if($prof_text != '') echo '<p><pre>' . $prof_text. '</pre></p>'; else echo '<p>プロフィールは設定されていません</p>'; if($prof_image_path != '') echo '<p><img src="' .$prof_image_path.'" class = "prof-image"></p>'; else echo '<p>プロフィール画像は設定されていません</p>'; if(isset( $_SESSION["user_id"]) && $_GET["user"] == $_SESSION["user_id"] ) echo '<p><a href="edit-profile.php">プロフィールを編集する</a></p>'; } else echo '<p>該当するユーザーはいません</p>'; // トップページへのリンク echo '<div class = "mt-5 mb-5"><a href="./">全ユーザーの投稿をみる</a></div>'; echo '</div><!-- /#profile -->'; } |
ExistUser関数はユーザーが存在するかどうかを返します。
1 2 3 4 5 6 7 8 9 10 11 12 |
function ExistUser($db, $user_id){ $sql = 'SELECT * FROM USER_TABLE WHERE user_id = :user_id'; $stmt = $db->prepare($sql); $stmt->bindValue(':user_id', $user_id); $stmt->execute(); $row = $stmt->fetch(); if(is_array($row)) return true; else return false; } |
GetProfileText関数はプロフィールに設定されているテキストを返します。
1 2 3 4 5 6 7 8 9 10 11 12 |
function GetProfileText($db, $user_id){ $sql = 'SELECT * FROM USER_TABLE WHERE user_id = :user_id'; $stmt = $db->prepare($sql); $stmt->bindValue(':user_id', $user_id); $stmt->execute(); $row = $stmt->fetch(); if(is_array($row)) return $row['prof_text']; else return ''; } |
GetProfileImagePath関数はプロフィールに設定されている画像のパスを返します。
1 2 3 4 5 6 7 8 9 10 11 12 |
function GetProfileImagePath($db, $user_id){ $sql = 'SELECT * FROM USER_TABLE WHERE user_id = :user_id'; $stmt = $db->prepare($sql); $stmt->bindValue(':user_id', $user_id); $stmt->execute(); $row = $stmt->fetch(); if(is_array($row)) return $row['prof_image_path']; else return ''; } |
プロフィールを編集する
プロフィールを編集する機能を追加します。
edit-profile.phpにアクセスしたらプロフィール編集用のフォームを表示します。編集ページにアクセスしたらユーザーネームとプロフィールに設定されているテキストと画像ファイルのパスをフォーム内に表示します。
[プロフィールを変更する][プロフィール画像をクリアする]ボタンがクリックされたら自分自身にPOSTします。[プロフィールを変更する]がクリックされた場合は、ファイルが選択されている場合はアップロードしてそれが画像ファイルかどうかを調べます。画像ファイルではない場合は削除し、画像ファイルの場合はそのパスをデータベースに保存します。同時に設定されたユーザーネームとプロフィールのテキストをデータベースに保存します。
[プロフィール画像をクリアする]ボタンがクリックされたらデータベースに保存されている画像ファイルのパスを空文字列に置き換えます。
edit-profile.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
<?php require_once('functions.php'); session_start(); // ログインしているユーザーから以外のアクセスは拒否 if (!isset($_SESSION['user_id'])){ echo '不正なリクエスト'; exit; } $db_path = GetDbPath(); $db = new PDO("sqlite:{$db_path}"); $prof_text = GetProfileText($db, $_SESSION['user_id']); $prof_image_path = GetProfileImagePath($db, $_SESSION['user_id']); $user_name = GetUserNameFromUserID($db, $_SESSION['user_id']); // [プロフィール画像をクリアする] ボタンがクリックされた if (isset($_POST['image-clear'])){ UpdateProfile($db, $user_name, $_POST['text'], 'clear'); header("Location: ./?user=".$_SESSION['user_id']); $db = null; exit; } // [プロフィールを変更する] ボタンがクリックされた if (isset($_POST['text']) && isset($_POST['user-name'])){ // 元ファイル名の先頭にアップロード日時を加える // 事前にimagesディレクトリを作成しておかないとエラーになるので注意 $image_path = './images/'. date("Y-md-His")."-".$_FILES['file_upload']['name']; $prof_image_path = ''; if(move_uploaded_file($_FILES['file_upload']['tmp_name'], $image_path)) { // PHPエラーを非表示 error_reporting(0); if (imagecreatefromstring(file_get_contents($image_path)) !== false) $prof_image_path = $image_path; // アップロードされたファイルが画像であるならプロフィール画像を変更 else unlink($image_path); // 画像でないなら削除 } UpdateProfile($db, $_POST['user-name'], $_POST['text'], $prof_image_path); header("Location: ./?user=".$_SESSION['user_id']); $db = null; exit; } $db = null; ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>プロフィールの編集|ぴよったー</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="./style.css" type="text/css" media="all" /> </head> <body> <?php ShowHeader(); ?> <div id = "main"> <div>プロフィールの編集</div> <form action="" method="post" enctype="multipart/form-data" style = "margin-bottom: 10px"> <input type="text" name = "user-name" required value="<?php echo $user_name; ?>"> <div id = "textarea"><textarea name="text" cols="50" rows="5" maxlength ="250" required><?php echo $prof_text; ?></textarea></div> <input type="submit" value="プロフィールを変更する"> <span class = "ms-3"><input name="file_upload" type="file" id = "file-name"></span> </form> <form action="" method="post" style = "margin-bottom: 20px"> <input type="text" name="image-clear" style = "display:none"> <input type="submit" value="プロフィール画像をクリアする"> </form> <p><img src="" id="file-image" /></p> <p id="image-check"></p> <?php if($prof_image_path != '') ?> <p><img src="<?php echo $prof_image_path; ?>" id="file-image" /></p> </div> <script src = "./app.js"></script> </body> </html> |
functions.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
function UpdateProfile($db, $user_name, $prof_text, $prof_image_path){ if (!isset($_SESSION['user_id'])) return; if($prof_text != ''){ $prof_text = htmlspecialchars($prof_text, ENT_QUOTES | ENT_HTML5, 'UTF-8'); $sql = "UPDATE USER_TABLE SET prof_text = :prof_text, user_name = :user_name WHERE user_id = :user_id"; $stmt = $db->prepare($sql); $stmt->bindValue(':user_id', $_SESSION['user_id']); $stmt->bindValue(':user_name', $user_name); $stmt->bindValue(':prof_text', $prof_text); $stmt->execute(); } if($prof_image_path != ''){ $sql = "UPDATE USER_TABLE SET prof_image_path = :prof_image_path WHERE user_id = :user_id"; $stmt = $db->prepare($sql); $stmt->bindValue(':user_id', $_SESSION['user_id']); if($prof_image_path != 'clear') $stmt->bindValue(':prof_image_path', $prof_image_path); else $stmt->bindValue(':prof_image_path', ''); $stmt->execute(); } } |