データベースから取得した値がページに表示されない
Q&A
Closed
DBから取得した値をページに表示させたい
MAMPを利用してPHP,MySQLをつかって個人開発を行っています
このプログラムはscheduleを追加、閲覧するためのページです。
scheduleテーブルの値をページに表示したいと思っているのですが、何も表示されません。
PHPを学んだ直後のアウトプットとして個人開発をしているのですが、とりあえず汚くても作り上げることを目標としているため、見ての通りぐちゃぐちゃです。そのため、バグを直すとさらに別のバグが発生することが多々あり、今回はChatGPTに聞いても解決策が見つからなかったため皆さんのお力を借りたいと思い投稿しました。
発生している問題
該当箇所はこちらです
whileループの直前でvar_dump($destination)等を試した際は値が表示されたのでstmt->fetchあたりに問題がある気はするのですが、問題の解決策は思いつきませんでした...
dbから持ってきた値を変数に保存できていないからかと思ったのですが、保存はできているみたいです...
<!-- 一行ずつ代入 -->
<?php while ($stmt->fetch()): ?>
<section class="timeline">
<div class="action_time"><?php echo h($time); ?></div>
<p class="action_title"><?php echo h($destination); ?></p>
<div class="action_memo">
<p><?php echo h($memo); ?></p>
</div>
</section>
<?php endwhile; ?>
該当するソースコード
<?php
require('../functions.php');
$db = dbconnect();
// 画面に表示する処理
// urlパラメーターがtravels.urlと一致するものを取得
$stmt = $db->prepare('SELECT travels.id, destination, time, /*transportation, */memo FROM schedules
JOIN travels ON schedules.travels_r_id = travels.id
WHERE travels.url = ?');
if (!$stmt) {
die($db->error);
}
// urlパラメーターを取得して代入
$url = filter_input(INPUT_GET, 'id', FILTER_DEFAULT);
$stmt->bind_param('s', $url);
$success = $stmt->execute();
if(!$success) {
die($db->error);
}
// dbから受け取った値を代入する変数を用意
$stmt->bind_result($id, $destination, $time, $memo);
// 結果セットをメモリに格納する
$stmt->store_result();
// すべての行を取得する
while ($stmt->fetch()) {
// travelテーブルのidと紐づけるために変数に代入
$travels_r_id = $id;
// scheduleの追加
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$form['destination'] = filter_input(INPUT_POST, 'destination', FILTER_DEFAULT);
if ($form['destination'] === "") {
$error['destination'] = 'blank';
}
$form['memo'] = filter_input(INPUT_POST, 'memo', FILTER_DEFAULT);
$form['time'] = filter_input(INPUT_POST, 'time', FILTER_DEFAULT);
if ($form['time'] === "") {
$error['time'] = 'blank';
}
$form['googlemap_url'] = filter_input(INPUT_POST, 'googlemap_url', FILTER_DEFAULT);
// dbに登録
$stmt_while = $db->prepare('insert into schedules (travels_r_id, destination, time, memo) values(?,?,?,?)');
if(!$stmt_while) {
die($db->error);
}
$stmt_while->bind_param('isss', $travels_r_id, $form['destination'], $form['time'], $form['memo']);
$success = $stmt_while->execute();
if(!$success) {
die($db->error);
}
$stmt_while->close(); // 追加した行
header('Location: schedule.php?id=' . $url);
exit();
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../common.css">
<link rel="stylesheet" href="css/schedule.css">
<title>基本となるページ</title>
</head>
<body>
<header class="header">
<div class="header-inner">
<h1>LOGO</h1>
</div>
</header>
<main class="main">
<div class="header-site-menu">
<nav class="site-menu">
<ul>
<li><a href="schedule.html">schedule</a></li>
<li><a href="places.html">places</a></li>
<li><a href="checklists.html">list</a></li>
</ul>
</nav>
</div>
<div class="shiori">
<div class="title">
<h1>schedule</h1>
</div>
<div class="x-days">
<!-- 一行ずつ代入 -->
<?php while ($stmt->fetch()): ?>
<section class="timeline">
<div class="action_time"><?php echo h($time); ?></div>
<p class="action_title"><?php echo h($destination); ?></p>
<div class="action_memo">
<p><?php echo h($memo); ?></p>
</div>
</section>
<?php endwhile; ?>
<div class="open-area">
<label class="open" for="pop-up">✙</label>
</div>
</div>
</div>
<input type="checkbox" id="pop-up">
<div class="overlay">
<div class="window">
<label class="close" for="pop-up">×</label>
<h3>?日目</h3>
<form action="" method="post">
<dl class="form-area">
<label for="destination">
<dt>場所</dt>
<dd><input class="textarea" type="text" name="destination"></dd>
</label>
<label for="memo">
<dt>メモ</dt>
<dd><input class="textarea" type="text" name="memo"></dd>
</label>
<label for="time">
<dt>時間</dt>
<dd><input class="textarea" type="datetime" name="time"></dd>
</label>
<label for="googlemap_url">
<dt>googlemap</dt>
<dd><input class="textarea" type="text" name="googlemap_url"></dd>
</label>
<button type="submit">追加する</button>
</dl>
</form>
</div>
</div>
</main>
<footer class="footer">
<div class="copyright">@tabibookmarks</div>
</footer>
</body>
</html>
発生している問題
該当箇所はこちらです
whileループの直前でvar_dump($destination)等を試した際は値が表示されたのでstmt->fetchあたりに問題がある気はするのですが、問題の解決策は思いつきませんでした...
dbから持ってきた値を変数に保存できていないからかと思ったのですが、保存はできているみたいです...
<!-- 一行ずつ代入 -->
<?php while ($stmt->fetch()): ?>
<section class="timeline">
<div class="action_time"><?php echo h($time); ?></div>
<p class="action_title"><?php echo h($destination); ?></p>
<div class="action_memo">
<p><?php echo h($memo); ?></p>
</div>
</section>
<?php endwhile; ?>
追記 修正後のソースコード
whileループ内で配列に保存しました。ただ、これでもうまく表示されません。
<?php
require('../functions.php');
$db = dbconnect();
// 画面に表示する処理
// urlパラメーターがtravels.urlと一致するものを取得
$stmt = $db->prepare('SELECT travels.id, destination, time, /*transportation, */memo FROM schedules
JOIN travels ON schedules.travels_r_id = travels.id
WHERE travels.url = ?');
if (!$stmt) {
die($db->error);
}
// urlパラメーターを取得して代入
$url = filter_input(INPUT_GET, 'id', FILTER_DEFAULT);
$stmt->bind_param('s', $url);
$success = $stmt->execute();
if(!$success) {
die($db->error);
}
// dbから受け取った値を代入する変数を用意
$stmt->bind_result($id, $destination, $time, $memo);
// 結果セットをメモリに格納する
$stmt->store_result();
// 変数宣言
$timeline = [
'time'=>'',
'destination'=>'',
'memo'=>''
];
// すべての行を取得する
while ($stmt->fetch()) {
// travelテーブルのidと紐づけるために変数に代入
$travels_r_id = $id;
// 取得した行を変数に代入
$timeline['time'] = $time;
$timeline['destination'] = $destination;
$timeline['memo'] = $memo;
// scheduleの追加
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$form['destination'] = filter_input(INPUT_POST, 'destination', FILTER_DEFAULT);
if ($form['destination'] === "") {
$error['destination'] = 'blank';
}
$form['memo'] = filter_input(INPUT_POST, 'memo', FILTER_DEFAULT);
$form['time'] = filter_input(INPUT_POST, 'time', FILTER_DEFAULT);
if ($form['time'] === "") {
$error['time'] = 'blank';
}
$form['googlemap_url'] = filter_input(INPUT_POST, 'googlemap_url', FILTER_DEFAULT);
// dbに登録
$stmt_while = $db->prepare('insert into schedules (travels_r_id, destination, time, memo) values(?,?,?,?)');
if (!$stmt_while) {
die($db->error);
}
$stmt_while->bind_param('isss', $travels_r_id, $form['destination'], $form['time'], $form['memo']);
$success = $stmt_while->execute();
if (!$success) {
die($db->error);
}
$stmt_while->close(); // 追加した行
header('Location: schedule.php?id=' . $url);
exit();
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../common.css">
<link rel="stylesheet" href="css/schedule.css">
<title>基本となるページ</title>
</head>
<body>
<header class="header">
<div class="header-inner">
<h1>LOGO</h1>
</div>
</header>
<main class="main">
<div class="header-site-menu">
<nav class="site-menu">
<ul>
<li><a href="schedule.html">schedule</a></li>
<li><a href="places.html">places</a></li>
<li><a href="checklists.html">list</a></li>
</ul>
</nav>
</div>
<div class="shiori">
<div class="title">
<h1>schedule</h1>
</div>
<div class="x-days">
<!-- 一行ずつ代入 -->
<?php while ($timeline[] = $stmt->fetch()): ?>
<section class="timeline">
<div class="action_time"><?php echo h($timeline['time']); ?></div>
<p class="action_title"><?php echo h($timeline['destination']); ?></p>
<div class="action_memo">
<p><?php echo h($timeline['memo']); ?></p>
</div>
</section>
<?php endwhile; ?>
<div class="open-area">
<label class="open" for="pop-up">✙</label>
</div>
</div>
</div>
<input type="checkbox" id="pop-up">
<div class="overlay">
<div class="window">
<label class="close" for="pop-up">×</label>
<h3>?日目</h3>
<form action="" method="post">
<dl class="form-area">
<label for="destination">
<dt>場所</dt>
<dd><input class="textarea" type="text" name="destination"></dd>
</label>
<label for="memo">
<dt>メモ</dt>
<dd><input class="textarea" type="text" name="memo"></dd>
</label>
<label for="time">
<dt>時間</dt>
<dd><input class="textarea" type="datetime" name="time"></dd>
</label>
<label for="googlemap_url">
<dt>googlemap</dt>
<dd><input class="textarea" type="text" name="googlemap_url"></dd>
</label>
<button type="submit">追加する</button>
</dl>
</form>
</div>
</div>
</main>
<footer class="footer">
<div class="copyright">@tabibookmarks</div>
</footer>
</body>
</html>
0