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

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

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

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

789閲覧

表示するテーブルをvalueで指定したい

h_n_k_774

総合スコア3

HTML5

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/12/23 09:22

編集2021/12/23 23:47

前提・実現したいこと

選択されたvalueと同じ名前のDBを作成しています.

選択が変わるごとに毎回DB接続するのが面倒だなと思い,
$query = "select * from $_POST["machine"] order by date desc, time desc";
として,選択ごとに表示されるテーブルを変えようと思ったのですが,エラーが出てしまいました.
これはあきらめてif文を4通り作成したほうがいいのでしょうか?

(12/24 8:46追記
ただ単に選択されたvalue値が変わるたびに //データベース接続 から </table> までの記述を繰り返すのが面倒だったからです.テーブルの中身を確認するだけのページなので,外からいじられないと思いこのような仕様にしました.)

ついでにログイン済みであるかのチェックも効かなくなってしまいました。(二日前までは正常に動いていた)
このままではurlを直接打ち込むと誰でも見れてしまって、、困っています.

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

画面が表示されなくなりました HTTP ERROR 500

該当のソースコード

php

1<!DOCTYPE html> 2<html lang="ja"> 3 4<head> 5 <meta charset="UTF-8"> 6 <link rel="stylesheet" href="../css/admin.css"> 7 <title>-ログイン-</title> 8</head> 9<body> 10 11 <input type="button" onclick="location.href='../login.php'" value="ログアウト"> 12 13 <!--ログインされているかの確認--> 14 <?php 15 session_start(); 16 17 if(!isset($_SESSION["user_name"])) { 18 $no_login_url = "login.php"; 19 header("Location: {$no_login_url}"); 20 exit; 21 } 22 ?> 23 24 <p>電源状況を見る</p> 25 26 <form action="login_success.php" method="POST"> 27 <select name="machine"> 28 <option value="null">選択してください</option> 29 <option value="log1">1号</option> 30 <option value="log2">2号</option> 31 <option value="log3">3号</option> 32 <option value="log4">4号</option> 33 </select> 34 <input type="submit" name="battery" value="見る"> 35 </form> 36 37 <?php 38 if(isset($_POST["battery"])) { 39 if($_POST["machine"] == "null"){ 40 echo "場所選んでへんで"; 41 }else if($_POST["machine"] == "log1"||$_POST["machine"] == "log2"){ 42 43 //データベース接続 44 $dsn = 'mysql:host=localhost;dbname=○○;charset=utf8'; 45 $db_user = '○○'; 46 $db_pass = '○○'; 47 48 try { 49 $pdo = new PDO($dsn, $db_user, $db_pass); 50 } catch (PDOException $e) { 51 exit('データベース接続失敗。' . $e->getMessage()); 52 } 53 54 $date = []; 55 $time = []; 56 $type = []; 57 $detail = []; 58 59 $query = "select * from $_POST["machine"] order by date desc, time desc"; 60 $stmt = $pdo->query($query); 61 $rec = $stmt->fetchAll(PDO::FETCH_ASSOC); 62 63 foreach ($rec as $row){ 64 $date[] = $row['date']; 65 $time[] = $row['time']; 66 $type[] = $row['type']; 67 $detail[] = $row['detail']; 68 } 69 70 ?> 71 72 <table border="1"> 73 <tr><th>日付</th><th>時間</th><th>種類</th><th>詳細</th></tr> 74 75 <?php 76 for($i = 0; $i<count($date); $i++){ 77 echo "<tr>"; 78 echo "<td>$date[$i]</td>"; 79 echo "<td>$time[$i]</td>"; 80 echo "<td>$type[$i]</td>"; 81 echo "<td>$detail[$i]</td>"; 82 echo "</tr>"; 83 } 84 ?> 85 </table> 86 87 <?php 88 89}else{ 90 echo "hogehoge"; 91 } 92 } 93 94 ?> 95 96</body> 97</html> 98

試したこと

$query = "select * from $_POST["machine"] order by date desc, time desc";
のテーブル名をlog1やlog2にしてもちゃんと表示されていました

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

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

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

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

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

m.ts10806

2021/12/23 09:37 編集

出ているエラーは単に文字列の扱いを理解されてないからですが、テーブルを外部から指定させるとかかなりセキュリティリスクがあるのですけど、なぜそのような仕様にされたのでしょうか
h_n_k_774

2021/12/23 10:14

ただ単に選択されたvalue値が変わるたびに //データベース接続 から </table> までの記述を繰り返すのが面倒だったからです.テーブルの中身を確認するだけのページなので,外からいじられないと思いこのような仕様にしました.
m.ts10806

2021/12/23 11:04

要件になるので質問本文に記載願います。
guest

回答2

0

ベストアンサー

動かすだけならこう

<?PHP $machine=filter_input(INPUT_POST,"machine"); if(!is_null($machine)){ $query = "select * from {$machine} order by date desc, time desc"; print_R($query); } ?> <form method="post"> <input type="text" name="machine" value="test"> <input type="submit" value="send"> </form>

ただしユーザーから受け取った値を直接クエリに埋め込むのはNGです。
テーブル名などはプレースホルダーも利用できないので
ホワイトリストをつくっておいて合致した場合だけ埋め込むような工夫が必要です

それとログイン関連、session_startは全ての出力より前に実行するようにしてください

投稿2021/12/23 09:41

編集2021/12/23 09:54
yambejp

総合スコア114814

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

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

h_n_k_774

2021/12/24 00:56

動きました!ありがとうございます! session_startはすべての出力より前に記述したのですがうまく動いてくれません...いろいろ調べてみます!
guest

0

エラー表示ONにすれば分かりますが(エラーが出るはずで)
先に書いたように文字列の扱いだけの話

※動かすだけ

php

1$query = "select * from ".$_POST["machine"]." order by date desc, time desc";

php

1$query = "select * from {$_POST["machine"]} order by date desc, time desc";

文字列をダブルクォートで囲っているとその中のダブルクォートは「閉じ」だと認識されます。なので、「変数」として分離する。
forのところはたまたまキーを数値で参照してるために出てないエラー。本来は上記のように分離したほうが良いです。

ただ、エラーハンドリングを接続時にしかしてなかったり、本来すべき「SQL実行時」も囲ってあげて欲しいのと、インデントが結構グチャグチャで読みにくいのと、色々実装で考慮すべき点はあります。

たとえば if($_POST["machine"] == "null"){
「nullという文字」と「null」は違うので、ここで「nullという文字」を採用するのは微妙。
HTMLは改ざんできるので、optionのvalueを空にしたときにはこの分岐に入りませんしね。
「存在しないテーブルが指定されたとき」のことを考慮すると、やはりtry節はそこで切っちゃダメだと思います。


session_start()はPHPマニュアルを確認。

注意:
クッキーに基づくセッションを使用している場合、ブラウザに何か出力を行う前に session_start() をコールする必要があります。

PHPタグ外は全て「出力」です。

投稿2021/12/23 11:03

m.ts10806

総合スコア80850

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

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

h_n_k_774

2021/12/24 00:58

出力できました!ありがとうございます! nullの記述は削除して,選択肢自体を4つのみにしました. session_start()はまだうまく反応していませんが,ほかの方の実行例をみて試行錯誤しようと思っています!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問