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

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

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

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

解決済

2回答

1709閲覧

php レコード一覧表示からの個別修正画面のデータの遷移

TAKAYUKIM

総合スコア3

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2020/06/27 13:32

編集2020/06/27 13:36

初心者ですが、php、mysqlにてネットの情報を参考にしながらなんとかDB上のレコードの一覧をユーザーごとに表示できるようになりました。一覧表示されているレコードのidから個別画面へ移動し、それを修正したいと思っています、個別画面にはレコードのidに格納されている情報がセットされそれを修正しUPDATEするイメージです。修正するボタンをクリックするとURLにはidが2つ入っている状況です。そして修正画面には何もデータが格納されていない状況です。
画面遷移はログイン画面→一覧表示画面(index.php)→個別の修正画面(update.php)という流れです。
開発環境はXAMPP、PHP7.4.6
コードがつぎはぎで醜いかもしれませんが、ご教示お願い致します。
※update.phpについては動作確認のため、不完全です

index.php

<?php session_start(); //データベースユーザー $user='root'; $password=''; //利用するデータベース $dbName='TEST'; //mySQLサーバ $host='localhost'; //mySQLのDSN文字列 $dsn="mysql:host={$host};dbname={$dbName};charset=utf8"; $pdo=new PDO($dsn,$user,$password); //プリペアドステートメントのエミュレーションを無効にする $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); //例外がスローされる設定にする $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //SQL作成 $sql="SELECT * from syuho where name='".$_SESSION['name']."'"; //プリペアドステートメントを作る $stm=$pdo->prepare($sql); $stm->execute(); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>日報入力</title> <link rel="stylesheet" href="style.css"/> </head> <body> <div id="wrap"> <div id="head"> <h1>入力</h1> </div> <div id="content"> <p>ようこそ<u><?php echo htmlspecialchars($_SESSION['name']);?></u>さん</p> <h3>これまでの入力内容確認</h3> <table> <tr><th>id</th><th>勤務者</th><th>勤務日</th><th>勤務開始時刻</th><th>勤務終了時刻</th><th>休憩時間</th> <th>業務内容</th><th>その他</th><th>通勤区間</th><th>通勤距離</th><th>ユーザー名</th><th>修正</th></tr> <?php foreach($stm as $row):?> <tr><td><?php echo $row[0]?></td><td><?php echo $row[1]?></td><td><?php echo $row[2]?></td> <td><?php echo $row[3]?></td><td><?php echo $row[4]?></td><td><?php echo $row[5]?></td><td><?php echo $row[6]?></td> <td><?php echo $row[7]?></td><td><?php echo $row[8]?></td><td><?php echo $row[9]?></td><td><?php echo $row[10]?></td> <td> <form action="update.php" method="GET"> <input type="hidden" name="id" value="<?php echo $row[0];?>""> <input type="submit" value="修正する"> </td></tr> <?php endforeach;?> </table> <p> <a href="regist.php">管理画面へ</a> </p> </div> <a href="admin_login.php">管理者ログイン</a> <p> <form method="POST" action="logout.php"> <input type="submit" value="ログアウト" onclick="Location.href='logout.php'"> </form> </p> </body> </html>

update.php

session_start(); $id=$_POST['id']; //データベースユーザー $user='root'; $password=''; //利用するデータベース $dbName='NATURE'; //mySQLサーバ $host='localhost'; //mySQLのDSN文字列 $dsn="mysql:host={$host};dbname={$dbName};charset=utf8"; try{ $pdo=new PDO($dsn,$user,$password); //プリペアドステートメントのエミュレーションを無効にする $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); //例外がスローされる設定にする $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //SQL作成 $sql="SELECT id,kinmu FROM syuho where id=$id"; //プリペアドステートメントを作る $stm=$pdo->prepare($sql); //SQLを実行する while($row=$stm->fetch(PDO::FETCH_ASSOC)){ echo('<td>'.$row['id'].'</td>'); echo('<td>'.$row['kinmu'].'</td>'); } $stm->execute(); } catch (Exception $e){ echo '<span class="error">エラーがありました</span><br>'; echo $e->getMessage(); } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>修正</title> <link rel="stylesheet" href="style.css"/> </head> <body> <div id="wrap"> <div id="head"> <h1>修正</h1> </div> <div id="content"> <p>修正してください</p> <form method="POST" action="update_exe.php"> ID<br/> <input type="text" name="id" value="<?php echo $row['id'];?>"> 勤務者<br/> <input type="text" name="kinmu" value="<?php echo $rpw['kinmu'];?>"> </form> </div> </body> </html>

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

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

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

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

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

guest

回答2

0

prepareの理解が相当低いです
まずprepareで指定するなら参照するデータはSQL文に変数で埋め込んではだめ
prepareしたらexecuteをしたあとじゃないとfetchできない

PHP

1$sql="SELECT id,kinmu FROM syuho where id=?"; 2$stmt=$pdo->prepare($sql); 3$stmt->execute([$id]); 4 5while($row=$stmt->fetch(PDO::FETCH_ASSOC)){ 6 echo('<td>'.$row['id'].'</td>'); 7 echo('<td>'.$row['kinmu'].'</td>'); 8}

そもそもsyuhoにおけるidはユニークなカラムではないのでしょうか?
もしそうなら、データは1つしかないか1つもないかのどちらかです
whileは無駄です

投稿2020/06/27 13:42

yambejp

総合スコア114883

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

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

TAKAYUKIM

2020/06/28 12:05

やはりそうですね。もう一度勉強しなおして頑張ります
guest

0

ベストアンサー

まず

<form action="update.php" method="GET">

methodが「GET」なので

$id=$_POST['id'];

$_POSTでは受け取れません。

PHPマニュアル:HTML フォーム (GET と POST)

POSTではないので、Syntaxエラーが出ているかと思います。
エラー表示はONにしてください。

idが正しく取れてないので、当然、取りたかったIDの情報もとれていません。

その前に

<form action="update.php" method="GET">

このformの閉じタグがありません。閉じられていないので、
上記formの中に<form method="POST" action="logout.php">があるような形になっています。

formの入れ子はできないので、更に正しく動かない要因になっています。

ちなみに、、GETであればformにせずともリンクで良いのではと思います。

php

1<a href="update.php?id=?<?php echo $row[0]; ?>">修正する</a>

※「見た目をボタンっぽくしたい」ならCSSで

あと気になるところ。

//SQL作成

$sql="SELECT id,kinmu FROM syuho where id=$id"; //プリペアドステートメントを作る $stm=$pdo->prepare($sql);

SQLインジェクションの脆弱性があります。
PHPでデータベースに接続するときのまとめ:"SELECT * FROM users WHERE id = '$id'" のように変数展開を使ってSQL文を組み立てている

パラメータからバインドしましょう。
PHPでデータベースに接続するときのまとめ:PDO::prepare → PDOStatement::bindValue → PDOStatement::execute の3ステップでクエリを実行する

下記、だけではないですが、XSSの脆弱性があります。

<input type="text" name="id" value="<?php echo $row['id'];?>">
勤務者<br/> <input type="text" name="kinmu" value="<?php echo $rpw['kinmu'];?>">

きちんとエスケープしましょう。
サニタイズ/入力値検証/エスケープの考え方:HTML(エスケープ)

下記、idが一意であればwhileする必要はないと思います。

while($row=$stm->fetch(PDO::FETCH_ASSOC)){

投稿2020/06/27 13:45

編集2020/06/27 13:51
m.ts10806

総合スコア80852

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問