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

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

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

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

PHP

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

Q&A

1回答

720閲覧

PHP表から値を取り出す方法

KOKOAMIX

総合スコア0

MySQL

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

PHP

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

0グッド

0クリップ

投稿2021/05/08 10:41

PHPとMYSQLでの表作成

phpとmysqlを使い表を作っていて、inputのsubmitを押すとUPDATEされるという仕様なのですがUPDATEをかけた時に正しくUPDATEされません。
1番目のボタンを押した後、2番目のボタンを押すと1番目のボタンのcreatedが変更されます。時間も少しおかしいです。

php

1<?php 2session_start(); 3require('dbconnect.php'); 4 5$row_count = []; 6$sql = "SELECT * FROM members ORDER BY name"; 7$stmt = $db->query($sql); 8 9?> 10<!DOCTYPE html> 11<html lang="ja"> 12<head> 13 <meta charset="UTF-8"> 14 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 15 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 16 <link rel="stylesheet" href="profile.css"> 17 <title>Document</title> 18</head> 19<body> 20 <form method="post" action=""> 21 <table border="1"> 22 <tr> 23 <th>名前</th> 24 <th>取引終了時間</th> 25 </tr> 26 <?php foreach($stmt as $row): ?> 27 <tr> 28 <td><?php echo($row['name']); ?></td> 29 <td><?php echo($row['created']); ?></td> 30 <td><input type="submit" name="<?php echo($row['name']); ?>" value="時間更新"></td> 31 </tr> 32 <?php 33 if (isset($_POST[$row['name']])) { 34 print($row['name']); 35 $stmt = $db->prepare('UPDATE members SET created = NOW() WHERE name = :name '); 36 $stmt->execute(array(':name' => $row['name'])); 37 } 38 ?> 39 <?php endforeach; ?> 40 </form> 41 <table> 42 </form> 43 <h1><a href="index.php">入力画面</a></h1> 44</body> 45</html>

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

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

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

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

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

phper.k

2021/05/08 11:03

テーブルの構造がわかるように、CREATE 文で定義を提示してください。
takasima20

2021/05/08 11:05

$_POST[$row['name'] はどこからくるのかな?
KOKOAMIX

2021/05/08 11:13

$_POST[$row['name']]はformのmethodのpostとinputのsubmitのnameから来てます。
takasima20

2021/05/08 12:01

とりあえず、foreach で $stmt 使ってるのでループ内のは別の変数名に変えた方がいいです。
phper.k

2021/05/08 13:24

テーブルの構造がわかるように、CREATE 文で定義を提示してください。
guest

回答1

0

わかりにくい。
票を表示する処理の中に、なぜかデータ更新する処理が紛れ込んでいる。
本当にそういう書き方をしないと実現できない唯一の方法なんだろうかを考えこんでしまう。

表全体がフォームになっているようだけど、
テーブルmembersからnameとcreatedのペアを使って表示しようとしているよね。
nameをPOST受信したものを認識してcreatedを更新するのだとすると、
わたしなら更新する処理をHTML表示し始める前に持ってきちゃうね。
そして、表を表示する箇所は、表の表示にのみ専念させる。
そのほうがわかりやすい。

表を表示するためのSELECT文を実行するのを管理する$stmtと、
createdを更新するUPDATE文を実行するのを管理する$stmtでは、
変数名の使いまわしなので、foreachの中で一度UPDATE文を実行すると
ずーっとUPDATE文の$stmtを参照しようとしておかしくなるはず。
そういう混乱を避けるためにも、
HTML出力する前に、更新する処理を持ってきたらいいです。
変数名のダブりを解消したらとりあえず動くかもしれないけど、
わかりにくい構造自体がデバッグしづらくしているのでお勧めできません。

最小限、書き直してみました。
表全体をフォームにしないで、一行ごとに細かくフォームにしました。
更新するべき対象のnameを与えるために、hiddenにてnameパラメータを送信するようにしました。
nameパラメータを頼って更新するように処理を改めました。
(あくまで机上のコードで実行していませんので、バグなどありましたらすみません。)

php

1<?php 2session_start(); 3require('dbconnect.php'); 4 5// createdの更新処理 6var_dump($_POST['name']); 7if (isset($_POST['name'])) { 8 $stmt = $db->prepare('UPDATE members SET created = NOW() WHERE name = :name '); 9 $stmt->execute(array(':name' => $_POST['name'])); 10} 11 12$row_count = []; 13$sql = "SELECT * FROM members ORDER BY name"; 14$stmt = $db->query($sql); 15 16?> 17<!DOCTYPE html> 18<html lang="ja"> 19<head> 20 <meta charset="UTF-8"> 21 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 22 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 23 <link rel="stylesheet" href="profile.css"> 24 <title>Document</title> 25</head> 26<body> 27 <table border="1"> 28 <tr> 29 <th>名前</th> 30 <th>取引終了時間</th> 31 </tr> 32<?php foreach($stmt as $row): ?> 33 <tr> 34 <td><?php echo($row['name']); ?></td> 35 <td><?php echo($row['created']); ?></td> 36 <td><form method="post" action=""><input type="hidden" name="name" value="<? echo $row['name']; ?>"><input type="submit" name="submit" value="時間更新"></form></td> 37 </tr> 38<?php endforeach; ?> 39 <table> 40 <h1><a href="index.php">入力画面</a></h1> 41</body> 42</html>

投稿2021/05/08 14:41

編集2021/05/09 03:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

KOKOAMIX

2021/05/09 02:54

回答ありがとうございます。僕もforeach内に処理をかくのはおかしいと思っていたのですが、訂正していただいたコードのように上に処理を書くと更新されないです。回答していただければ幸いです。
退会済みユーザー

退会済みユーザー

2021/05/09 03:54

nameがhiddenとsubmitボタンでダブってしまうとうまく動かないので、submitボタンのを変えてみました。お試しください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問