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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

2回答

1480閲覧

PHPでのデータ削除画面を作る

Toshinori23

総合スコア19

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

0クリップ

投稿2019/03/22 05:28

前提・実現したいこと

MYSQLにあるデータの管理画面を作成しています。
一覧画面でDBから、登録されているデータを抽出し、一覧にして表示してそれぞれのデータに、「修正」「削除」のボタンを設置しました。
削除画面で戻るボタンと削除ボタンを追加して、削除ボタンが押されたらそのユーザー情報を削除するという機能を実装したいです。
その前に送られてきたユーザ情報を表示するようにしたかったのですが、以下のようなエラーを吐き出しました。

・1つ目にエラーを改善し、削除画面に選択したユーザーの情報を表示

・2つ目は本当にできればでよいのですが、削除ボタンが押されたらそのユーザー情報を削除するという機能の提案

情報、学習不足は重々承知しております。お知恵を拝借させていただけませんでしょうか。

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

Notice: Undefined variable: id in C:\xampp\htdocs\offer\tr\delete.php on line 26
select * from users where id =

該当のソースコード

php

1//表作成 2 $stmt = $db->query("select * from users"); 3 $users = $stmt->fetchAll(PDO::FETCH_ASSOC); 4 echo "<table border=1>\n"; 5 echo "\t<tr><th>id</th><th>name</th><th>email</th><th>削除</th><th>修正</th></tr>\n"; 6 foreach ($users as $user) { 7 echo "\t<tr>\n"; 8 echo "\t\t<td>{$user['id']}</td>\n"; 9 echo "\t\t<td>{$user['name']}</td>\n"; 10 echo "\t\t<td>{$user['email']}</td>\n"; 11 echo "<form action=delete.php method=post>"; 12 echo "<input type=hidden name=id value=" . $user["id"] . ">"; 13 echo "<td><input type=submit value=削除></td>"; 14 echo "</form>"; 15 echo "<form action=data_change.php method=post>"; 16 echo "<input type=hidden name=id value=" . $user["id"] . ">"; 17 echo "<td><input type=submit value=修正></td>"; 18 echo "</form>"; 19 20 21 echo "\t</tr>\n"; 22 } 23 echo "</table>\n";

一覧画面で上のように表示して、削除画面でテーブルの主キーであるIDが変数$idとして送信されてくるので、削除画面ではこの$idを元にSQLのselect文を作成してレコードの表示を行います

php

1<body> 2 <title>本当に削除しますか?</title> 3 4 <a href="contr.php">戻る</a> 5 6 7 <a>削除</a> 8 <?php 9 10 define('DB_DATABASE','データベース名'); //database設定 11 define('DB_USERNAME','ユーザー名'); //user設定 12 define('DB_PASSWORD','パス'); //PASS設定 13 define('PDO_DSN','mysql:dbhost=localhost;charset=utf8mb4;'. DB_DATABASE); 14 15 try{ 16 //connect 17 $db = new PDO(PDO_DSN,DB_USERNAME,DB_PASSWORD); 18 $db-> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 19 20 echo "select * from users where id = $user['id']"; 21 22 }catch(PDOException $e){ 23 echo $e-> getMessage(); 24 exit; 25 } 26 ?> 27 </body>

試したこと

試しに削除画面のセレクト文の中で、echo "select * from users where id = $_POST['$user["id"]']";
したところ、

エラーメッセージ:Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\xampp\htdocs\offer\tr\delete.php on line 26

とでてしまいました。セレクト文のid = $_POST['$user["id"]']に構造上の不備があるのはエラーを調べて分かったのですが、正しい使い方までは発見することはできずでした。
また上のセレクト文のなかのid =$user["id"]"としたところ、同じようなエラー文で
エラーメッセージ:Parse error: syntax error, unexpected '"', expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\xampp\htdocs\offer\tr\delete.php on line 26
とでました。

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

PHP 7.3.1
MYSQL 15

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/03/22 05:39

「Notice: Undefined variable: id 」って未定義の$idって変数があるぞってことなんですが、エラーメッセージと掲載しているソースコードって整合性取れてますか?
Toshinori23

2019/03/22 06:11

$idを定義できていませんでした汗
guest

回答2

0

ベストアンサー

まず、エラーが出た場合の調べ方などは心得として持っておいてください。

エラーメッセージは何がどう悪いか教えてくれています。いわばサポーターです。
Google検索にかけるだけでも違います。


1つ目。
Notice: Undefined variable: id in C:\xampp\htdocs\offer\tr\delete.php on line 26 select * from users where id =

delete.phpというのは<title>本当に削除しますか?</title>が入ったコードで良いですかね。

php

1echo "select * from users where id = $user['id']";

$user という変数はこのdelete.phpのどこに定義されていますか?

いきなりでてきていますよね。これでは変数が未定義というのも仕方がありません。

2つ目。
Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting '-' or identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\xampp\htdocs\offer\tr\delete.php on line 26

php

1echo "select * from users where id = $_POST['$user["id"]']";

PHPの構文エラーです。
2重で、ですね。
変数展開はシングルクォーテーション内ではできませんし、
ダブルクォート内であっても連想配列をそのまま展開は出来ません。
詳しくはPHPマニュアル:文字列 など。

php

1$test1 = 'test; 2echo 'test1:$test1'; //これはダメ 3echo 'test1:'.$test1; //これはOK 4 5$test2 = ['a'=>'hoge','b'=>'fuga']; 6echo "test2:$test2['a']"; //これはダメ 7echo "test2:".$test2['a']; //これはOK 8echo "test2:{$test2['a']}"; //これはOK

シングルクォートで文字列連結するか、ダブルクォートで連想配列じゃなくても{}で囲うよう癖付けるのが確実でしょう。どちらかで徹底しておくようにすると良いです。(ヒアドキュメントとかもあるけどダブルクォートと同じく{}で徹底すれば良いので今回は除外)


コードを見た感じ、delete.phpへアクセスしているのは下記ですね。

php

1 echo "<form action=delete.php method=post>"; 2 echo "<input type=hidden name=id value=" . $user["id"] . ">"; 3 echo "<td><input type=submit value=削除></td>"; 4 echo "</form>";

formでpostで送信しています。

ということはdelete.phpに対してPOST送信を行っているということになります。

ブラウザから「ソースを表示」してみてください。下記のようになっているはず。

html

1<form action=delete.php method=post> 2<input type=hidden name=id value=111> 3<td> 4<input type=submit value=削除> 5</td> 6</form>

ということは、POSTリクエストの送信、受信の原則に則れば良いですね。
POSTでもGETでも、フォーム要素のnameに指定された値でアクセスできます。
今回はPOST送信でhiddenでidというnameにuser_idとなるものが入っているはずなので、delete.phpでは
$_POST['id']で情報が取得できるはずです。

※あとは変数未定義とか文字列埋め込みとかそのあたりは適宜調整してください。


本来はdelete.phpへのURL直うち対策の1つとしてPOST送信かどうかを判断したり、$_POSTにidという要素が存在するか確認したり、いや$_POSTよりも今はfilter_inputだというのもありますが、ひとまずは受け取るところから。


蛇足:
単にSQL文の文字列をechoしてるだけですが、これは確認のためだけですよね?
文字列echoしただけじゃSQLはDBに届けられませんから。

ここがうまくSQLが出来上がったら、きちんとprepare()bindValue()でセットしたりexecute()したり、は書いていくんですよね?

回答者も赤の他人ですし、質問内容からしか状況を読み取れません。
今どういう理解をしていて、これからどうしようとしているか、その範囲は書いておいてもらえると、アドバイスも過不足少なく的確なものになります。

投稿2019/03/22 05:50

編集2019/03/22 06:15
m.ts10806

総合スコア80765

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

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

Toshinori23

2019/03/22 06:43

ご丁寧に回答していただき誠にありがとうございます。 まず$idが定義できていませんでした。 その次に恥ずかしいことながら、delete.php(<title>本当に削除しますか?</title>が入ったコード)でユーザー情報をechoで表示できるものだと思っていました汗 改善し、echo "select~~~"の文を以下のように書き換えたところ、 $id = filter_input(INPUT_POST, 'id'); $stmt = $db->prepare("select * from users where id = ?"); $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->execute(); var_dump($id); string(1) "1"とだけ表示され、$idにはデータが入っているのですがユーザー情報が表示されません。 $idが文字列のままで、うまく作動しないのでしょうか?
m.ts10806

2019/03/22 07:23 編集

それはまあ、$idは単に送信されたPOST情報でしかないですからね。 PHPマニュアルをきちんと確認してください。 execute()はプリペアドステートメントを実行するだけで結果セットを持っているわけではありません。 execute()したあと、情報を取り出すやり方は別に必要です。 http://php.net/manual/ja/class.pdostatement.php ↑の機能一覧、目次のところの各機能に実行結果を取り出せる機能が幾つかありますのでそれを利用してください。
m.ts10806

2019/03/22 11:34

解決は良いことなのですが、本当に理解が得られたか気になります。 解決した内容、理解した内容をコメントください
Toshinori23

2019/03/22 14:17

削除画面の処理で、executeした後、結果セットに残っている全ての行を含む配列を返すfetchAllを使って表示することができました。 以下、処理のコードです。 $stmt = $db->prepare("select * from users where id=?"); $id = filter_input(INPUT_POST, 'id'); $stmt->bindValue(1,$id, PDO::PARAM_INT); $stmt->execute(); $users = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($users as $user) { echo "{$user['id']}"; echo "{$user['name']}"; echo "{$user['email']}"; } 今迄manualに書いてあることが難しく感じ、見てきませんでした。この質問を通じてmanualを参照することの大切さと、エラーが出た時の対処をルーティン化する術を教わったので、これからの学習の大きな糧となりました。再度、ご教授いただき誠にありがとうございました。
guest

0

hiddenのname=idなので以下のように受ければよいかと

php

1$id = filter_input(INPUT_POST, 'id'); 2echo "select * from users where id = ".$id;

投稿2019/03/22 05:34

mayoi_maimai

総合スコア1583

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

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

Toshinori23

2019/03/22 06:46

回答ありがとうございます。 $idを定義することで、idを取得することができました!
mayoi_maimai

2019/03/22 06:49

あとはdeleteするなりselectするなりお好きな処理で進めて頂ければ大丈夫だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問