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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

Q&A

解決済

2回答

1022閲覧

PHPでSQL内容をWEBブラウザに表示したいです

EOU818

総合スコア45

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

0グッド

1クリップ

投稿2022/10/10 14:04

編集2022/10/10 15:32

実現したいこと

HTMLのFormタッグで作ったFormにデータを入力して、
もしSQLに値があれば、指定された1レコード分の資料をWEBブラウザに反映して欲しいです。

発生している問題・エラーメッセージ

Warning: Undefined array key "id" in C:\xampp\htdocs\...\search.php on line 3 Warning: Undefined array key "user_name" in C:\xampp\htdocs\...\search.php on line 4

試したこと

  1. INSERT文でデータをデータベースに入力することは問題ないです。
  2. SELECT文でデータを""全部""WEBブラウザに表示するのは問題ないです。

  ➡しかし、WHERE文を足したら、ERRORが出てきました。なんかWHERE文後ろに付けている値が取得できなさそうです。
3. 実はもともと下記LINKの内容を真似して作りましたが、ERRORが出てきました...
https://www.sejuku.net/blog/104455

該当のソースコード <form.php>

<!DOCTYPE html> <html lang="en"> <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"> <title>Document</title> </head> <body> <form action="./search.php" method="post" enctype="multipart/form-data"> ID:<input type="text" name="id2"><br> <input type="submit" value="検索"> </form> <?php include('./search.php') ?> <table> <tr> <th>ID</th> <th>User Name</th> </tr> <?php foreach ($data2 as $row) { ?> <tr> <td><?php echo $row['ID']; ?></td> <td><?php echo $row['member_name']?></td> </tr> <?php }?> </table> </body> </html>

該当のソースコード <search.php>

<?php $id2 = $_POST['id2']; $user_name2 = $_POST['user_name']; $dbName = "mysql:host=localhost;dbname=test;charset=utf8"; $userName = "root"; try{ $db = new PDO($dbName, $userName); } catch (\Throwable $th){ exit(); } $sql2 = "SELECT * FROM user_list where ID=".$id2; $sth2 = $db -> prepare($sql2); $sth2 -> execute(); $data2 = $sth2->fetchall(); return $data2;

補足情報(FW/ツールのバージョンなど)

  1. HTMLとPHPを使っています。
  2. WEBブラウザはGOOGLE Chrome

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

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

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

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

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

guest

回答2

0

ベストアンサー

・includeするということは画面表示時に実行されているから、つまりリクエストメソッドはGET。POSTでは参照できない。
・POSTでは参照できてない値を突っ込むことになっているので、WHERE ID = となって、SQLとしては不正。
・そもそも入力しただけで送信してないのでは?
↑起きてる問題の原因。

あとその他。
・user_nameに相当する入力コントロールがない
・例外を握りつぶしている(exit()だけ)
・例外処理を入れているのがDB接続時だけでSQL実行時にはされていない
・テーブル定義次第だが、いずれにしても値をそのままSQLに突っ込んでいてSQLインジェクションの脆弱性がある
・取得できても結果をreturnしているだけで、どこに返しているつもり?
・DBから取得した情報をそのまま出力しているのでXSS可能

formのaction属性は「リクエスト送信先URL」であり、画面遷移と同等です。
returnしたところでどこにも返しません。
現状の構成ではincludeしたsearch.phpでは何もしてないのと同等なのでincludeが邪魔をしている状態。
actionで送信した時のsearch.phpで画面表示までするしかありません。

確かにプログラムは上から実行されますが、
includeはリクエスト送信を待って動くわけではないです。
現状では表示時にはその内部のプログラムも実行されています。

それなら、search.phpなど使用せずに、自身に対して実行して、リクエストメソッドがPOSTかどうかを見た上で、
htmlの出力の前とかで検索させた方が良いのではないでしょうか。

PHP

1//検索結果保持用の配列初期化 2 3//リクエストメソッドPOSTかどうかの確認 4 5 //POSTなら検索処理 6 7 //検索結果保持用の配列に結果を保存 8 9//HTML 10 //form 11 <form method="post" enctype="multipart/form-data"> 12 <!-- action属性の初期値は自身なので不要 --> 13 14 //検索結果保持用の配列の内容次第で出力内容変更 15

投稿2022/10/10 23:33

編集2022/10/11 00:19
m.ts10806

総合スコア80850

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

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

m.ts10806

2022/10/10 23:56 編集

参考先は記事の質の低さや誤った情報を載せていたりでたびたび炎上している先なので、 参考にしてはいけません。 そもそもですが、HTMLの中にロジックが入り込むような構成はごちゃごちゃしてよろしくないですし、 画面アクセス時を考慮せずいきなりPOSTを参照しているのでUndefined array keyが出ます。 XSS対策もされていません。 当然SQLインジェクション対策もされていません。
guest

0

$id2 = $_POST['id'];
$user_name2 = $_POST['user_name'];

このページがPOSTできた時しかid,user_nameが取得できない流れになっています。

GETで来た時の処理も書いてあげることがよいと思います。

投稿2022/10/10 14:16

tokuppee

総合スコア8

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

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

EOU818

2022/10/10 14:31

ご回答ありがとうございます。 GETを試してみましたが、同じ結果が出てきました....(汗) $id2 = $_GET['id']; $user_name2 = $_GET['user_name']; formのmethodもGETに変更します。
tokuppee

2022/10/10 14:44

すいません前回の回答は忘れてください。 POSTで渡っているidがHTMLでは’id2’となっていて、$_POSTでは’id’となっていることが原因ではないかと考えられます。 POSTで送られる情報はformタグの中のinputタグのname属がkeyとなって$_POSTに格納されるといった流れになっています。
EOU818

2022/10/10 15:31

$_POSTに入れる変数をすでに’id’から’id2’に変更しましたが、ERRORが同じ存在しています。 下記通りです。 Warning: Undefined array key "id2" in C:\xampp\htdocs\...\search.php on line 3 Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1 in C:\xampp\htdocs\...\search.php:27 Stack trace: #0 C:\xampp\htdocs\...\search.php(27): PDOStatement->execute() #1 C:\xampp\htdocs\...\form.php(20): include('C:\\xampp\\htdocs...') #2 {main} thrown in C:\xampp\htdocs\...\search.php on line 27 以上、宜しくお願い致します
m.ts10806

2022/10/11 03:31 編集

本回答は間違いではないため、修正依頼するか微妙な内容ですが、 根本原因を捉えた回答ではないと思います(そのあたり含めて私の方で回答しました)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問