質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

4回答

2660閲覧

PDOで簡易的な掲示板

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2017/10/02 05:41

編集2017/10/02 05:51

ご覧いただきありがとうございます。
プログラミング初心者で勉強のため、簡易的な掲示板を作成しているのですが、
Formに打ち込んだ際にページをリロードしないと、打ち込んだ内容が画面に反映されません。
解決方法などはありますでしょうか?

PHP

1ファイル名[talk.php] 2スレッドのidでpostのデータを引っ張ってきています。 3<?php 4require_once(__DIR__ . '/config.php'); 5require_once(__DIR__ . '/Controll.php'); 6 7 8$user = new \MyApp\Controll(); 9 10$sledid = $_POST["id"]; //sledのid 11 12$posts = $user->getPosts(); 13 14if ($_SERVER['REQUEST_METHOD'] === 'POST') { 15 if(!empty($_POST['body'])){ 16 $user->post(); 17 header('location:talk.php'); 18exit(); 19} 20} 21 22?> 23<!DOCTYPE html> 24<html lang="ja"> 25 <head> 26 <meta charset="utf-8"> 27 <title>KENJA</title> 28 </head> 29 <body> 30 <?php print_r($sledid); ?> 31 <div class="container"> 32 <div class="watch"> 33 <ul> 34 <?php foreach($posts as $post => $values): ?> 35 <?php if($post==$sledid): ?> 36 <?php foreach($values as $value) :?> 37 <li>名前:<?= h($value['name']);?> 本文:<?= h($value['body']); ?></li> 38 <?php endforeach; ?> 39 <?php endif; ?> 40 <?php endforeach; ?> 41 </ul> 42 </div> 43 <div class="write"> 44 <form action="" method="post"> 45 <input type="hidden" name="id" value="<?= $sledid;?>"> 46 <p>名前<input type="text" name="username" value=""></p> 47 <p>本文<input type="text" name="body" value=""></p> 48 <input type="submit" name="" value="挿入"> 49 </form> 50 </div> 51 </div> 52 </body> 53</html> 54

php

1<?php 2ファイル名[Controll.php] 3 4namespace MyApp; 5 6class Controll{ 7 public $_db; 8 public function __construct(){ 9 // データベースアクセス 10 $this->_db = new \PDO(DSN,DB_USERNAME,DB_PASSWORD); 11 } 12 13 public function getData(){ 14 $sql = 15 "select 16 categories.ctgname, 17 tags.id, 18 tags.tag_id, 19 tags.tag_name 20 from 21 categories INNER JOIN tags ON tags.tag_id = categories.id"; 22 $stmt = $this->_db->query($sql); 23 $datas = $stmt->fetchAll(\PDO::FETCH_GROUP); 24 return $datas; 25 } 26 27 public function getSleds(){ 28 $sql = 29 "select 30 sleds.id, 31 sleds.sled_id, 32 sleds.sled_name 33 from tags INNER JOIN sleds ON sleds.sled_id = tags.id"; 34 35 $stmt = $this->_db->query($sql); 36 $sleds = $stmt->fetchAll(\PDO::FETCH_GROUP); 37 return $sleds; 38 } 39 40 public function getPosts(){ 41 $sql = 42 "select 43 posts.post_id, 44 posts.name, 45 posts.body 46 from sleds INNER JOIN posts ON posts.post_id = sleds.id"; 47 48 $stmt = $this->_db->query($sql); 49 $posts = $stmt->fetchAll(\PDO::FETCH_GROUP); 50 return $posts; 51 } 52 53 public function post(){ 54 $sql = "insert into posts (post_id,name,body) values (:post_id,:name,:body)"; 55 $stmt = $this->_db->prepare($sql); 56 $stmt->bindParam(':post_id',$_POST['id']); 57 $stmt->bindParam(':name',$_POST['username']); 58 $stmt->bindParam(':body',$_POST['body']); 59 $stmt->execute(); 60} 61 62 63 64 65 66 67 68}

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

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

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

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

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

m.ts10806

2017/10/02 05:45

PHPソースの書かれているファイル名をそれぞれ明示してください。
guest

回答4

0

PHP

1if ($_SERVER['REQUEST_METHOD'] === 'POST') { 2 if(!empty($_POST['body'])){ 3 $user->post(); 4 header('location:talk.php'); 5exit(); 6} 7}

なるほど、掲示板に書き込んだら同じページにリダイレクトして表示しようとしてるね。
方向性は正しいけど正しい書式じゃないから上手く動いてないだけだね。

RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1

14.30 Location
Location = "Location" ":" absoluteURI

つまりこう書かなきゃいけない。

PHP

1// 正しい書式 2header('Location: http://example.com/talk.php'); 3 4// 質問文の書式 5header('location:talk.php');

正式には絶対パス(ドメイン含む)で書く必要があるね。
なんか記事漁ってると相対パスでも動いてるっぽいけど…

とりあえず2点修正みてね。

  • location: -> Location:に修正
  • :の後に半角スペースを入れる

参考になりそうな情報を下記に載せるから、あとは色々試しつつ頑張ってみて

投稿2017/10/02 06:12

miyabi-sun

総合スコア21158

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

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

退会済みユーザー

退会済みユーザー

2017/10/02 06:49

ご回答ありがとうございます。 ご指摘いただいた通りに変更してみました。headeですが今後同じ事がないように気をつけます。 教えていただきありがとうございました。 しかしやはりsubmit後に$sledid = $_POST["id"];のidのエラー(Notice: Undefined index: id)が出てしまいました。 talk.phpのこの$_POST["id"]のidはsled.php(正しくはthreadと教えていただきました)というファイルのフォーム(method=post)でtalk.phpに渡しているのですが何か関係ありますでしょうか?
miyabi-sun

2017/10/02 07:25

そもそもtalk.phpなんだから、何かを投稿する専門のページなんじゃないの? 画面の表示ページにリダイレクトさせなきゃ。
guest

0

PHP

1header('location:talk.php');

この行の意図は、投稿された内容をDBに保存したら、リダイレクトで自分自身に戻ってきて画面を更新する、という意図で合っていますか?その場合、リダイレクト後のHTTPメソッドはGETになるため、以下の行で取得している$sledidは取れません。

PHP

1$sledid = $_POST["id"]; //sledのid

以下のようにしてみてはどうでしょう。

PHP

1 2// $_REQUESTならPOSTでもGETでも値が取れる 3$sledid = $_REQUEST["id"]; //sledのid 4 5 6if ($_SERVER['REQUEST_METHOD'] === 'POST') { 7 if(!empty($_REQUEST['body'])){ 8 $user->post(); 9 // リダイレクト時にGETパラメータとしてidを付与する 10 header('location:talk.php?id=' . $sledid); 11 exit(); 12 } 13} 14// $postsはGET時にしか用はないので後に持ってくる 15$posts = $user->getPosts();

ついでにいうと掲示板のスレッドの綴りはThread(糸という意味)です。Sledはそり(乗り物)です。

投稿2017/10/02 06:15

masaya_ohashi

総合スコア9206

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

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

masaya_ohashi

2017/10/02 06:17 編集

Oh、Locationの書き方にも問題があったのですね…miyabi-sunさんの回答を参考にしてください。
退会済みユーザー

退会済みユーザー

2017/10/02 06:44

ご回答ありがとうございます。 miyabi-sunさんとmasaya_ohashiさんのご意見を両方とも試してみました。 $_POST->$_REQUESTに変更してみましたが、挿入したらやはり同じエラー(Notice: Undefined index: id) が表示されてしまいました。 talk.phpのこの$_POST["id"]のidはsled.php(ご指摘いただきありがとうございます、後で直します!)というファイルのフォーム(method=post)でtalk.phpに渡しているのですが何か関係ありますでしょうか?
masaya_ohashi

2017/10/02 06:48

投稿の処理のときは確かにformからpostでidが渡されていますが、閲覧の処理のときはpostデータが無いためidを取ることが失敗しているはずです。まずそもそも最初にtalk.phpへアクセスする時はどうやっているんですか?idはどこから指定するのでしょう?
退会済みユーザー

退会済みユーザー

2017/10/02 06:54 編集

<?php foreach($sleds as $sled => $selectSleds) :?> <form action="talk.php" method="post"> <input type="hidden" name="id" value="<?= $sled;?>"> <?php foreach ($selectSleds as $selectSled) :?> <?php if($selectSled['sled_id']==$id): ?> <a href="talk.php"> <input type="submit" name="sledname" value="<?php echo $selectSled['sled_name'] ;?>"> </form> </a> <?php endif; ?> <?php endforeach; ?> <?php endforeach; ?> こちらがsled.phpのbody部で、配列$sledsはControll.phpのgetSleds()で取得しています。 idは3行目のinput hiddenでtalk.phpに渡しております
guest

0

submitしたら、登録・更新・削除した後にデータを呼び出す処理を入れるだけでは?

投稿2017/10/02 05:49

yambejp

総合スコア114747

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

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

退会済みユーザー

退会済みユーザー

2017/10/02 06:01

回答いただきありがとうございます。 登録はControll.phpのpost()で間違いなどございませんでしょうか? また更新、削除について、もしよろしければ詳しく教えていただければ幸いです。
guest

0

ベストアンサー

解決かどうかはわからないのですが、初心者なりに頭を絞って、考えてみました。
config.phpにsession_start()を仕込み、

<?php require_once(__DIR__ . '/config.php'); require_once(__DIR__ . '/Controll.php'); $user = new \MyApp\Controll(); //sledのid 変更箇所 if($_POST[("id")]){ $_SESSION["id"] = $_POST["id"]; } $sledid = $_SESSION["id"]; if ($_SERVER['REQUEST_METHOD'] === 'POST') { if(!empty($_POST['body'])){ $user->post(); } } $posts = $user->getPosts(); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>KENJA</title> </head> <body> <?php print_r($sledid); ?> <div class="container"> <div class="watch"> <ul> <?php foreach($posts as $post => $values): ?> <?php if($post==$sledid): ?> <?php foreach($values as $value) :?> <li>名前:<?= h($value['name']);?> 本文:<?= h($value['body']); ?></li> <?php endforeach; ?> <?php endif; ?> <?php endforeach; ?> </ul> </div> <div class="write"> <form action="" method="post"> <input type="hidden" name="id" value="<?= $sledid;?>"> <p>名前<input type="text" name="username" value=""></p> <p>本文<input type="text" name="body" value=""></p> <input type="submit" name="" value="挿入"> </form> </div> </div> </body> </html>

とすると無事、フォームを入力しsubmitすると勝手にリロード(なぜ勝手にリロードするのかは理解できていません)して、エラーもなく表示することができました。
この方法に関する問題点、指摘等ありましたらぜひお願いいたします!

投稿2017/10/02 07:10

編集2017/10/02 07:11
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問