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

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

ただいまの
回答率

88.79%

編集画面で現在のデータを表示する処理

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,807

onslaught

score 19

条件をdeleted_atがNULLであること、idカラムが更新したいidと一致していることを条件にSELECT文でデータを取得し、編集ページで入力欄に現在のtodoカラムのデータを表示させたいのですが何も表示されずで上手く実装できません。

トップページ
<?php

  require_once('functions.php');
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>todoリスト</title>
</head>
<body>
  Todoリスト
  <div>
    <a href="new.php">
      <p>新規作成</p>
    </a>
  </div>
  <div>
    <table>
      <tr>
        <th>ID</th>
        <th>内容</th>
        <th>更新</th>
        <th>削除</th>
      </tr>

      <?php foreach (getTodoList() as $todo) : ?> 
        <tr>
          <td><?= $todo['id']; ?></td> 
          <td><?= $todo['todo']; ?></td> 
          <td>
            <a href="edit.php?id=<?= $todo['id']; ?>">更新</a>

          </td>
          <td>
            <form action="store.php" method="post">
              <input type="hidden" name="id" value="<?= $todo['id']; ?>">
              <button type="submit">削除</button>
            </form>
          </td>
        </tr>
      <?php endforeach; ?> 
    </table>
  </div>
</body>
</html>
編集ページ
<?php
  require_once('functions.php');
?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>編集</title> 
</head>
<body>
  <form action="store.php" method="post">
    <input type="hidden" name="id" value="<?= $_GET['id']; ?>">
    <input type="text" name="todo" value="<?= getSelectedTodo($_GET['id']); ?>">
    <input type="submit" value="更新">
  </form>
  <div>
    <a href="index.php">一覧へ戻る</a>
  </div>
</body>
</html>
処理をまとめたファイル
<?php

  require_once('connection.php'); 

  function getTodoList() 
  {
    return getAllRecords(); 
  }

  function getSelectedTodo($id)
  {
    return getTodoTextById($id); 
  }

  function savePostedData()
  {
    $post = $_POST;
    $path = getRefererPath();
    switch ($path) {
      case '/new.php':
          createTodoData($post['todo']);
          break;
      case '/edit.php':
          updateTodoData($post);
          break;
      case '/index.php':
          deleteTodoData($post['id']);
          break;
      default:
          break;
    }
  }

  function getRefererPath()
  {
    $urlArray = parse_url($_SERVER['HTTP_REFERER']);
    return $urlArray['path'];
  }

?>
DB操作をまとめたファイル
<?php

  require_once('config.php'); 


  function connectPdo()
  {
    try {
      return new PDO(DSN, DB_USER, DB_PASSWORD); 
    } catch(PDOException $e) { 
      echo $e->getMessage(); 
      exit(); 
    }
  }


  function createTodoData($todoText) 
  {
    $dbh = connectPdo(); 
    $sql = 'INSERT INTO todos (todo) VALUES (:todoText)'; 
    $stmt = $dbh->prepare($sql); 
    $stmt->bindValue(':todoText', $todoText, PDO::PARAM_STR); 
    $stmt->execute(); 
  }


  function getAllRecords()
  {
    $dbh = connectPdo(); 
    $sql = 'SELECT * FROM todos WHERE deleted_at IS NULL'; 
    return $dbh->query($sql)->fetchAll(); 
  }


  function updateTodoData($post) 
  {
    $dbh = connectPdo();
    $sql = 'UPDATE todos SET todo = :todoText WHERE id = :id';
    $stmt = $dbh->prepare($sql); 
    $stmt->bindValue(':todoText', $post['todo'], PDO::PARAM_STR); 
    $stmt->bindValue(':id', (int)$post['id'], PDO::PARAM_INT); 
    $stmt->execute(); 
  }

  **↓ここの実装が上手くいかないです**
  function getTodoTextById($id)
  {
    $dbh = connectPdo();
    $sql = 'SELECT * FROM todos WHERE id = :id AND deleted_at IS NULL';
    $stmt = $dbh->prepare($sql);
    $stmt->bindValue(':id', (int)$id, PDO::PARAM_INT);
    $data = $stmt->execute();
    return $data['todo'];
  }


  function deleteTodoData($id)
  {
    $dbh = connectPdo();
    $now = date('Y-m-d H:i:s');
    $sql = 'UPDATE todos SET deleted_at = :now WHERE id = :id';
    $stmt = $dbh->prepare($sql);
    $stmt->bindValue(':now', $now, PDO::PARAM_STR);
    $stmt->bindValue(':id', $id, PDO::PARAM_INT);
    $stmt->execute();
  }


?>

イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

PDOStatement::executeの戻り値は、成功か失敗かを示すbool値です。

  $data = $stmt->execute();
  return $data['todo'];

ではなく:

  $stmt->execute();
  $data = $stmt->fetch(PDO::FETCH_ASSOC);
  return $data['todo'];

のようにしなければならないのではないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/05/14 00:07

    なるほど、勉強不足でした。
    ありがとうございました。

    キャンセル

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

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

関連した質問

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