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

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

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

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

Q&A

解決済

2回答

413閲覧

データベースに格納した値を表示する方法

newyee

総合スコア213

PHP

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

0グッド

0クリップ

投稿2019/04/05 02:08

PHPの学習において、掲示板を作成していたのですが、データベースに格納しています値を、表示する際に、少しうまくいかず解決できない部分がある為、お力をお貸しいただけましたら幸いです。
以下は、データベースの値を表示する部分である、「bbs.php」になります。

<?php require_once 'config.php'; require_once 'db_connect.php'; $page = 0; $num = 10; if(isset($_GET['page']) && $_GET['page'] > 0){ $page = intval($_GET['page']) -1; } $db = db_connection(DSN,DB_USERNAME,DB_PASSWORD); $stmt = $db->prepare(" SELECT name,title,comment,date FROM post_2 ORDER BY date DESC LIMIT :page, :num "); $page = $page * $num; $stmt->bindValue(':num',$num,PDO::PARAM_INT); $stmt->bindValue(':page',$page,PDO::PARAM_INT); $stmt->execute(); $result = $stmt->fetch(); var_dump($result); ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>掲示板</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" media="screen" href="main.css"> <script src="main.js"></script> </head> <body> <h1>掲示板</h1> <form action="write.php" method="post"> <p>名前:<input type="text" name="name"></p> <p>タイトル:<input type="text" name="title"></p> <textarea name="comment" cols="50" rows="5"></textarea> <p>削除パスワード(数字4桁):<input type="text" name="password"></p> <input type="submit"value="書き込む"> </form> <hr> <?php while($row = $stmt->fetch()): $title = $row['title'] ? $row['title'] : '(無題)'; ?> <p>名前:<?= $row['name'] ?></p> <p>タイトル:<?= $title ?></p> <p>本文:<?= $row['comment'] ?></p> <p>日付:<?= $row['date'] ?></p> <?php endwhile; ?> </body> </html>

以下は設定ファイルである、「config.php」です。

php

1<?php 2error_reporting(E_ALL); 3ini_set("display_errors",1); 4define('DSN','mysql:host=localhost;dbname=online_bbs;charset=utf8'); 5define('DB_USERNAME', 'root'); 6define('DB_PASSWORD', '12345');

以下はPDOインスタンスを生成する処理などをまとめた、「db_connect.php」です

php

1<?php 2function db_connection($dsn,$user,$password){ 3 $db = new PDO($dsn,$user,$password); 4 $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 5 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 6 return $db; 7}

以下はデータベースにデーターを格納する処理を記載した、「write.php」です。

php

1<?php 2 3require_once 'db_connect.php'; 4require_once 'config.php'; 5 6$err = []; 7 8if(!empty($_POST)){ 9 10 $name = filter_input(INPUT_POST,'name',FILTER_SANITIZE_SPECIAL_CHARS); 11 $comment = filter_input(INPUT_POST,'comment',FILTER_SANITIZE_SPECIAL_CHARS); 12 $password = filter_input(INPUT_POST,'password',FILTER_SANITIZE_SPECIAL_CHARS); 13 $title = filter_input(INPUT_POST,'title',FILTER_SANITIZE_SPECIAL_CHARS); 14 15 if(!$name){ 16 $err['name'] = '名前が入力されていません'; 17 } 18 19 if(!$comment){ 20 21 $err['comment'] = '本文が入力されていません'; 22 23 } 24 25 if(!$password){ 26 27 $err['password'] = 'パスワードが入力されていません'; 28 29 }elseif(!preg_match("/^[0-9]{4}$/",$password)) 30 { 31 $err['password'] = 'パスワードは数字4文字で入力してください'; 32 } 33 34 if(!$title){ 35 36 if(strlen($title) > 255) 37 { 38 $err['comment'] = '本文は255文字以内で入力して下さい'; 39 } 40 41 } 42 43 if(empty($err)){ 44 45 try{ 46 47 $db = db_connection(DSN,DB_USERNAME,DB_PASSWORD); 48 $stmt = $db->prepare(" 49 INSERT INTO post_2 (name,title,comment,date,password) 50 VALUES(:name,:title,:comment,now(),:password) 51 "); 52 53 $stmt->bindValue(':name',$name,PDO::PARAM_STR); 54 $stmt->bindValue(':title',$title,PDO::PARAM_STR); 55 $stmt->bindValue(':comment',$comment,PDO::PARAM_STR); 56 $stmt->bindValue(':password',$password,PDO::PARAM_STR); 57 $stmt->execute(); 58 header('Location:bbs.php'); 59 exit(); 60 }catch(PDOException $e){ 61 62 die('エラー:' . $e->getMessage()); 63 64 } 65 66 } 67 68} 69 70?> 71<!DOCTYPE html> 72<html> 73<head> 74 <meta charset="utf-8"> 75 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 76 <title>Page Title</title> 77 <meta name="viewport" content="width=device-width, initial-scale=1"> 78 <link rel="stylesheet" type="text/css" media="screen" href="main.css"> 79 <script src="main.js"></script> 80</head> 81<body> 82 <?php if(count($err) >= 1): ?> 83 <h3>エラー!</h3> 84 85 <?php foreach($err as $value): ?> 86 87 <p> 88 <?=$value?> 89 </p> 90 91 <?php endforeach; ?> 92 93 <?php endif;?> 94</body> 95</html> 96

データベースのテーブル内に格納されている値は、以下の2つです。
イメージ説明
引っかかってしまっている部分なのですが、「bbs.php」のwhile文の中で、テーブルに格納されている2つのデータを表示したいのですが、画面には1つ目のデータしか表示されません。さらに、プリペアードステートメントを設定する際に、「ORDER BY date」としているにも関わらず、日付が古い、「id」が1のデーターが表示されてしまっている状態です。
上記2点につきまして、ご助言頂けましたら幸いです。よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

よく見たら、

PHP

1 2$result = $stmt->fetch(); 3var_dump($result); 4

で一回fetch()しちゃってるのが原因の様な気がします。
そこを削って駄目なら当初の回答を確認してみてください。

PDOStatement::fetch
の内容とサンプルをよく確認してみてください。


[当初の回答]

PHP

1$stmt = $db->prepare(" 2 SELECT name,title,comment,date FROM post_2 ORDER BY date DESC LIMIT :page, :num 3");

でLIMIT句を指定しているので、その後の処理で:page:numが想定通りの値になっていないんだと思われます。

mysql limit句あたりで検索してみて、実行しようとしているSQLが何を意味しているか、
bindValue()している値がどうなっているかを確認してみてください。

投稿2019/04/05 02:26

編集2019/04/05 02:33
tanat

総合スコア18709

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

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

newyee

2019/04/05 02:40

ご回答頂きありがとうございます。 「$result = $stmt->fetch(); var_dump($result);」 ここの部分を削除しましたら、テーブルの2つの値が、日付も新しい順に表示されました。 一度、中に入っている値をvar_dumpして確認する為、変数に入れていたのですが、ここが原因になっていたとは、盲点でした...
tanat

2019/04/05 02:44

オブジェクトのメソッドを実行すると、 オブジェクトの状態が変わる事はよくあるので、 var_dump()で確認する場合はメソッドを実行して確認するのは避けた方がいいですね。 fetch()がどういった挙動をするかはリンクのPHPマニュアルのサンプルでよくわかると思うので、確認してみてください。
guest

0

PDOStatement::fetch()結果セットから次の行を取得するもの。
もし「データがきちんと取れているか」確認したいのであればデバッグとしては「全データ想定したものか」確認すべきなのでPDOStatement::fetchAll()使ってください。

でないと、下記のように書かれているので、whileでは2件目から取得し始めているはずです。

php

1$result = $stmt->fetch(); 2 3while($row = $stmt->fetch()): 4//略 5}

※デバッグのために入れたのはvar_dump()使っていることからわかりますが、質問提示の際にはコメントアウトしておきましょう。でないと回答者としてはそこも突っ込まなければならなくなります

あとは既に回答が出ているように、bindValue()でセットしている値を実際にSQLにセットしたSQLを作り、
PHPからではなくMySQLならMySQLに対して直接SQLを実行し、想定しているデータがとれるかを確認してください。
MySQLは外部の仕組みです。プログラムから利用する前に、実際に想定したデータがとれるSQLを作って正しく結果を得られてからプログラムに組み込むのが確実です。
直接実行して想定通り動かないものは外部から使っても想定通り動くはずがありません。
あとはプログラムで動的に作っているのならそこが「想定通りにできたものか確認すること」これもデバッグの1種で、問題切り分けのための必須事項です。


また、HTML表示が前提なら、whileでfetch()しつつ回すのではなくて、そもそもfetchAll()にPDO::FETCH_ASSOCオプションつけて取得してきてforeachなりforなりで回すほうが良いです。

HTML表示のために変数を準備する場合には,多くは配列として持っておく方が都合がいいので,後に紹介する PDOStatement::fetchAll メソッドの使用を検討してください.

投稿2019/04/05 02:44

編集2019/04/05 03:11
m.ts10806

総合スコア80765

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

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

newyee

2019/04/05 10:14

どうもです。 参考になりました
m.ts10806

2019/04/05 10:21

参考になったようで何よりです。 PHPマニュアルの確認とデバッグの仕方次第で問題解決までのスピード感と着実性が天と地ほど違ってくるので、必ずおさえてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問