iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 12
0
Modern Web

寫給朋友的 PHP 從 0 到 100 實戰教程系列 第 12

Day 12. PHP教學: 取得使用者輸入的資料存到資料庫

Why
很多時候,使用者想要跟貼文互動,例如留言按讚之類的
我們透過什麼方法可以去搜集資料呢?
最簡單的答案是 HTML 的表單: 也就是

<form action="...ENTER_YOUR_URL..." method="post">
    <input type="text" name="data"><!--文字欄位-->
    <input type="submit"><!--按下這個送出按鈕就可以把文字送到後端-->
</form>

How
那 PHP 的部分要怎麼接收呢?透過 $_POST 就可以囉,這裡的 data 是因為要跟上面文字欄位的 name="data" 對應。

echo $_POST['data'];

What
來看看怎麼實作到我們的專案上吧,先做個簡單版本:先開這個畫面檔案

/Application/XAMPP/htdocs/game/view/body/create.php

內容:

<form action="<?=Config::BASE_URL?>do_create" method="post">
    <input type="text" name="hero_name">
    <input type="text" name="hero_description">
    <input type="submit" value="submit">
</form>

再來到 route.php
改寫成這樣,加上兩個 case

<?php
$route = new Router(Request::uri()); //搭配 .htaccess 排除資料夾名稱後解析 URL
$route->getParameter(1); // 從 http://127.0.0.1/game/aaa/bbb 取得 aaa 字串之意

// 用參數決定載入某頁並讀取需要的資料
switch($route->getParameter(1)){
    case "do_create": // 執行儲存動作後回到新增表單畫面
      $hero_name = "";
      $hero_description = "";
      if(isset($_POST['hero_name']))$hero_name = $_POST['hero_name'];
      if(isset($_POST['hero_description']))$hero_description = $_POST['hero_description'];
      
      if($hero_name != '' and $hero_description != ''){
        $table = "hero";
        $data_array['hero_name'] = $hero_name;
        $data_array['hero_description'] = $hero_description;
        Database::get()->insert($table, $data_array);
      }
      header("Location: ".Config::BASE_URL."create");
      exit;
    break;
    case "create": // 顯示新增表單畫面
      include('view/header/default.php'); // 載入共用的頁首
      include('view/body/create.php');    // 載入新增用的表單
      include('view/footer/default.php'); // 載入共用的頁尾
    break;
    case "list":
      // 讀取全英雄列表資料
      // Database::get()->query( ...略... );

      include('view/header/default.php'); // 載入共用的頁首
      include('view/body/list.php');
      include('view/footer/default.php'); // 載入共用的頁尾
    break;

    case "hero":
      // 讀取單一英雄資料
      // Database::get()->query( ...略... );

      include('view/header/default.php'); // 載入共用的頁首
      include('view/body/hero.php');
      include('view/footer/default.php'); // 載入共用的頁尾
    break;

    default:
      include('view/header/default.php'); // 載入共用的頁首
      include('view/body/default.php');
      include('view/footer/default.php'); // 載入共用的頁尾
    break;
}

接下來我們就可以到這個連結來測試輸入,並且到資料庫裡面找到對應的 hero table 來查看是否正確

http://127.0.0.1/game/create


上一篇
Day 11. PHP教學: 使用單例模式來連接資料庫
下一篇
Day 13. PHP教學: 檢查使用者輸入的資料
系列文
寫給朋友的 PHP 從 0 到 100 實戰教程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
e3561025
iT邦新手 5 級 ‧ 2021-10-18 16:22:45

Config::BASE_URL 這個部分會報錯,砍掉就沒問題了
網路上查找是說要在autoload.php 去加上 $autoload['helper'] = array('url'); 目前加了也沒有作用,還在尋找這問題怎麼解決。
目前感覺是要額外寫一個class名為Config,裡面加上BASE_URL的參數。

另外 從create網頁post出去後卻每次都回到create網站,這是因為 do_create的內容有個header("Location: xxxxxxxxx"),會因為執行到這行就自動跳轉網址,所以不會再do_create網頁上逗留。

我要留言

立即登入留言