:::
4-3 用PDO寫入資料庫
一、用PDO寫入資料的方法
- 儲存的基本語法(需自行過濾變數,擋掉 SQL injection 隱碼攻擊或 SQL 注入攻擊):
$sql = "INSERT INTO `資料表` (`欄1`, `欄2`, ...) VALUES('值1', '值2', ...)"; $pdo->exec($sql); - 比較安全的
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寫法
二、調整我們的寫入語法
- 以我們的例子來說,
admin.php目前的內容便是:// 準備SQL語句 $sql = "INSERT INTO news (title, content, author, date, category) VALUES (?, ?, ?, ?, ?)"; // 預備語句 $stmt = $pdo->prepare($sql); // 綁定參數並執行語句 $stmt->execute([$title, $content, $author, $date, $category]); -
由於
media是設定為NOT NULL,而且沒有提供預設值,所以,新增時,若是沒有該欄位 ,會有錯誤產生,因此,在寫入時,我們手動加一下該欄位即可:// 準備SQL語句 $sql = "INSERT INTO news (title, content, author, date, category, media) VALUES (?, ?, ?, ?, ?, ?)"; // 預備語句 $stmt = $pdo->prepare($sql); // 綁定參數並執行語句 $stmt->execute([$title, $content, $author, $date, $category, '[]']); -
寫入後可以利用
rowCount()取得受影響的列數是多少,只要大於 0 就是寫入成功// 取得插入的資料行數 $rowCount = $stmt->rowCount(); if ($rowCount > 0) { // 取得插入的 id 值 $lastInsertId = $pdo->lastInsertId(); //上傳檔案 echo "資料插入成功!"; } else { echo "資料插入失敗!"; } -
由於流水號是自動產生,所以,我們可以用
lastInsertId()去抓取該編號,以方便之後運用,例如儲存完就轉向到該編號頁面。此處,我們會先用編號來建立上傳檔案的子目錄(這樣日後比較好管理)// 取得插入的 id 值 $lastInsertId = $pdo->lastInsertId();
4-2 PDO的資料庫連線