:::

5. 將資料存到資料庫

一、關於PHP的資料庫連線

  1. 填完表單送出後,就準備寫入資料庫了。
  2. 要寫入資料庫,必須先連上資料庫,PHP的MySQL連線方式有 mysqlipdo 兩種方式
    1. mysqli 僅支援MySQL,但其語法和早期的 mysql 系列函數很像,所以,適合舊系統轉換,或者熟悉 mysql 系列函數者
    2. pdo 則支援十幾種資料庫,因此,若有需要切換資料庫者,這是不二選擇,缺點是性能較 mysqli 差一點,但安全性好。

二、用AI來建立資料表

  1. 表單初步設計好之後,也可以請AI來幫我們設計資料庫欄位
  2. 請輸入以下提示詞給AI:
    請依據以下表單,用MyISAM引擎產生一個名稱為 school_news 資料表,額外加入 media 欄位,用來存放多檔案的JSON資訊,還有加入點閱數欄位views。最後請輸出為 MySQL 語法,所有數字類型的欄位須為正整數,並以表單欄位中文名稱為該欄位註解。
    
    <form action="admin.php" method="POST" enctype="multipart/form-data">
        <div class="form-floating mb-3">
            <input type="text" class="form-control" id="news_title" name="news_title" placeholder="新聞標題" required>
            <label for="news_title">新聞標題</label>
        </div>
        <div class="form-floating mb-3">
            <textarea class="form-control" id="news_content" name="news_content" placeholder="新聞內容" style="height: 100px" required></textarea>
            <label for="news_content">新聞內容</label>
        </div>
        <div class="form-floating mb-3">
            <input type="url" class="form-control" id="related_link" name="related_link" placeholder="相關連結">
            <label for="related_link">相關連結</label>
        </div>
        <div class="row mb-3">
            <div class="col-md-4">
                <div class="form-floating">
                    <input type="text" class="form-control" id="publisher" name="publisher" placeholder="發布者" required>
                    <label for="publisher">發布者</label>
                </div>
            </div>
            <div class="col-md-4">
                <div class="form-floating">
                    <input type="text" class="form-control" id="school_name" name="school_name" placeholder="學校名稱" required>
                    <label for="school_name">學校名稱</label>
                </div>
            </div>
            <div class="col-md-4">
                <div class="form-floating">
                    <input type="date" class="form-control" id="report_date" name="report_date" placeholder="報導日期" required>
                    <label for="report_date">報導日期</label>
                </div>
            </div>
        </div>
        <div class="form-floating mb-3">
            <select class="form-select" id="upload_type" name="upload_type">
                <option value="image" selected>上傳圖片</option>
                <option value="youtube">Youtube影片連結</option>
            </select>
            <label for="upload_type">上傳種類</label>
        </div>
        <div class="mb-3" id="image_upload">
            <label for="image_file" class="form-label">上傳圖片 (僅限jpg及png)</label>
            <input type="file" class="form-control" id="image_files" name="image_files[]" accept=".jpg,.png" multiple>
        </div>
        <div class="form-floating mb-3" id="youtube_link" style="display: none;">
            <input type="url" class="form-control" id="youtube_url" name="youtube_url" placeholder="Youtube影片網址">
            <label for="youtube_url">Youtube影片網址</label>
        </div>
        <button type="submit" class="btn btn-primary">提交</button>
    </form>

     

  3. 回覆結果為:
    CREATE TABLE `school_news` (
      `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '編號',
      `news_title` VARCHAR(255) NOT NULL COMMENT '新聞標題',
      `news_content` TEXT NOT NULL COMMENT '新聞內容',
      `related_link` VARCHAR(255) COMMENT '相關連結',
      `publisher` VARCHAR(100) NOT NULL COMMENT '發布者',
      `school_name` VARCHAR(100) NOT NULL COMMENT '學校名稱',
      `report_date` DATE NOT NULL COMMENT '報導日期',
      `upload_type` ENUM('image', 'youtube') NOT NULL COMMENT '上傳種類',
      `youtube_url` VARCHAR(255) COMMENT 'Youtube影片網址',
      `media` JSON COMMENT '多檔案JSON資訊',
      `views` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '點閱數',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    

     

  4. 可點擊控制台的Adminer,或直接輸入網址:「http://localhost/us_opt2/index.php?username=root」亦可
  5. 建立 school 資料庫(務必選 utf8mb4_general_ci
  6. 接著點擊「SQL命令」,將語法貼上,快速建立之
  7. 最後得到一個資料表:
    欄位 類型 註解
    id int unsigned 自動遞增 編號
    news_title varchar(255) 新聞標題
    news_content text 新聞內容
    related_link varchar(255) NULL 相關連結
    publisher varchar(100) 發布者
    school_name varchar(100) 學校名稱
    report_date date 報導日期
    upload_type enum('image','youtube') 上傳種類
    youtube_url varchar(255) NULL Youtube影片網址
    media json NULL 多檔案JSON資訊
    views int unsigned [0] 點閱數
  8. 此外,我們也可以將語法存為 mysql.sql 來備用

三、正確使用欄位類型

選用正確的欄位類型可以:

  • 節省空間
  • 降低開發難度
  • 避免錯誤

一、數字

資料型態 資料範圍
tinyint(4) -128至127
unsigned:0至255
smallint(6) -32768至32767
unsigned:0至65535
mediumint(9) -8388608至8388607
unsigned:0至16777215
int(11) -2147683648至2147683647
unsigned:0至4294967295
bigint(20) -9223372036854775808至9223372036854775807
unsigned:0至18446744073709551615

二、浮點數

資料型態 範圍範例(以MySQL>3.23為例)
decimal[(65[,30])] decimal(4,1)-999.9到9999.9
decimal(5,1)-9999.9到99999.9
decimal(6,1)-99999.9到999999.9
decimal(6,2)-9999.99到 99999.99
decimal(6,3)-999.999到9999.999
float[(255,30)] float(4,1)-999.9到999.9
float(5,1)-9999.9到9999.9
float(6,1)-99999.9到99999.9
float(6,2)-9999.99到 9999.99
float(6,3)-999.999到999.999
double[(255,30)] double(4,1)-999.9到999.9
double(5,1)-9999.9到9999.9
double(6,1)-99999.9到99999.9
double(6,2)-9999.99到 9999.99
double(6,3)-999.999到999.999

三、日期時間

資料型態 範圍
date 1000-01-01至9999-12-31
西元年可用4或2個數字,使用2個數字時,70到99表示1970到1999;
如果是00到69就是2000到2069,有點容易搞錯,所以年份最好還是寫完整4位數比較沒困擾。
datetime 1000-01-01 00:00:00至9999-12-31 23:59:59
timestamp 1970-01-01 00:00:01 UTC到2038-01-19 03:14:07 UTC
其格式與datetime一樣,但儲存空間只需要一半。
time -838:59:59至 838:59:59
存入「150:30:00」而言就是過了150小時又30分鐘之意。
亦可存入「-6:20:00」,意指「6個小時又20分鐘前」
year[(4|2)] 4位數字可以儲存的範圍從1901到2155;
2位數字的範圍從00到99,實際的西元年份是1970到2069,也就是說,當您存入00時,實際代表2000之意;
存入69代表2069;存入70代表1970;存入99代表1999。

四、字串

資料型態 最大長度 實際儲存的空間
char[(255)] 255 指定的長度
varchar(65535) 65535 指定的長度加1或2bytes
tinytext 255 指定的長度加1byte
text 65535 指定的長度加2bytes
mediumtext 16772215 指定的長度加3bytes
longtext 4294967295 指定的長度加4bytes

五、列表

資料型態 最大個數 儲存空間
enum(字串值[,...]) 65535 1byte(25個以內);
2bytes(256到65535個)
set(字串值[,...]) 64 1byte(8個以內);
2bytes(16個以內);
3bytes(24個以內);
4bytes(32個以內);
8bytes(64個以內)

六、二進位  

資料型態 最大長度 實際儲存的空間
bit[(8|64)] 64 bit的範圍為0到1
bit(8)的範圍為0到255
bit(64)的範圍為0到18446744073709551615
binary[(255)] 255 指定的長度
varbinary(65535) 65535 指定的長度加1或2bytes
tinyblob 255 指定的長度加1byte
blob 65535 指定的長度加2bytes
mediumblob 16772215 指定的長度加3bytes
longblob 4294967295 指定的長度加4bytes

:::

書籍目錄

展開 | 闔起

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbdsn%3D2010%26tbsn%3D55

計數器

今天: 2870287028702870
昨天: 2259225922592259
總計: 7951668795166879516687951668795166879516687951668