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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

0回答

857閲覧

todoリストの詳細ページにテーブルの情報を表示したいが上手くいかない

nanapon

総合スコア8

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

1クリップ

投稿2020/11/08 07:22

編集2020/11/08 11:37

実現したい事、困っている事

index.phpにあるtodoリスト一覧の項目をクリックすると、項目のidに紐付いた詳細ページ(detail.php)に飛び、todoリストの詳細を
表示できるようにしたいです。

まずはtodoリストの項目の名前のみ表示しようと思っていますが、表示ができません。

開発の環境等について

・PHPのバージョン:7.4.10
・xamppを使用しています。
・DBには接続できています。

php

1<?php ----index.phpのファイル---- ?> 2 3<?php 4require_once('config.php'); 5require_once('common.php'); 6 7$pdo = new PDO(DSN, DB_USER, DB_PASS); 8 9$todo = $pdo->prepare("SELECT * FROM todo_add ORDER BY todo_name DESC"); 10$todo->execute(); 11 12?> 13 14<!doctype html> 15<html> 16<head> 17<meta charset="utf-8"> 18<meta name="viewport" content="width=device-width, initial-scale=0"> 19<title>todoリスト</title> 20<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@700&display=swap" rel="stylesheet"> 21<link href="css/base.css" rel="stylesheet" type="text/css"> 22<link href="css/common.css" rel="stylesheet" type="text/css"> 23<link href="css/top.css" rel="stylesheet" type="text/css"> 24<script src="js/jquery-3.4.1.min.js"></script> 25<script type="text/javascript" src="js/test.js"></script> 26</head> 27<body> 28 <main> 29 <h1>Todoリスト</h1> 30 <section class="program_wrapper"> 31 <div class="program_area"> 32 <div class="new_add_block"> 33 <a class="blue_btn" href="add.php">todoを追加する</a> 34 </div><!--/.new_add_block --> 35 <div class="todo_list_block"> 36 <h2 class="blue_hd"><span class="name">todo名</span><span class="deadline">〆切日</span><span class="important">重要度</span></h2> 37 <form method="post" action="delete.php"> 38 <ul class="todo_list"> 39 <?php foreach($todo as $loop): ?> 40 <li> 41 <input class="checkbox" type="checkbox" value="" name="check"> 42 <a class="todo_link" href="detail.php?id=<?php= $loop['id'] ?>"> 43 <?php echo $loop["todo_name"] ?></a> 44 45 <p class="todo_deadline"> 46 <?php 47 if($loop["todo_deadline"] === '0000-00-00'){ 48 echo ''; 49 }else{ 50 echo $loop["todo_deadline"]; 51 } 52 ?> 53 </p> 54 <p class="todo_important"><?php echo $loop["todo_important"] ?></p> 55 </li> 56 <?php endforeach; ?> 57 </ul><!--/.todo_list --> 58 <input class="complete_btn" type="submit" value="削除する" name="complete_btn"> 59 </form> 60 </div><!--/.todo_list_block --> 61 </div><!--/.program_area --> 62 </section><!--/.program_wrapper --> 63<section class="section_2"> 64</section> 65</main> 66<script type="text/javascript" src="js/test2.js"></script> 67</body> 68</html> 69

php

1<?php ----detail.phpのファイル---- ?> 2 3<?php 4require_once('config.php'); 5require_once('common.php'); 6 7$id = $_GET['id']; 8 9var_dump($id); 10 11$pdo = new PDO(DSN, DB_USER, DB_PASS); 12$todo = $pdo->prepare("SELECT * FROM todo_add WHERE id = :id"); 13$todo->bindParam(":id", $id); 14$todo->execute(); 15 16?> 17 18<!doctype html> 19<html> 20<head> 21<meta charset="utf-8"> 22<meta name="viewport" content="width=device-width, initial-scale=0"> 23<title>todoリスト</title> 24<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@700&display=swap" rel="stylesheet"> 25<link href="css/base.css" rel="stylesheet" type="text/css"> 26<link href="css/common.css" rel="stylesheet" type="text/css"> 27<link href="css/top.css" rel="stylesheet" type="text/css"> 28<script src="js/jquery-3.4.1.min.js"></script> 29<script type="text/javascript" src="js/test.js"></script> 30</head> 31<body> 32 <main> 33 <section class="detail_wrapper"> 34 <?php foreach($todo as $loop): ?> 35 <h1><?php echo $loop['todo_name'] ?></h1> 36 <?php endforeach; ?> 37 </section><!--/.detail_wrapper --> 38<section class="section_2"> 39</section> 40</main> 41<script type="text/javascript" src="js/test2.js"></script> 42</body> 43</html> 44

試した事

detail.phpの $sql = "SELECT * FROM todo_add WHERE id = " . $id; で、
index.phpから受け取ったidの数字とテーブルにあるidの数字が一致した場合、
該当するテーブルの行を取得し、画面に表示しようとしましたが何も表示されません。

ご回答よろしくお願い致します。

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

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

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

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

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

ockeghem

2020/11/08 09:48

質問に対する回答ではありませんが、FILTER_SANITIZE_SPECIAL_CHARSを使うのはやめましょう。そして、表示の際にhtmlspecialcharsを使いましょう。現実的な問題として、SQLインジェクション脆弱性がありますよ。なので、プレースホルダを用いて、SQLインジェクション対策をしましょう。 詳しくは以下の過去Q&Aに書きました。 https://teratail.com/questions/183529
nanapon

2020/11/08 10:30

ご回答ありがとうございます。 FILTER_SANITIZE_SPECIAL_CHARSの使用を止めて、$id = h($_GET['id']);と書きました。 todoリストの新規追加機能にはbindParam()を使用してSQLインジェクション対策を行っております。 一つお聞きしたいのですが、 todoリストの一覧表示は、ユーザーがSQLを入力できる場所が無いのでSQLインジェクション対策は必要無いと思ったのですが、 この認識で合っておりますでしょうか。
ockeghem

2020/11/08 10:48

var_dump($id)はデバッグだと思いますが、これを別にすると、$idを表示する箇所はないですよね。であれば、h()関数はそもそも必要ありません。そして、「todoリストの新規追加機能にはbindParam()を使用して」とありますが、detail.php のSELECT でSQLインジェクション脆弱性があります。
nanapon

2020/11/08 11:39

確かに$_GET['id']はhtmlに表示するものではないのでh()関数は必要なかったですね。 detail.phpのSQLの$idは変動する値なのでSQLインジェクション対策が必要という事ですね。
ockeghem

2020/11/08 12:54

はい。必須です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問