核心邏輯
- 查詢 `SHOW CREATE TABLE` 取得建表 DDL。
- 查詢全表資料,逐行組合 `INSERT INTO ... VALUES (...)`。
- 欄位值經 `mysql_real_escape_string()` 轉義,防止 SQL 注入與特殊字元破壞。
完整函數程式碼
<?php
function datatosql($table) {
global $db; // 假設 $db 為 mysql 連線資源
$dump = "DROP TABLE IF EXISTS `$table`;\n";
$create = mysql_query("SHOW CREATE TABLE `$table`", $db);
$row = mysql_fetch_array($create);
$dump .= $row[1] . ";\n\n";
$rows = mysql_query("SELECT * FROM `$table`", $db);
$num_fields = mysql_num_fields($rows);
$num_rows = mysql_num_rows($rows);
while ($row = mysql_fetch_array($rows)) {
$dump .= "INSERT INTO `$table` VALUES(";
$comma = "";
for ($i = 0; $i < $num_fields; $i++) {
$dump .= $comma . "'" . mysql_real_escape_string($row[$i]) . "'";
$comma = ",";
}
$dump .= ");\n";
}
$dump .= "\n";
return $dump;
}
?>
使用範例
$sql = datatosql('users');
file_put_contents('backup_users_'.date('Ymd').'.sql', $sql);
注意事項
- 僅適用 MyISAM/InnoDB 邏輯備份,大表會佔用大量記憶體(建議改用 `mysqldump`)。
- 不含 Stored Procedure、Trigger、View 等物件。
- 還原時直接 `mysql -u root -p db < backup.sql` 或 `SOURCE backup.sql;`。