mysqli
及 pdo
兩種方式
mysqli
僅支援MySQL,但其語法和早期的 mysql 系列函數很像,所以,適合舊系統轉換,或者熟悉 mysql 系列函數者pdo
則支援十幾種資料庫,因此,若有需要切換資料庫者,這是不二選擇,缺點是性能較 mysqli
差一點,但安全性好。
請依據以下表單,用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>
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;
school
資料庫(務必選 utf8mb4_general_ci
)欄位 | 類型 | 註解 |
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] | 點閱數 |
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 |