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

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

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

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

PHP

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

データベース

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

Q&A

解決済

2回答

1477閲覧

PHPで編集機能を作成していますが、更新画面に遷移できません。

dog57

総合スコア131

MySQL

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

PHP

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

データベース

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

0グッド

1クリップ

投稿2017/09/01 12:19

編集2017/09/02 08:01

###前提・実現したいこと
PHPで編集機能を実装しています。一覧画面(①)、変更画面(②),更新完了画面(③)、のように遷移させていのですが、(③)のところでつまずいています。

イメージ説明

イメージ説明

イメージ説明

###発生している問題・エラーメッセージ
エラーのメッセージは発生しておりません。現状は下記の画像のような感じです。(③)でつまづいております。上記の③の画像のようにしたいです。

イメージ説明

イメージ説明

イメージ説明

エラーのメッセージの取得に関しては下記のように記述しましたが出てきませんでした。なので恐らく②→③へのデータの受け渡しが問題なのかのと思っています。

update3.phpの下記のコードが画像に反映されているので受け渡しが問題なのかなと思いました。

update3.phpのif文の一部

php

1if(empty($_POST)) { 2 echo "<a href='update1.php'>update1.php</a>←こちらのページからどうぞ"; 3 exit();

エラー文取得のコード

<?php ini_set("display_errors", On); error_reporting(E_ALL);

###該当のソースコード

①一覧画面 update1.php

php

1<?php 2 3header("Content-type: text/html; charset=utf-8"); 4 5require_once("index_db.php"); 6 7 8$sql = "SELECT id, rank, nation, food, reason FROM country"; 9$statement = $pdo->query($sql); 10 11// 結果の取得 12$country = array(); 13foreach ($statement as $row) { 14 $country[] = $row; 15} 16var_dump($country); 17 18// データベース切断 19$pdo = null; 20 21?> 22 23<!DOCTYPE html> 24<html> 25<head> 26<title>国一覧</title> 27</head> 28<body> 29<h1>国一覧</h1> 30 31<table border='1'> 32 <tr><td>id</td><td>順位</td><td>国名</td><td>食べたい食べ物</td><td>理由</td></tr> 33 34<?php 35 foreach($country as $row){ 36 ?> 37 38 39 40 <tr> 41 <td><?=$row['id']?></td> 42 <td><?=htmlspecialchars($row['rank'], ENT_QUOTES, 'UTF-8')?></td> 43 <td><?=htmlspecialchars($row['nation'], ENT_QUOTES, 'UTF-8')?></td> 44 <td><?=htmlspecialchars($row['food'], ENT_QUOTES, 'UTF-8')?></td> 45 <td><?=htmlspecialchars($row['reason'], ENT_QUOTES, 'UTF-8')?></td> 46 <td> 47 <form action="update2.php" method="post"> 48 <input type="submit" value="編集"> 49 <input type="hidden" name="id" value="<?=$row['id']?>"> 50 <input type="hidden" name="rank" value="<?=$row['rank']?>"> 51 <input type="hidden" name="nation" value="<?=$row['nation']?>"> 52 <input type="hidden" name="food" value="<?=$row['food']?>"> 53 <input type="hidden" name="reason" value="<?=$row['reason']?>"> 54 </form> 55 </td> 56</tr> 57 58 59 60 <?php 61 } 62 ?> 63 64</table> 65 66</body> 67</html> 68

②変更画面 update2.php

php

1<?php 2ini_set("display_errors", On); 3error_reporting(E_ALL); 4 5header("content-type: text/html; charset=utf-8"); 6require_once("index_db.php"); 7 8 9try { 10 11 if(empty($_POST)) { 12 echo "<a href='update1.php'>update1.php</a>←こちらのページからどうぞ"; 13 exit(); 14 }else { 15 if (!isset($_POST['id']) || !is_numeric($_POST['id']) ){ 16 echo "idエラー"; 17 exit(); 18 }else { 19 //プリペアドスタートメント 20 $stmt = $pdo->prepare('select * from country where id=?, rank=?, nation=?, food=?, reason=?'); 21 if ($stmt) { 22 //プレースホルダへ実際の値を設定する 23 $stmt->bindParam(1, $id); 24 $stmt->bindParam(2, $rank); 25 $stmt->bindParam(3, $nation); 26 $stmt->bindParam(4, $food); 27 $stmt->bindParam(5, $reason); 28 $id = $_POST['id']; 29 $rank = $_POST['rank']; 30 $nation = $_POST['nation']; 31 $food = $_POST['food']; 32 $reason = $_POST['reason']; 33 34 //クエリの実行 35 $stmt->execute(); 36 37 //結果変数のバインド 38 $result = $stmt->fetch(); 39 40 41 //値の取得 42 $stmt->fetch(); 43 44 //ステートメント切断 45 $pdo = null; 46 } 47 } 48 } 49} catch (Exception $e){ 50 echo 'error'; 51 echo('エラーが発生しました。:'.$e->getMessage()); 52 exit; 53} 54 55 56?> 57 58<iDOCTYPE html> 59 <!DOCTYPE html> 60 <html> 61 62<head> 63 <title>変更画面</title> 64</head> 65 66<body> 67 68<p>変更してください</p> 69 70<table border=1> 71 72<form action="update3.php"> 73 <tr> 74 <th>順位</th> 75 <th>国名</th> 76 <th>食べたい食べ物</th> 77 <th>理由</th> 78 </tr> 79 80 <tr> 81 <td> <input type="hidden" name="id" value="<?=$id?>"></td> 82 <td><input type="text" name="rank" value="<?=htmlspecialchars($rank, ENT_QUOTES, 'UTF-8')?>"></td> 83 <td><input type="text" name="nation" value="<?=htmlspecialchars($nation, ENT_QUOTES, 'UTF-8')?>"></td> 84 <td><input type="text" name="food" value="<?=htmlspecialchars($food, ENT_QUOTES, 'UTF-8')?>"></td> 85 <td> <input type="text" name="reason" value="<?=htmlspecialchars($reason, ENT_QUOTES, 'UTF-8')?>"></td> 86 <td><input type="submit" value="変更する"></td> 87 </tr> 88 89 90 91</form> 92 93</table> 94 95</body> 96 97 </html> 98

③更新完了画面 update3.php

php

1<?php 2ini_set("display_errors", On); 3error_reporting(E_ALL); 4 5header("content-type: text/html; charset=utf-8"); 6require_once("index_db.php"); 7 8try { 9 10 if(empty($_POST)) { 11 echo "<a href='update1.php'>update1.php</a>←こちらのページからどうぞ"; 12 exit(); 13 }else { 14 //名前入力チェック 15 if (!isset($_POST['id']) || $_POST['id'] === "" ){ 16 $errors['id'] = "名前が入力されていません。"; 17 } 18 19 if(count($errors) === 0) { 20 //プリペアドステートメント 21 $stmt = $pdo->prepare("update country set rank=?, nation=?, food=?, reason=? where id=?,"); 22 if ($stmt) { 23 //プレースホルダに実際の値を設定する 24 25 $stmt->bindParam(1, $rank, PDO::PARAM_STR); 26 $stmt->bindParam(2, $nation, PDO::PARSM_STR); 27 $stmt->bindParam(3, $food, PDO::PARAM_STR); 28 $stmt->bindParam(4, $reason, PDO::PARAM_STR); 29 $stmt->bindParam(5, $id, PDO::PARAM_STR); 30 31 32 $id = $_POST['id']; 33 $rank = $_POST['rank']; 34 $nation = $_POST['nation']; 35 $food = $_POST['food']; 36 $reason = $_POST['reason']; 37 38 //クエリ実行 39 $stmt->execute(); 40 //ステートメント切断 41 $pdo = null; 42 43 } 44 } 45 } 46}catch (Exception $e) { 47 echo 'error'; 48 echo ('エラーが発生しました。:'.$e->getMessage()); 49 exit; 50} 51 ?> 52 53 <!DOCTYPE html> 54<html> 55 <head> 56 <title>変更画面</title> 57 </head> 58 <body> 59 <h1>変更画面</h1> 60 61 <?php if (count($errors) === 0): ?> 62 <p>変更完了しました。</p> 63 <?php elseif(count($errors) > 0): ?> 64 <?php 65 foreach($errors as $value){ 66 echo "<p>".$value."</p>"; 67 } 68 ?> 69 <?php endif; ?> 70 71 72 </body> 73 </head> 74 75 76 </html> 77 78

###補足情報(言語/FW/ツール等のバージョンなど)
php5.6,mysql Ver 14.14
イメージ説明
イメージ説明

データベースの中身
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

画面(2)のupdate2.phpのDBのSELECT文は必要ありません。というのも、画面(1)で「編集ボタン」を押したときにPOST値が画面(2)に送信されるからです。

php

1// 画面2 2try { 3 if (empty($_POST)) { 4 echo "<a href='update1.php'>update1.php</a>←こちらのページからどうぞ"; 5 exit(); 6 } else { 7 $id = $_POST['id']; 8 $rank = $_POST['rank']; 9 $nation = $_POST['nation']; 10 $food = $_POST['food']; 11 $reason = $_POST['reason']; 12 13 if (empty($_POST['id']) || !is_numeric($_POST['id'])) { 14 echo "idエラー"; 15 exit(); 16 } 17 } 18} catch (Exception $e) { 19 echo 'error'; 20 echo('エラーが発生しました。:'.$e->getMessage()); 21 exit; 22} 23?> 24 25<form action="update3.php" method="post"> 26...

それから、画面(3)のupdate3.phpは下記のようにします。

php

1// 画面3 2try { 3 if (empty($_POST)) { 4 echo "<a href='update1.php'>update1.php</a>←こちらのページからどうぞ"; 5 exit(); 6 } else { 7 // 項目 8 $items = array('rank' => '順位', 'nation' => '国名', 'food' => '食べたい食べ物', 'reason' => '理由'); 9 10 //ID入力チェック 11 if (empty($_POST['id']) || !is_numeric($_POST['id'])) { 12 $errors['id'] = "IDが入力されていないか、数値ではありません。"; 13 } else { 14 $id = $pdo->quote($_POST['id']); 15 } 16 17 // ID以外項目入力値チェック 18 foreach ($items as $key => $label) { 19 if (! empty($_POST[$key])) { 20 ${$key} = $pdo->quote($_POST[$key]); 21 continue; 22 } 23 $errors[$key] = $label."が入力されていません。"; 24 } 25 26 if (empty($errors)) { 27 //ランク「位」補完 28 false === strpos($rank, '位') && $rank .= '位'; 29 30 //プリペアドステートメント 31 $stmt = $pdo->prepare("update country set rank=?, nation=?, food=?, reason=? where id=?"); 32 33 //DB更新 34 if (! $stmt->execute(array($rank, $nation, $food, $reason, $id))) { 35 $errors['exec'] = 'DB更新に失敗しました。'; 36 } 37 38 $pdo = null; 39 } 40 } 41} catch (Exception $e) { 42 echo 'error'; 43 echo ('エラーが発生しました。:'.$e->getMessage()); 44 exit; 45} 46?>

投稿2017/09/01 14:28

編集2017/09/02 07:41
Tomak

総合スコア1652

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

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

dog57

2017/09/02 06:08

ご丁寧にありがとうございます。 もう一つご質問なのですが 例えば、もし順位、国名、食べ物、理由のどれかの枠が空欄だった場合 ◯◯が空欄です、入力してください。と出力されるようにしたいのですが 今の段階だと下記のIF文の所に該当するかと思われます。 ``` if (empty($rank) || !is_numeric($rank)) { $errors['rank'] = "IDが入力されていないか、数値ではありません。"; } ``` どのように変更したらいいでしょうか? どうか宜しくお願い致します。
Tomak

2017/09/02 06:15

> 順位、国名、食べ物、理由のどれかの枠が空欄だった場合 条件は、『順位、国名、食べ物、理由のどれかひとつ以上の項目が空欄である場合』でよろしいでしょうか?
dog57

2017/09/02 06:19

その条件で大丈夫です!
Tomak

2017/09/02 06:49

回答の「update3.php」を変更しました。
dog57

2017/09/02 07:27

ありがとうございます! 25行目にエラーが発生してしまいました。(質問欄の一番下の画像の3つ) 構文エラーということなのですが、どうしてもどこが間違っているのかがわかりません。 どうかご教授くださいm(__)m
Tomak

2017/09/02 07:39

25行目「if (! empty($_POST[$key])) {」でした。末尾の丸カッコが抜けてました。
dog57

2017/09/02 07:53

ありがとうございます。ここの部分は解決でき、画面遷移することができましたが もう1個エラーが出てきてしまいました。 今度は,HTMLの部分になります。(質問欄の一番下の画像の2つ) どうか教えてくださいm(__)m 宜しくお願い致します。
Tomak

2017/09/02 08:02

$errors変数が存在しないのにcount($errors)を実行しているため文句言ってます。ですので、ソースコード上部で「$errors = array();」のように初期化するとよいと思います。 <?php ini_set("display_errors", On); error_reporting(E_ALL); $errors = array();
dog57

2017/09/02 08:34

ありがとうございます! 無事、データベースを更新することができました。
dog57

2017/09/02 08:34

お付き合いいただきありがとうございます!
Tomak

2017/09/02 09:19

は~ぃ、DB更新できてなによりです。
guest

0

update2.php<form>タグを下記に変更すればきちんとupdate3.phpに遷移します。

html

1<form action="update3.php" method="post">

<form>タグのmethod属性を省略した場合は、method="get"となります。

投稿2017/09/01 12:49

Tomak

総合スコア1652

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

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

dog57

2017/09/01 13:08

ありがとうございます。解決致しましたが、③の画面で「名前が入力されていません」と出ます。 update3.phpの14、15行目。 何が原因なのででしょうか?
dog57

2017/09/01 13:08

問題の画像を質問の一番下に追加致しました。 宜しくお願い致します。
Tomak

2017/09/01 13:28

「名前が入力されていません」は意味がわかりませんが、画面(3)は、画面(2)と同じ表示状態になると思います。(プログラムコードが一緒なので) たぶん、「前提・実現したいこと」の画面(3)に対応するプログラムコードのことを言っていませんか?(プログラムコードが異なっているはずです) DBは「SELECT ...」なので更新処理はされないです。SQL文は「UPDATE ...」を使います。
dog57

2017/09/01 13:36

間違えて同じコードを張っていました。update3.phpのコードを変更しました。14、15行目の結果が1番下の画像に反映されているといった感じです。
dog57

2017/09/01 13:37

ご教授いただけたら嬉しいです。宜しくお願い致します。
Tomak

2017/09/01 13:42

回答を別にします。
dog57

2017/09/01 13:49

かしこまりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問