本範例演示如何使用 WHXBB_Article::Insert() 方法將新文章寫入 MySQL 數據庫,包含參數轉義、錯誤處理、成功提示與頁面跳轉完整流程。
<?php
$conn = @mysql_connect("localhost:3306", "test", "test");
include_once "js.class.php";
include_once "pager.class.php";
include_once "whxbb.class.php";
include_once "whxbb_article.class.php";
$article = new WHXBB_Article();
// 插入文章:標題、作者、內容
$result = $article->Insert("今日天氣", "whxbb", "今天北京局部地區有雨");
// 錯誤處理
if (WHXBB::isError($result)) {
// 彈窗提示錯誤並返回上頁
new WHXBB_Error(
"錯誤:" . $result->GetMsg() . "(" . $result->GetNo() . ")",
1,
WHXBB_ERROR_ALERT + WHXBB_ERROR_RETURN
);
// 或自定義友好提示:
// new WHXBB_Error("添加失敗,請您稍後再試", 1, WHXBB_ERROR_ALERT + WHXBB_ERROR_RETURN);
} else {
// 成功處理
JS::Alert("添加成功");
JS::Goto("add.php"); // 跳轉到指定頁面
}
?>
function Insert($title, $author, $content) {
new WHXBB_Debug("Insert() Start");
// 參數轉義處理 (防 SQL 注入、XSS)
WHXBB::OperateString(&$title, "in");
WHXBB::OperateString(&$author, "in");
WHXBB::OperateString(&$content, "in");
// 構建 SQL (注意:直接字符串拼接,有注入風險)
$sql = "insert into article(title,author,content) values('$title','$author','$content')";
if (!@mysql_query($sql, $this->_conn)) {
return new WHXBB_Error("Insert() Failed.($sql)", 1021);
}
new WHXBB_Debug("Insert() Completed");
return true;
}
OperateString 僅做基礎轉義,不等同於參數化查詢。攻擊者可構造 title = "test', 'hacker', 'payload'); DROP TABLE article; --" 導致數據庫破壞。
<?php
// 數據庫連接 (PDO)
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "user", "pass", [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
try {
$stmt = $pdo->prepare("INSERT INTO article (title, author, content) VALUES (?, ?, ?)");
$stmt->execute(["今日天氣", "whxbb", "今天北京局部地區有雨"]);
echo "<script>alert('添加成功'); location.href='add.php';</script>";
} catch (PDOException $e) {
error_log("Insert failed: " . $e->getMessage());
echo "<script>alert('添加失敗,請稍後再試'); history.back();</script>";
}
?>
WHXBB_ERROR_ECHO (1):直接輸出錯誤信息WHXBB_ERROR_ALERT (2):JavaScript alert 彈窗WHXBB_ERROR_RETURN (4):history.back() 返回上頁WHXBB_ERROR_ALERT + WHXBB_ERROR_RETURN = 6