5-2-2
用PDO寫入資料庫
一、用PDO寫入資料的方法
- 儲存的基本語法(需自行過濾變數,擋掉 SQL injection 隱碼攻擊或 SQL 注入攻擊):
$sql = "INSERT INTO `資料表` (`欄1`, `欄2`, ...) VALUES('值1', '值2', ...)";
$pdo->exec($sql);
關於隱碼攻擊可參考:https://medium.com/@gordonfang_85054/%E8%B3%87%E5%AE%89%E6%BB%B2%E9%80%8F%E6%94%BB%E9%98%B2%E7%AD%86%E8%A8%98-1-c9a6b8ada5fa
- 比較安全的
prepare
寫法(會自動處理SQL injection 攻擊),這是使用命名方式:
$sql = "INSERT INTO `資料表` (`欄1`, `欄2`, ...) VALUES(:欄1,:欄2,...)";
$stmt = $pdo->prepare($sql);
$values= [':欄1' => '值1',':欄2' => '值2', ...];
$stmt->execute($values);
或更簡單的用 ?
佔位符
$sql = "INSERT INTO `資料表` (`欄1`, `欄2`, ...) VALUES(?, ?,...)";
$stmt = $pdo->prepare($sql);
$values= ['值1', '值2', ...];
$stmt->execute($values);
更進一步精簡可寫成
$stmt = $pdo->prepare('INSERT INTO `資料表` (`欄1`, `欄2`, ...) VALUES(?, ?,...)');
$stmt->execute(['值1', '值2', ...]);
為了安全性,我們後續將都直接採用prepare
寫法
二、我們的寫入語法
- 以我們的例子來說,目前的寫入語法便是:
$sql = "INSERT INTO school_news (news_title, news_content, related_link, publisher, school_name, report_date, upload_type, youtube_url)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
$_POST['news_title'],
$_POST['news_content'],
$_POST['related_link'] ?? null,
$_POST['publisher'],
$_POST['school_name'],
$_POST['report_date'],
$_POST['upload_type'],
$_POST['youtube_url'] ?? null
]);
$id = $pdo->lastInsertId();
-
新增時,若是沒有該欄位值時 ,會有錯誤產生,因此,在寫入時,加上 ?? null
,表示若該值不存在,則以 null
儲存之,避免出現錯誤:
-
由於流水號是自動產生,所以,我們可以用 lastInsertId()
去抓取該編號,以方便之後運用,例如儲存完就轉向到該編號頁面。
-
此處,我們會先用編號來建立上傳檔案的子目錄(這樣日後比較好管理)
// 獲取插入的ID
$id = $pdo->lastInsertId();