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

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

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

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

phpMyAdmin

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

Q&A

解決済

1回答

1387閲覧

設備使用画面のマスタメンテナンス画面作成

ryusan_012

総合スコア59

MySQL

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

phpMyAdmin

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

0グッド

0クリップ

投稿2018/05/18 00:13

編集2018/05/18 00:44

こんにちは

PHPで設備使用画面作っています
マスタメンテナンス画面を作ったんですがブラウザ上で表示されません。
登録している設備をラジオボタンで選択して変更画面に移動するか、データを削除します。
Jqueryを使わずにdeleteをPHPに受け渡そうとしてました

master.php

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Master Maintenance</title> echo("try"); <script type="text/javascript"> function del_action(){ document.getElementById("mydel").action="master.php"; document.getElementById("mydel").submit() return false;; } </scipt> </head> <body> <h1>マスタメンテナンス画面</h1> <p><input type="button" name="regist" onclick="location.href= 'registration.php'" value="新規登録" /></p> <form method="post" id="mydel" action="change.php"> <table border = "1" width = "auto"> <tr> <th>設備No</th> <th>設備名</th> <th>選択</th> </tr> <?php $pdo = new PDO ('mysql:host=localhost;dbname=simplefacilityusesystem;charset=utf8', 'user', 'paaward'); //データベース接続 foreach ( $pdo->query ( 'select * from facility' ) as $row ) { echo '<tr>'; echo '<td>', $row ['facility_number'], '</td>'; echo '<td>', $row ['facility_name'], '</td>'; echo '<td><input type="radio" name="choice" value="' . $row['facility_number'] . '"></td>'; echo '</tr>'; echo "\n"; } if(isset($_POST["delete"])){ $sql=dpo->prepare(delete from facility where facility_number = ); $sql->execute(); } ?> </table> <input type="submit" name="change" value="変更" /> <input type="button" id="del" name="delete" onclick="del_action()" value="削除" /> print "<script language=javascript>del_action()</script>"; </form> <br /><p><input type="submit" onclick="location.href= 'menu.php'" value="前画面に戻る" /></p> </body> </html>

xamppでやっています。
よろしくお願いします。

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

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

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

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

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

m.ts10806

2018/05/18 00:25

プログラムコード(およびエラーメッセージ)は```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)正しく反映されているかどうかは質問編集画面のプレビューを見ながら編集していってください。
m.ts10806

2018/05/18 00:28

あとPHP使われている場合はバージョンなどの環境情報は必須です。サーバーは立ち上がっているか、ファイル名 などなど。開発段階ではエラー表示はONにしてください。でないとプログラムが中断するレベルのエラーがでたときに何が起きているか分かりません。
ryusan_012

2018/05/18 00:40

慣れてなくて申し訳ないです。
m.ts10806

2018/05/18 00:42

質問は質問者さん自身が編集できるので1つ1つ修正してみてください。あと、パスワードなどは悪用される可能性がないとも言えないので空にするかhogehogeなど適当な文字列に置き換えてください。
guest

回答1

0

ベストアンサー

ひとまず下記で表示されるのでは。

html

1</scipt> 2 3</head>

html

1</script> 2 3</head>

scriptタグがスペルミスで閉じられていない。

phpでもエラーがありますね。

php

1$pdo = new PDO ('mysql:host=localhost;dbname=simplefacilityusesystem;charset=utf8', 'maint', '1qaz!QAZ'); //データベース接続

としておきながら

php

1$sql=dpo->prepare(delete from facility where facility_number = );

dpo → $pdo
としなければならないですし、引数のSQLがクォートで閉じられてない。
また、where句がちゃんと最後まで指定されていない(検索文言がセットされていない)

下記は不要。なぜならボタンにonclickで割り振られているからです。

php

1print "<script language=javascript>del_action()</script>";

PHPはサーバー側の言語なので、html表示前に実行されます。
上記の記述があることで「アクセス時点でdel_action()が実行される」という事態が起きているものと推察されます。
あと、「特定の情報だけ削除したい」のであれば、その特定の情報(例えばIDなど)を渡さなければなりません。
master.php、change.phpなど複数のPHPの記述がありますが、どのコードがどのファイルに記述してあるのでしょうか?

何を見て書きましたか?
約束事がほとんど守られていません。1行1行 もっと言えば1つ1つの関数や記述を確かめながら記述していってください。

あとできれば、構文などのエラーチェックをしてくれるIDEをご利用ください。

サンプルコード(ボタンそれぞれ表示版)

そのまま使わないように。必ず全て理解してから適応してください。未検証コードなので動作保証はありません。あくまで実装のイメージとして参考にしてください。

php

1<?php 2//データベース接続 3$pdo = new PDO ('mysql:host=localhost;dbname=simplefacilityusesystem;charset=utf8', 'user', 'paaward'); 4 5//データの削除 6//select前に記述することでselect時に最新状態を取得する 7if ($_SERVER ['REQUEST_METHOD'] === 'POST') { 8 if(array_key_exists($_POST, "facility_number") && !empty($_POST["facility_number"])){ 9 $sql=$pdo->prepare('delete from facility where facility_number = :facility_number'); 10 if(!$sql->execute(array(':facility_number' => $_POST["facility_number"]))){ 11 die("削除失敗"); 12 } 13 } 14} 15 16//データの取得 17$facilityData = $pdo->query ( 'select * from facility' ); 18$facilityList = ""; 19foreach ( $facilityData as $row ) { 20 $facilityList .='<tr>'; 21 $facilityList .='<td>', $row ['facility_number'], '</td>'; 22 $facilityList .='<td>', $row ['facility_name'], '</td>'; 23 $facilityList .='<td><form method="post" id="mychange'.$row['facility_number'] .'" action="change.php"><input type="hidden" name="facility_number" value="' . $row['facility_number'] . '"><button name="update">編集</button></form></td>'; 24 $facilityList .='<td><form method="post" id="mydel'.$row['facility_number'] .'"><input type="hidden" name="facility_number" value="' . $row['facility_number'] . '"><button name="delete">削除</button></form></td>'; //actionを省略するとデフォルトで「自身」となる 25 $facilityList .='</tr>'; 26 $facilityList .="\n"; 27} 28?> 29<!DOCTYPE html> 30<html> 31 <head> 32 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 33 <title>Master Maintenance</title> 34 </head> 35 <body> 36 <h1>マスタメンテナンス画面</h1> 37 <p><input type="button" name="regist" onclick="location.href= 'registration.php'" value="新規登録" /></p> 38 <table border = "1" width = "auto"> 39 <tr> 40 <th>設備No</th> 41 <th>設備名</th> 42 <th>選択</th> 43 </tr> 44 <?=$facilityList ?> 45 </table> 46 <br /><p><input type="submit" onclick="location.href= 'menu.php'" value="前画面に戻る" /></p> 47 </body> 48</html>

その他、読んでおいたほうが良い記事

投稿2018/05/18 00:33

編集2018/05/18 01:54
m.ts10806

総合スコア80850

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

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

m.ts10806

2018/05/18 00:37

あ、でも echo("try"); という文字列だけは表示されてそうなもんですが。
ryusan_012

2018/05/18 00:49

自分の確認ミスが多いですね、、、すみません、ありがとうございます
m.ts10806

2018/05/18 00:51

気づいたところを追記しています。 もう少し基本的なところから1つずつおさえていった方が良さそうです。 入力→確認→完了 の流れとか。 サーバーサイドとクライアントサイドの関係部分、連携部分とか。 ベストアンサーで解決済みとされたようですが、かなり多くの課題が残っているように見受けられます。
ryusan_012

2018/05/18 01:03

同じform内でボタンの参照先を変更する時にjavascriptでaction先を変更するまではわかるのですがそのあとがまだ理解できてないですので、
m.ts10806

2018/05/18 01:07

ボタンの参照先を変更する とは・・?? このformで削除しかしないのであればchange.phpに削除処理を記述して対象のID(facility_number)$_POST["choise"]で受け取れば良いかなと。 もし編集画面への遷移まであるのでしたら、削除処理については1データ毎に削除ボタンを置いて非同期ajaxにて対応された方が良いと思います。
ryusan_012

2018/05/18 01:17

現在のformでの削除を考えています。 if(isset($_POST["delete"])){ $sql=dpo->prepare(delete from facility where facility_number = ””); $sql->execute(); こちらの内容変更で大丈夫ですか?
m.ts10806

2018/05/18 01:30 編集

いいえ。 まず、私の回答部分の指摘が反映されていません。 > dpo → $pdo >としなければならないですし、引数のSQLがクォートで閉じられてない。 >また、where句がちゃんと最後まで指定されていない(検索文言がセットされていない) 例え $sql=$pdo->prepare(' delete from facility where facility_number = ”” '); と直したとしても、「facility_numberが空""のものを削除する」という指定になっています。 本来は下記のようにしなければなりません。 $sql=$pdo->prepare(' delete from facility where facility_number = :facility_number '); $sth->execute(array(':facility_number ' => $_POST["choice"])); ↑choiceという名前でradioボタンが埋め込まれてそのvalueにfacility_number があるので。 マニュアルにもありますね。 http://php.net/manual/ja/pdo.prepare.php だから「何を見て書きましたか?」と回答に書きました。 お作法がほとんど守られていなくて、何を目的としたコードなのか全く分からなくなっています。 というか、action先を書き換えるのは賢明ではないですね。 私の場合ですが、そもそも削除ボタンを1つにはしません。 ぞれぞれに1つずつ置き、hiddenにfacility_number を持ちます。formもそれぞれの削除ボタン毎に置きます。 回答にも書いたように「PHPはサーバー側の言語なので、html表示前に実行されます。」 htmlの中にPHPの処理が混在するのは可読性が損なわれますし、問題の切り分けが難しくなります。 処理部分はなるべくhtml記載の前に行い、変数にためておいてhtmlでは変数をechoするだけにしておいた方が見やすくなりますよ。 一応・・・私の場合の書き方を例示しておきます。(これから書くので少々お待ちを) ただし動作検証はしませんので、イメージ参考としてください。
ryusan_012

2018/05/18 01:48

丁寧な回答ありがとうございます まずクォートなどの修正からはいろうと思います。 ボタンをそれぞれにつけるんですね、その案も考えてみようと思います。 ありがとうございました
m.ts10806

2018/05/18 01:53

データが多いときにボタンが最下部にあるとユーザはそこまでスクロールしなければなりませんよね? 最上部にあったとしても最下部のデータを削除したいときに最上部に戻ってこなければなりません。 UI,UXの観点からも考えなければなりません。 読んでおいたほうが良い記事も追加しておいたのであわせて読んでください。 (あと私の回答は基本的に無駄なことは書いてないはずなのでなるべくきちんと読んで一通り理解していただきたく)
m.ts10806

2018/05/18 01:56

もう1点 ボタンでlocation.hrefを直に(というかsubmitボタンに)つけるくらいならaタグでリンクでも良いのでは。 あと編集画面にいくときにPOSTする必要ないかと。?id=hogehogeのようにリンク渡しといてchange.phpで$_GET["id"]のような形の方が自然です。 DBからデータを取得するだけの画面なのであればPOSTじゃないほうが良いです。
ryusan_012

2018/05/18 01:56

はいありがとうございました。 ゆっくり読んで理解しようと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問