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

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

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

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

PHP

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

Q&A

解決済

1回答

323閲覧

PHPで指定されたデータの更新される場所が1番上になります。

dog57

総合スコア131

MySQL

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

PHP

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

0グッド

0クリップ

投稿2017/12/16 02:48

編集2017/12/16 06:11

PHPで編集機能を作成しております。

・トップ画面 index.php
イメージ説明
・編集画面 update.php
イメージ説明
・編集完了画面 update_end.php
イメージ説明

上記のような流れなのですが、2位〜5位のデータを更新してもなぜか1位の所にデータが反映されてしまいます。
原因がわからないので、どなたかご教授いただけないでしょうか。
よろしくお願いします。

・DB情報
イメージ説明

update.php

php

1<?php 2ini_set("display_errors", 1); 3error_reporting(E_ALL); 4 5session_start(); 6 7// 文字化け対策 8header("Content-type: text/html; charset=UTF-8"); 9 10function h($string) { 11 return htmlspecialchars($string, ENT_QUOTES, "UTF-8"); 12} 13 14require_once(__DIR__. "/db.php"); 15 16$_SESSION["id"] = filter_input(INPUT_POST, 'id'); 17$_SESSION["rank"] = filter_input(INPUT_POST, 'rank'); 18$_SESSION["nation"] = filter_input(INPUT_POST, 'nation'); 19$_SESSION["food"] = filter_input(INPUT_POST, 'food'); 20$_SESSION["reason"] = filter_input(INPUT_POST, 'reason'); 21 22$id = $_SESSION["id"]; 23$rank = $_SESSION["rank"]; 24$nation = $_SESSION["nation"]; 25$food = $_SESSION["food"]; 26$reason = $_SESSION["reason"]; 27 28 29 30 31?> 32 33<!DOCTYPE html> 34<html lang="ja"> 35 36<head> 37 <meta charset="utf-8"> 38 <title>編集画面</title> 39 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 40 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen"> 41 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> 42 <link href="org.css" rel="stylesheet" media="screen"> 43</head> 44 45<body> 46 47<!-- エラー表示 --> 48 49 50 51 <!-- テーブル(表) --> 52 <div class="table-responsive" style="margin-top:60px;"> 53 <table id="table1" class="table table-hover"> 54 <form action="update_end.php" method="post"> 55 <!-- ここは基本記述 --> 56 <thead> 57 <tr> 58 <th>順位</th> 59 <th>国名</th> 60 <th>食べたい食べ物</th> 61 <th>理由</th> 62 <th></th> 63 </tr> 64 </thead> 65 66 67 68 <tbody> 69 70 <tr> 71 <input type="hidden" name="id" value="<?php echo h($id); ?>"> 72 <td><input type="text" name="rank" value="<?php echo h($rank); ?>"></td> 73 <td><input type="text" name="nation" value="<?php echo h($nation); ?>"></td> 74 <td><input type="text" name="food" value="<?php echo h($food); ?>"</td> 75 <td><input type="text" name="reason" value="<?php echo h($reason); ?>"></td> 76 <td> 77 <button type="submit" class="btn btn-primary btn-xs">変更する</button> 78 </td> 79 </tr> 80 81 </tbody> 82 83 84 85 86 </form> 87 </table> 88 </div> 89 90 91 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 92 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 93 </body> 94 95</html> 96

update_end.php

php

1<?php 2ini_set("display_errors", 1); 3error_reporting(E_ALL); 4 5session_start(); 6 7// 文字化け対策 8header("Content-type: text/html; charset=UTF-8"); 9// 初期化 10$errors = array(); 11 12require_once(__DIR__. "/db.php"); 13// セッション変数の定義 14$_SESSION["id"] = filter_input(INPUT_POST, 'id'); 15$_SESSION["rank"] = filter_input(INPUT_POST, 'rank'); 16$_SESSION["nation"] = filter_input(INPUT_POST, 'nation'); 17$_SESSION["food"] = filter_input(INPUT_POST, 'food'); 18$_SESSION["reason"] = filter_input(INPUT_POST, 'reason'); 19// 変数の定義 20$id = $_SESSION["id"]; 21$rank = $_SESSION["rank"]; 22$nation = $_SESSION["nation"]; 23$food = $_SESSION["food"]; 24$reason = $_SESSION["reason"]; 25 26 27// 入力チェック 28if (empty($_SESSION["rank"])) { 29 $errors["rank"] = "順位が入力されていません。"; 30} 31 32if (empty($_SESSION["nation"])) { 33 $errors["nation"] = "国名が入力されていません。"; 34} 35 36if (empty($_SESSION["food"])) { 37 $errors["food"] = "食べ物が入力されていません。"; 38} 39 40if (empty($_SESSION["reason"])) { 41 $errors["reason"] = "理由が入力されていません。"; 42} 43 44// 数値チェック 45if (!preg_match('/^[0-9]*/', $rank) && !empty($_SESSION["rank"])) { 46 $errors["rank"] = "順位を入力してください。"; 47} 48 49 50 51if (count($errors) === 0) { 52 53try { 54 55 // プリペアドステートメント 56 $statement = $dbh->prepare("UPDATE country SET id = :id, rank = :rank, nation = :nation, food = :food, reason = :reason"); 57 58 if ($statement) { 59 // プレースホルダへ実際の値を設定する 60 $statement->bindValue(':id', $rank, PDO::PARAM_STR); 61 $statement->bindValue(':rank', $rank, PDO::PARAM_STR); 62 $statement->bindValue(':nation', $nation, PDO::PARAM_STR); 63 $statement->bindValue(':food', $food, PDO::PARAM_STR); 64 $statement->bindValue(':reason', $reason, PDO::PARAM_STR); 65 66 $_SESSION["id"] = filter_input(INPUT_POST, $id); 67 $_SESSION["rank"] = filter_input(INPUT_POST, $rank); 68 $_SESSION["nation"] = filter_input(INPUT_POST, $nation); 69 $_SESSION["food"] = filter_input(INPUT_POST, $food); 70 $_SESSION["reason"] = filter_input(INPUT_POST, $reason); 71 72 // クエリ実行 73 $statement->execute(); 74 75 // データベース切断 76 $dbh = null; 77 } 78 } catch (PDOException $e) { 79 print('Error:' .$e->getMessage()); 80 $errors["error"] = "データベース接続失敗しました。"; 81 } 82 83 84} elseif (count($errors) > 0) { 85 foreach ($errors as $error) { 86 $_SESSION["errors"] = $errors; 87 } 88} 89 90?> 91 92 93<!DOCTYPE html> 94<html lang="ja"> 95 96<head> 97 <meta charset="utf-8"> 98 <title>更新完了</title> 99 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 100 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen"> 101 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> 102 <link href="org.css" rel="stylesheet" media="screen"> 103</head> 104 105<body> 106 107<p>更新完了</p> 108<a href="index.php"><button type="button" name="singlebutton" class="btn btn-primary" id="singlebutton">戻る</button></a> 109 110<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 111 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 112 </body> 113 114</html> 115

イメージ説明
イメージ説明

修正後 update_end.php

php

1<?php 2ini_set("display_errors", 1); 3error_reporting(E_ALL); 4 5session_start(); 6 7// 文字化け対策 8header("Content-type: text/html; charset=UTF-8"); 9// 初期化 10$errors = array(); 11 12require_once(__DIR__. "/db.php"); 13// セッション変数の定義 14$_SESSION["id"] = filter_input(INPUT_POST, 'id'); 15$_SESSION["rank"] = filter_input(INPUT_POST, 'rank'); 16$_SESSION["nation"] = filter_input(INPUT_POST, 'nation'); 17$_SESSION["food"] = filter_input(INPUT_POST, 'food'); 18$_SESSION["reason"] = filter_input(INPUT_POST, 'reason'); 19// 変数の定義 20$id = $_SESSION["id"]; 21$rank = $_SESSION["rank"]; 22$nation = $_SESSION["nation"]; 23$food = $_SESSION["food"]; 24$reason = $_SESSION["reason"]; 25 26 27// 入力チェック 28if (empty($_SESSION["rank"])) { 29 $errors["rank"] = "順位が入力されていません。"; 30} 31 32if (empty($_SESSION["nation"])) { 33 $errors["nation"] = "国名が入力されていません。"; 34} 35 36if (empty($_SESSION["food"])) { 37 $errors["food"] = "食べ物が入力されていません。"; 38} 39 40if (empty($_SESSION["reason"])) { 41 $errors["reason"] = "理由が入力されていません。"; 42} 43 44// 数値チェック 45 if (!preg_match('/^[0-9]*/', $rank) && !empty($_SESSION["rank"])) { 46 $errors["rank"] = "順位を入力してください。"; 47} 48 49 50 51if (count($errors) === 0) { 52 53try { 54 55 $dbh = new PDO($dsn, $user, $password); 56 57 // プリペアドステートメント 58 $statement = $dbh->prepare("UPDATE country SET rank = :rank, nation = :nation, food = :food, reason = :reason WHERE id = :id"); 59 60 if ($statement) { 61 // プレースホルダへ実際の値を設定する 62 $statement->bindValue(':id', $rank, PDO::PARAM_STR); 63 $statement->bindValue(':rank', $rank, PDO::PARAM_STR); 64 $statement->bindValue(':nation', $nation, PDO::PARAM_STR); 65 $statement->bindValue(':food', $food, PDO::PARAM_STR); 66 $statement->bindValue(':reason', $reason, PDO::PARAM_STR); 67 68 69 $id = filter_input(INPUT_POST, $id); 70 $rank = filter_input(INPUT_POST, $rank); 71 $nation = filter_input(INPUT_POST, $nation); 72 $food = filter_input(INPUT_POST, $food); 73 $reason = filter_input(INPUT_POST, $reason); 74 75 // クエリ実行 76 $statement->execute(); 77 78 // データベース切断 79 $dbh = null; 80 } 81 } catch (PDOException $e) { 82 print('Error:' .$e->getMessage()); 83 $errors["error"] = "データベース接続失敗しました。"; 84 } 85 86 87} elseif (count($errors) > 0) { 88 foreach ($errors as $error) { 89 $_SESSION["errors"] = $errors; 90 } 91} 92 93?> 94 95 96<!DOCTYPE html> 97<html lang="ja"> 98 99<head> 100 <meta charset="utf-8"> 101 <title>更新完了</title> 102 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 103 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" media="screen"> 104 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> 105 <link href="org.css" rel="stylesheet" media="screen"> 106</head> 107 108<body> 109 110<p>更新完了</p> 111<a href="index.php"><button type="button" name="singlebutton" class="btn btn-primary" id="singlebutton">戻る</button></a> 112 113<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 114 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 115 </body> 116 117</html> 118

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

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

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

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

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

guest

回答1

0

ベストアンサー

update 文に where 句をつけて更新していないからですね。
1位のところじゃなくで、これ全権更新していますよ。

投稿2017/12/16 02:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

dog57

2017/12/16 05:55 編集

whereを追加したらそれぞれ更新できました。 しかし、順位(rank)がidと同じ番号じゃないと変更できなくなってしまいました。 順位をid と違う番号にしようとしても番号が変わりません。 質問文一番下の画像2つです。 なぜでしょうか、、、
退会済みユーザー

退会済みユーザー

2017/12/16 05:55

設計が間違っているからとしか言いようがないですね…
dog57

2017/12/16 06:05

なるほど。コードのミスではなさそうですね。。
退会済みユーザー

退会済みユーザー

2017/12/16 06:07 編集

(修正後の)コードの提示もないので判断できません
dog57

2017/12/16 06:13 編集

質問欄の一番下に「修正後 update_end.php」で修正後のコードを追加しました。 58行目に where句を追加したのが変更点になります。 原因を見つけていただれば嬉しいです。
退会済みユーザー

退会済みユーザー

2017/12/16 06:15

バインドの順番をSQLに合わせよう。 $statement->execute();の直前の filter_input は何か意味あって書いているんですか? 全体的にそういうところが雑です。
退会済みユーザー

退会済みユーザー

2017/12/16 06:23 編集

そのあと、変数使ってもいないのに必要ないでしょ。 書く場所がおかしいでしょう。
dog57

2017/12/16 06:37

わかりました。 修正します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問