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

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

ただいまの
回答率

89.63%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 808

dog57

score 119

前提・実現したいこと

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

イメージ説明

イメージ説明

イメージ説明

発生している問題・エラーメッセージ

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

イメージ説明

イメージ説明

イメージ説明

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

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

update3.phpのif文の一部

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

エラー文取得のコード

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

該当のソースコード

①一覧画面 update1.php

<?php

header("Content-type: text/html; charset=utf-8");

require_once("index_db.php");


$sql = "SELECT id, rank, nation, food, reason FROM country";
$statement = $pdo->query($sql);

// 結果の取得
$country = array();
foreach ($statement as $row) {
    $country[] = $row;
}
var_dump($country);

// データベース切断
$pdo = null;

?>

<!DOCTYPE html>
<html>
<head>
<title>国一覧</title>
</head>
<body>
<h1>国一覧</h1>

<table border='1'>
  <tr><td>id</td><td>順位</td><td>国名</td><td>食べたい食べ物</td><td>理由</td></tr>

<?php
 foreach($country as $row){
 ?>



 <tr>
     <td><?=$row['id']?></td>
     <td><?=htmlspecialchars($row['rank'], ENT_QUOTES, 'UTF-8')?></td>
     <td><?=htmlspecialchars($row['nation'], ENT_QUOTES, 'UTF-8')?></td>
     <td><?=htmlspecialchars($row['food'], ENT_QUOTES, 'UTF-8')?></td>
     <td><?=htmlspecialchars($row['reason'], ENT_QUOTES, 'UTF-8')?></td>
     <td>
   <form action="update2.php" method="post">
      <input type="submit" value="編集">
      <input type="hidden" name="id" value="<?=$row['id']?>">
      <input type="hidden" name="rank" value="<?=$row['rank']?>">
      <input type="hidden" name="nation" value="<?=$row['nation']?>">
      <input type="hidden" name="food" value="<?=$row['food']?>">
      <input type="hidden" name="reason" value="<?=$row['reason']?>">
   </form>
 </td>
</tr>



 <?php
 }
 ?>

</table>

</body>
</html>

②変更画面 update2.php

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

header("content-type: text/html; charset=utf-8");
require_once("index_db.php");


try {

    if(empty($_POST)) {
        echo "<a href='update1.php'>update1.php</a>←こちらのページからどうぞ";
        exit();
    }else {
        if (!isset($_POST['id'])  || !is_numeric($_POST['id']) ){
            echo "idエラー";
            exit();
        }else {
            //プリペアドスタートメント
            $stmt = $pdo->prepare('select * from country where id=?, rank=?, nation=?, food=?, reason=?');
            if ($stmt) {
                //プレースホルダへ実際の値を設定する
                $stmt->bindParam(1, $id);
                $stmt->bindParam(2, $rank);
                $stmt->bindParam(3, $nation);
                $stmt->bindParam(4, $food);
                $stmt->bindParam(5, $reason);
                $id = $_POST['id'];
                $rank = $_POST['rank'];
                $nation = $_POST['nation'];
                $food = $_POST['food'];
                $reason = $_POST['reason'];

                //クエリの実行
                $stmt->execute();

                //結果変数のバインド
                $result = $stmt->fetch();


                //値の取得
                $stmt->fetch();

                //ステートメント切断
                $pdo = null;
            }
        }
    }
} catch (Exception $e){
  echo 'error';
    echo('エラーが発生しました。:'.$e->getMessage());
    exit;
}


?>

<iDOCTYPE html>
  <!DOCTYPE html>
  <html>

<head>
  <title>変更画面</title>
</head>

<body>

<p>変更してください</p>

<table border=1>

<form action="update3.php">
  <tr>
    <th>順位</th>
    <th>国名</th>
    <th>食べたい食べ物</th>
    <th>理由</th>
  </tr>

  <tr>
    <td> <input type="hidden" name="id" value="<?=$id?>"></td>
    <td><input type="text" name="rank" value="<?=htmlspecialchars($rank, ENT_QUOTES, 'UTF-8')?>"></td>
    <td><input type="text" name="nation" value="<?=htmlspecialchars($nation, ENT_QUOTES, 'UTF-8')?>"></td>
    <td><input type="text" name="food" value="<?=htmlspecialchars($food, ENT_QUOTES, 'UTF-8')?>"></td>
    <td> <input type="text" name="reason" value="<?=htmlspecialchars($reason, ENT_QUOTES, 'UTF-8')?>"></td>
    <td><input type="submit" value="変更する"></td>
  </tr>



</form>

</table>

</body>

  </html>

③更新完了画面 update3.php

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

header("content-type: text/html; charset=utf-8");
require_once("index_db.php");

try {

  if(empty($_POST)) {
       echo "<a href='update1.php'>update1.php</a>←こちらのページからどうぞ";
       exit();
  }else {
       //名前入力チェック
       if (!isset($_POST['id'])  || $_POST['id'] === "" ){
         $errors['id'] = "名前が入力されていません。";
    }

      if(count($errors) === 0) {
        //プリペアドステートメント
        $stmt = $pdo->prepare("update country set rank=?, nation=?, food=?, reason=? where id=?,");
        if ($stmt) {
          //プレースホルダに実際の値を設定する

          $stmt->bindParam(1, $rank, PDO::PARAM_STR);
          $stmt->bindParam(2, $nation, PDO::PARSM_STR);
          $stmt->bindParam(3, $food, PDO::PARAM_STR);
          $stmt->bindParam(4, $reason, PDO::PARAM_STR);
          $stmt->bindParam(5, $id, PDO::PARAM_STR);


          $id = $_POST['id'];
          $rank = $_POST['rank'];
          $nation = $_POST['nation'];
          $food = $_POST['food'];
          $reason = $_POST['reason'];

          //クエリ実行
          $stmt->execute();
          //ステートメント切断
          $pdo = null;

        }
     }
  }
}catch (Exception $e) {
  echo 'error';
   echo ('エラーが発生しました。:'.$e->getMessage());
   exit;
}
 ?>

 <!DOCTYPE html>
<html>
 <head>
 <title>変更画面</title>
 </head>
  <body>
     <h1>変更画面</h1>

      <?php if (count($errors) === 0): ?>
      <p>変更完了しました。</p>
      <?php elseif(count($errors) > 0): ?>
      <?php
      foreach($errors as $value){
           echo "<p>".$value."</p>";
  }
  ?>
      <?php endif; ?>


    </body>
  </head>


 </html>

補足情報(言語/FW/ツール等のバージョンなど)

php5.6,mysql  Ver 14.14
イメージ説明
イメージ説明

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

// 画面2
try {
    if (empty($_POST)) {
        echo "<a href='update1.php'>update1.php</a>←こちらのページからどうぞ";
        exit();
    } else {
        $id = $_POST['id'];
        $rank = $_POST['rank'];
        $nation = $_POST['nation'];
        $food = $_POST['food'];
        $reason = $_POST['reason'];

        if (empty($_POST['id']) || !is_numeric($_POST['id'])) {
            echo "idエラー";
            exit();
        }
    }
} catch (Exception $e) {
    echo 'error';
    echo('エラーが発生しました。:'.$e->getMessage());
    exit;
}
?>

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

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

// 画面3
try {
    if (empty($_POST)) {
        echo "<a href='update1.php'>update1.php</a>←こちらのページからどうぞ";
        exit();
    } else {
        // 項目
        $items = array('rank' => '順位', 'nation' => '国名', 'food' => '食べたい食べ物', 'reason' => '理由');

        //ID入力チェック
        if (empty($_POST['id']) || !is_numeric($_POST['id'])) {
            $errors['id'] = "IDが入力されていないか、数値ではありません。";
        } else {
            $id = $pdo->quote($_POST['id']);
        }

        // ID以外項目入力値チェック
        foreach ($items as $key => $label) {
            if (! empty($_POST[$key])) {
                ${$key} = $pdo->quote($_POST[$key]);
                continue;
            }
            $errors[$key] = $label."が入力されていません。";
        }

        if (empty($errors)) {
            //ランク「位」補完
            false === strpos($rank, '位') && $rank .= '位';

            //プリペアドステートメント
            $stmt = $pdo->prepare("update country set rank=?, nation=?, food=?, reason=? where id=?");

            //DB更新
            if (! $stmt->execute(array($rank, $nation, $food, $reason, $id))) {
                $errors['exec'] = 'DB更新に失敗しました。';
            }

            $pdo = null;
        }
    }
} catch (Exception $e) {
    echo 'error';
    echo ('エラーが発生しました。:'.$e->getMessage());
    exit;
}
?>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/02 17:34

    ありがとうございます!

    無事、データベースを更新することができました。

    キャンセル

  • 2017/09/02 17:34

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

    キャンセル

  • 2017/09/02 18:19

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/01 22:37

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

    キャンセル

  • 2017/09/01 22:42

    回答を別にします。

    キャンセル

  • 2017/09/01 22:49

    かしこまりました。

    キャンセル

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる