本文深度解析一個結合 PHP 後端與 JavaScript 前端的大量資料提交系統——短信群發管理平台。系統採用雙向選單選擇接收號碼、即時字數統計、表單驗證與批次資料庫寫入等核心功能,展示傳統 PHP + jQuery 架構處理大規模表單提交的完整實作模式。
系統採用經典的「可用號碼」與「已選號碼」雙選單設計,透過 JavaScript 實現四種操作模式:
moveOption1() / moveOption2() — 雙擊或點擊按鈕在兩個 <select multiple> 間移動選中項目moveAllOption1() / moveAllOption2() — 一鍵移動所有項目getvalue() 將已選號碼以逗號分隔寫入 <input type="hidden" name="msgto">,確保表單提交時攜帶完整號碼清單function getvalue(geto) {
var allvalue = "";
for (var i = 0; i < geto.options.length; i++) {
allvalue += geto.options[i].value + ",";
}
return allvalue;
}
引入 maxlength.js 外掛,配合 textarea 的 data-maxsize="70" 屬性,即時顯示剩餘字數於 #status1 元素,強制限制短信內容在 70 字以內(符合標準短信長度規範)。
function checkdata() {
if (myform.msgto.value == '') {
alert("接收方號碼不能全部為空!");
myform.focus();
return false;
}
if (myform.content.value == '') {
alert("短消息內容不能為空!");
myform.focus();
return false;
}
}
session_start();
if ($_SESSION["login"] != "YES") {
echo "<script>alert('您沒有登錄,無權訪問,請先登錄!'); location.href='index.php'</script>";
}
核心處理邏輯展示如何將逗號分隔的號碼字串拆解並逐筆寫入資料庫:
$content = $_POST["content"];
$msgto = $_POST["msgto"];
if ($content != '' && $msgto != '') {
$addtime = date("Y-m-d H:i:s");
// 號碼處理:去首尾逗號 → 爆炸成陣列
$msg2 = trim($msgto, ',');
$msg2 = explode(',', $msg2);
if ($msg2) {
foreach ($msg2 as $var) {
$query = "INSERT INTO sendmessage (numbersend, timesend, contentsend, flagsend)
VALUES ('$var', '$addtime', '$content', '0')";
mysql_query($query);
}
echo "<script>alert('記錄成功,等待發送!'); location.href='send_box.php'</script>";
} else {
echo "<script>alert('號碼不對,請核對!'); history.back(-1)</script>";
}
}
頁面載入時從 number 資料表讀取所有聯繫人,動態生成左側選單選項:
$query = "SELECT * FROM `number`";
$result = mysql_query($query);
if (mysql_num_rows($result) < 1) {
echo "<option>號碼為空!</option>";
} else {
$totalnum = mysql_num_rows($result);
for ($i = 0; $i <= $totalnum; $i++) {
$info = mysql_fetch_array($result);
if ($info != "") {
echo "<option value=\"{$info['num']}\"><font color=blue><b>{$info['name']}</b></font></option>";
}
}
}
mysql_close($member);
| 現狀 | 問題 | 建議方案 |
|---|---|---|
mysql_* 函數 | PHP 7.0+ 已移除,嚴重安全風險 | 改用 PDO 或 mysqli 預處理語句 |
| SQL 直接拼接變數 | SQL 注入極高風險 | 參數綁定:$stmt->bind_param() |
| 無交易控制 | 批次寫入部分失敗導致資料不一致 | 啟用交易:BEGIN; ... COMMIT/ROLLBACK |
// 現代化批次寫入範例 (PDO + 交易 + 預處理)
try {
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO sendmessage (numbersend, timesend, contentsend, flagsend) VALUES (?, ?, ?, 0)");
foreach ($msg2 as $var) {
$stmt->execute([$var, $addtime, $content]);
}
$pdo->commit();
// 回傳 JSON 供前端 AJAX 處理
echo json_encode(["success" => true, "message" => "記錄成功,等待發送!"]);
} catch (Exception $e) {
$pdo->rollBack();
echo json_encode(["success" => false, "message" => "寫入失敗:" . $e->getMessage()]);
}
<input type="hidden" name="csrf_token" value="= $_SESSION['csrf_token'] ?>">htmlspecialchars(),特別是動態生成的 <option> 內容
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 前端頁面 │────▶│ PHP 控制器 │────▶│ MySQL 資料庫 │
│ (HTML/JS) │ │ (表單處理) │ │ (sendmessage)│
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 雙選單互動 │ │ 批次 INSERT │ │ 發送隊列 │
│ 字數即時統計│ │ 交易保證 │ │ (後續處理) │
└─────────────┘ └─────────────┘ └─────────────┘
本系統展示了傳統 PHP + jQuery 架構處理大量表單資料的完整流程:前端提供直觀的號碼選擇與即時驗證體驗,後端實現批次資料庫寫入與基本權限控制。雖然核心邏輯清晰可行,但 mysql_* 函數棄用、SQL 注入風險、缺乏交易控制等問題在現代開發中不可接受。建議採用 PDO/MySQLi 預處理、前端框架現代化、AJAX 非同步提交、完善的安全防護體系進行全面重構,構建符合當前標準的企業級短信發送平台。