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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

解決済

PHP SQLを更新したい

n_k23
n_k23

総合スコア21

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

3回答

0評価

0クリップ

478閲覧

投稿2021/12/13 07:05

編集2021/12/13 07:39

前提・解決したいこと

PHPの更新フォームからのデータをSQLに反映させる際にうまくデータ更新がされない。
色々と手を尽くしてみたがうまく更新されないため相談させてください。
sqlは/tech.pjin.jp/blog/2017/06/08/sqlのworldcupを使用。
文字制限のため所々省略しています。

データの流れとしては
1、編集更新画面(edit.php)にて変更箇所を記述し送信
2、controllerのバリデーション関数にてチェックし問題なければデータをupdate.phpへ送る
3、update.phpでデータを受け取るとModelのSQL更新用関数にデータを送る

試したこと

他の記事にて参考になるもの(チェックリスト)があったので確認してみた。

  1. stmt->executeはtrueかfalseを返します。trueが返ってきていますか?

A. falseが返っきている。
2. executeした直後にecho $stmt->rowCount();で作用した行数を取ってみてください。
0だったらWHERE句に指定したidがおかしいかも。
A. 0だったのでWHERE句に指定したidがおかしいことが判明。
3. ということで$_POST['id']もチェックしてみてください。値が入ってる?
4. 入ってなかったらなんで入っていないか考えましょう。actionのurlに埋めてる?それって$_POSTで取れるの?
A. 3・4を検証していたがうまくいかず困っている。

$post['id']を出力してみるとデータがしっかりと入っているのみ更新されないので困惑しています。

php

// MVC View index.php <?php require_once(ROOT_PATH .'Controllers/PlayerController.php'); $player = new PlayerController(); $params = $player->index(); ?> <!DOCTYPE html> <html lang="en"> <body> <h2>選手一覧</h2> <table> <?php foreach($params['players'] as $player): ?> <tr> <td><?=$player['id'] ?></td> <td><?=$player['uniform_num'] ?></td> // 省略 <td><a href="view.php?id=<?php echo $player['id'] ?>">詳細</a></td> <td><a href="edit.php?id=<?php echo $player['id'] ?>">編集</a></td> <td><a class="delete" href="delete.php?id=<?php echo $player['id'] ?>">削除</a></td> </tr> <?php endforeach; ?> </table> </body> </html>

php

//MVC View edit.php <?php require_once(ROOT_PATH .'Controllers/PlayerController.php'); $request = new PlayerController(); $params = $request->edit(); //編集送信画面 $id = $params['player']['id']; $country_id = (int)$params['player']['country_id']; $uniform_num = $params['player']['uniform_num']; $position = $params['player']['position']; $name = $params['player']['name']; $country = $params['player']['c_name']; $club = $params['player']['club']; $birth = $params['player']['birth']; $height = $params['player']['height']; $weight = $params['player']['weight']; ?> <!DOCTYPE html> <html lang="en"> <body> <?php error_reporting(E_ALL & ~E_NOTICE); session_start(); //送信ボタンクリック後 if( $_SERVER['REQUEST_METHOD'] === 'POST') { $post = filter_input_array(INPUT_POST, $_POST); echo "<pre>"; echo var_dump($post); //array(9) {["id"]=>string(1) "1" echo "</pre>"; echo "<pre>"; echo var_dump($_POST['id']);// string(1) "1" echo "</pre>"; exit(); //バリデーション list($post,$error) = $request->validate($post); if (count($error) === 0) { $_SESSION['form'] = $post; header('Location: update.php'); exit(); }else { if (isset($_SESSION['form'])){ $post = $_SESSION['form']; } } } ?> <div class="contact_box"> <h2>選手情報編集画面</h2> <form action="" method="POST" id="form"> <input type="hidden" name="id" value="<?php echo $id?>"> <p>ユニフォーム番号:</p> <?php if ($error['uniform_num'] === 'error'):?> <p class="error">ユニフォーム番号は半角数字で入力してください。</p> <?php endif; ?> <input type="text" name="uniform_num" id="uniform_num" value="<?php echo $uniform_num?>"> <p>ポジション:</p> <select name="position" id="position"> <option value="MF" <?php if($position === 'MF')echo "selected"?>>MF</option> <option value="GK" <?php if($position === 'GK')echo "selected"?>>GK</option> <option value="DF" <?php if($position === 'DF')echo "selected"?>>DF</option> <option value="FW" <?php if($position === 'FW')echo "selected"?>>FW</option> </select> <p>名前:</p> <?php if ($error['name'] === 'error'):?> <p class="error">名前を入力してください。</p> <?php endif; ?> <input type="text" name="name" id="name" value="<?php echo $name?>"> <p>国:</p> <select name="country_id" id=""> <option value="1" <?php if($country_id === 1) echo "selected"?>>ブラジル</option> <option value="2" <?php if($country_id === 2) echo "selected"?>>メキシコ</option> // 省略 <option value="31" <?php if($country_id === 31) echo "selected"?>>ロシア</option> <option value="32" <?php if($country_id === 32) echo "selected"?>>韓国</option> </select> <p>所属クラブ:</p> <?php if ($error['club'] === 'error'):?> <p class="error">所属クラブを入力してください。</p> <?php endif; ?> <input type="text" name="club" id="club" value="<?php echo $club?>"> <p>誕生日:</p> <?php if ($error['birth'] === 'error'):?> <p class="error">存在する誕生日を入力してください。例,1980-01-01(半角数字)</p> <?php endif; ?> <input type="text" name="birth" id="birth" value="<?php echo $birth?>"> <p>身長:</p> <?php if ($error['height'] === 'error'):?> <p class="error">身長は半角数字で入力してください</p> <?php endif; ?> <input type="text" name="height" id="height" value="<?php echo $height?>"> <p>体重:</p> <?php if ($error['weight'] === 'error'):?> <p class="error">体重は半角数字で入力してください</p> <?php endif; ?> <input type="text" name="weight" id="weight" value="<?php echo $weight?>"> <br> <div class="confirm_btn"> <button class="update" type="submit" >更 新</button> <a href="./index.php" class="back" type="button">トップへ戻る</a> </div> </form> </div> <script type="text/javascript" src="js/jquery-3.6.0.min.js"></script> <script src="js/jquery.js"></script> </body> </html>

PHP

//MVC controller <?php require_once(ROOT_PATH .'/Models/Player.php'); require_once(ROOT_PATH .'/Models/Goal.php'); class PlayerController { private $request; // リクエストパラメータ(GET,POST) private $Player; // Playerモデル private $Goal; // Goalモデル public function __construct() { // リクエストパラメータの取得 $this->request['get'] = $_GET; $this->request['post'] = $_POST; // モデルオブジェクトの生成 $this->Player = new Player(); // 別モデルとの連携 $dbh = $this->Player->get_db_handler(); $this->Goal = new Goal($dbh); } public function index() { $page = 0; if(isset($this->request['get']['page'])) { $page = $this->request['get']['page']; } $players = $this->Player->findAll($page); $players_count = $this->Player->countAll(); $params = [ 'players' => $players, 'pages' => $players_count / 20 ]; return $params; } // 編集画面用 public function edit() { if(empty($this->request['get']['id'])) { echo '指定のパラメータが不正です。このページは表示できません。'; exit; } $player = $this->Player->findById($this->request['get']['id']); $params = [ 'player' => $player, ]; return $params; } // 更新フォームバリデーション public function validate($post) { $error = []; // 省略 return [$post,$error]; } // 編集画面更新用 public function update($post) { // echo "<pre>"; // echo var_dump($post); // echo "</pre>"; // echo var_dump($post['club']); // exit(); $player = $this->Player->dbUpdate($post); }

PHP

//MVC Model <?php require_once(ROOT_PATH .'/Models/Db.php'); class Player extends Db { public function __construct($dbh = null) { parent::__construct($dbh); } // 選手情報更新用関数 public function dbUpdate($post) { try { // DB接続 $sth = $this->dbh; // DBを更新するSQL文 $sql = "UPDATE players SET name = :name, country_id = :country_id, uniform_num = :uniform_num, position = :position, club = :club, birth = :birth, height = :height, weight = :weight WHERE id = :id"; // トランザクション開始 $sth->beginTransaction(); // 値をセット $stmt = $sth->prepare($sql); $stmt->bindValue(':id',$post['id'],PDO::PARAM_INT); $stmt->bindParam(':name',$post['name'],PDO::PARAM_STR); $stmt->bindValue(':country_id',(int)$post['country_id'],PDO::PARAM_INT); $stmt->bindValue(':uniform_num',(int)$post['uniform_num'],PDO::PARAM_INT); $stmt->bindParam(':position',$post['position'],PDO::PARAM_STR); $stmt->bindParam(':club',$post['club'],PDO::PARAM_STR); $stmt->bindValue(':birth',(int)$post['birth'],PDO::PARAM_INT); $stmt->bindValue(':height',(int)$post['height'],PDO::PARAM_INT); $stmt->bindValue(':weight',(int)$post['weight'],PDO::PARAM_INT); $stmt->execute(); $sth->commit(); } catch(PDOException $e) { $sth->rollBack(); exit($e); } }

php

//MVC View update.php <?php require_once(ROOT_PATH .'Controllers/PlayerController.php'); session_start(); if (!isset($_SESSION['form'])){ header('Location: index.php'); exit(); } else { $post = $_SESSION['form']; } $player = new PlayerController(); $player->update($post); unset($_SESSION['form']); header('Location: index.php'); exit(); ?>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

m.ts10806

2021/12/13 07:09

「うまくいかず」のところを、どう書いて何が起きたか具体的に書いていただけると
n_k23

2021/12/13 07:13 編集

申し訳ありません。 うまくいかずはSQL更新する際のid指定がうまくいっていないのでidのデータを確認してみたのですが 更新関数の前で$post['id']を出力してみたのですがデータがしっかりときているので問題ないと思っているのですがSQL更新がされないことです。 質問を修正しておきます。
m.ts10806

2021/12/13 08:53

SQLではなくDBでは。 SQLはDBを更新するための命令文そのものです。
m.ts10806

2021/12/13 08:54

あと「うまくいかない」という表現が癖になってるみたいなのでやめられたほうが良いかと。情報量ゼロの表現です。
n_k23

2021/12/13 09:03

返信ありがとうございます。 確かに「うまくいかない」というのが癖になっていますね。 しっかりと内容を表現するように気を付けていきます。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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