前提・実現したいこと
よくわかるPHPの教科書において一言掲示板を作っています。
本に載ってある通りコードを書いて、データベースに記録されているデータが表示されるはずなのですが写真の通り()しか表示されません。
queryがうまくいっていないのでしょうか?
該当のソースコード
index.php
1<?php 2session_start(); 3require('dbconnect.php'); 4 5if(isset($_SESSION['id']) && $_SESSION['time'] + 3600 >time()) { 6 //ログインしている 7 $_SESSION['time'] = time(); 8 9 $members = $db->prepare('SELECT * FROM members WHERE id=? '); 10 $members->execute(array($_SESSION['id'])); 11 $member = $members->fetch(); 12}else{ 13 //ログインしていない 14 header('Location: login.php'); exit(); 15} 16 17//投稿する 18if(!empty($_POST)){ 19 if($_POST['message'] != ''){ 20 $message = $db->prepare('INSERT INTO posts SET member_id=?, message=?, created=NOW()'); 21 $message->execute(array( 22 $member['id'], 23 $_POST['message'] 24 )); 25 26 header('Location: index.php'); exit(); 27 } 28} 29 30//投稿を取得する 31$posts = $db->query('SELECT m.name, m.picutre, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC'); 32?> 33 34<!DOCTYPE html> 35<html lang="ja"> 36 <head> 37 <meta charset="utf-8"> 38 <title></title> 39 </head> 40 <body> 41 <form action="" method="post"> 42 <dl> 43 <dt><?php echo htmlspecialchars($member['name'], ENT_QUOTES); ?>さんメッセージをどうぞ</dt> 44 <dt>メッセージをどうぞ</dt> 45 <dd> 46 <textarea name="message" rows="5" cols="50"></textarea> 47 </dd> 48 </dl> 49 <div > 50 <input type="submit" value="投稿する" /> 51 </div> 52 53 </form> 54<?php 55foreach ((array)$posts as $post): 56?> 57 <div class="msg"> 58 <img src="member_picture/<?php echo htmlspecialchars($post['picture'], ENT_QUOTES); ?>" width="48" height="48" alt="<?php echo htmlspecialchars($post['name'], ENT_QUOTES); ?>" /> 59 <p><?php echo htmlspecialchars($post['message'], ENT_QUOTES); ?><span class="name">(<?php echo htmlspecialchars($post['name'], ENT_QUOTES); ?>)</span></p> 60 <p class="day"><?php echo htmlspecialchars($post['created'], ENT_QUOTES); ?></p> 61 </div> 62<?php endforeach; ?> 63 </body> 64</html> 65
試したこと
もともと、
<?php foreach ($posts as $post): ?>というコードが書かれていたのですが、
<?php foreach ((array)$posts as $post): ?>に書き換えてみて、エラーは出なくなりました。
回答を受けて試したこと
pictureの綴りが間違っていたことに気づき、修正したところDB上では「SELECT m.name, m.picutre, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC;」が上手くいきました。
そこで、pictureの綴りを修正し、もう一度試したところ画像にある通りのエラーが出てしまいました。
さらに試したこと
コードを以下の様に変更したところエラーがなくなりましたが()しか表示されずはじめに戻ってしまいました。
index.phpの一部
1<?php 2foreach ((array)$posts as $post): 3?> 4 <div class="msg"> 5 <img src="member_picture/<?php if(isset($post["picture"])){echo htmlspecialchars($post['picture'], ENT_QUOTES); }?>" width="48" height="48" alt="<?php if(isset($post["name"])){echo htmlspecialchars($post['name'], ENT_QUOTES); }?>" /> 6 <p><?php if(isset($post["message"])){echo htmlspecialchars($post['message'], ENT_QUOTES); }?><span class="name">(<?php if(isset($post["name"])){echo htmlspecialchars($post['name'], ENT_QUOTES); }?>)</span></p> 7 <p class="day"><?php if(isset($post["created"])){echo htmlspecialchars($post['created'], ENT_QUOTES); }?></p> 8 </div> 9<?php endforeach; ?>
var_dumpを使って中身を確認しました。
<?php var_dump($posts); ?>→object(PDOStatement)#3 (1) { ["queryString"]=> string(100) "SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC" }
<?php var_dump($post); ?>→string(100) "SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC"
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/12 08:17
2019/06/12 08:17
2019/06/12 08:23
2019/06/12 08:40
2019/06/12 08:42
2019/06/12 08:43
2019/06/12 08:46