بکاپ گرفتن از دیتابیس mysql با PHP

بکاپ گرفتن از دیتابیس mysql با PHP

بکاپ گرفتن دیتابیس با PHP – آموزش backup گرفتن پایگاه داده با کمک PHP یکی از مباحث مهمی است که یک برنامه نویس back-end باید به آن مسلط باشد .

با مطالعه این مقاله یاد خواهید گرفت چگونه یک خروجی از اطلاعات دیتابیس بدون phpmyadmin داشته باشید .

همچنین همان فایل بدست آمده ( backup ) را بازگردانی می کنیم .

دموی برنامه


اسکریپت index.php

<?php
$action = @$_GET['action'];
if($action == "import"){
	require_once "imp.php";
}else if($action == "export"){
	require_once "exp.php";
}

?>
<!DOCTYPE html>
<html lang="fa">
<head>
    <meta charset="UTF-8">
    <title>Rapidcode.iR - سورس کد</title>
    <link rel="stylesheet" href="static/css/main.css">
</head>
<body>
    <div class="container">
        <a id="introduce" href="https://rapidcode.ir" target="_blank">رپید کد • کتابخانه مجازی برنامه نویسان</a>
		
		<?php if(@$_GET['msg']): ?>		
			<div class="message"><?php echo @$_GET['msg'] ?></div>	
		<?php endif; ?>
		
        <form enctype="multipart/form-data" action="./?action=import" method="post">
		<input type="file" name="backup">
		<button class="btn" id="upload">آپلود بکاپ</button>
		</form>
		
		<a target="_blank" id="export" class="btn" href="./?action=export">بکاپ از دیتابیس</a>
    </div>
</body>
</html>


اسکریپت exp.php فایل خروجی از دیتابیس

<?php

$mysqli = new mysqli("localhost", "root", "", "wpx");
if ($mysqli->connect_error) {
    die("MYSQL ISSUE : " . $mysqli->connect_error);
}
 
$mysqli->set_charset("utf8");

function getData($uquery , $is_table){
	global $mysqli;
	$query = $uquery;
	$rows = [];
 
	if ($res = $mysqli->query($query)) {
     if ($res->num_rows) {
        while ($row = $res->fetch_assoc()) {
            $rows[] = $is_table ? end($row) : $row;
        }
     }
 
     $res->close();
    }
	return $rows;
}

$tables = getData("show tables" , true);
$jsonData = "";

foreach($tables as $table){
	$jsonData .= "\n###{$table}###\n";
	$tableCreate = (getData("SHOW CREATE TABLE {$table}" , true))[0];
	$tableCreate = preg_replace('/\r\n|\n\r|\n|\r/',"",$tableCreate);
	$jsonData .= "%%%{$tableCreate}%%%\n";
	$query = "SELECT * FROM `{$table}`";
	$rows = getData($query , false);
	$rows = json_encode($rows);
	$jsonData .= $rows;
}


$mysqli->close();

header('Content-Type: text/plain'); 
header('Content-Disposition: attachment; filename="database-backup.spx"');
echo $jsonData;
die();

?>


اسکریپت imp.php بازگردانی فایل backup

<?php

if(!empty($_FILES['backup'])){
	$file = $_FILES['backup'];
	$tmp_name = $file['tmp_name'];
	$backupPath = "backup/backup-" . time() . ".spx";
	move_uploaded_file($tmp_name, $backupPath);
}else{
	die("<h1>فایلی برای بکاپ ارسال نشد !</h1>");
}

$mysqli = new mysqli("localhost", "root", "", "wpx");
if ($mysqli->connect_error) {
    die("MYSQL ISSUE : " . $mysqli->connect_error);
}

$mysqli->set_charset("utf8");
$stmt = $mysqli->stmt_init();

$filepath = $backupPath;
$backupContent = file_get_contents($filepath);
$backupContent = explode("\n",$backupContent);
$backupContent = array_filter($backupContent, 'strlen');

$tableSeperator = "###";
$createTableSeperator = "%%%";

$table = "";
$createTable = "";

foreach($backupContent as $cnt){
	
	if(startsWith($cnt , $tableSeperator)){
		$table = $cnt;
		$table = getPureContent($table, $tableSeperator);
	}else if(startsWith($cnt , $createTableSeperator)){
		$createTable = $cnt;
		$createTable = getPureContent($createTable, $createTableSeperator);
		setDataRaw("DROP TABLE IF EXISTS `{$table}`");
		setDataRaw("SET SQL_MODE='ALLOW_INVALID_DATES'");
		setDataRaw($createTable);
	}else{
		$dataList = json_decode($cnt, true);
		foreach($dataList as $row){
			$values = (array) array_values($row);
			$valuePlaceholder = str_repeat("?,",count($values));
			$valuePlaceholder = substr($valuePlaceholder, 0, strlen($valuePlaceholder)-1);
			$query = "INSERT INTO `{$table}` VALUES ({$valuePlaceholder})";
			setData($query, $values);
		}
	}

}


function setData($uquery , $values){
	global $mysqli;
	global $stmt;
	
	$query = $uquery;
	$stmt->prepare($query);
	$type = str_repeat("s",count($values));
	$stmt->bind_param($type, ...$values);
	$inserted_id=0;
	if ($stmt->execute()) {
		$inserted_id = $stmt->affected_rows ? $stmt->insert_id : 0;
	}
	return $inserted_id;
}

function setDataRaw($uquery){
	global $mysqli;
	global $stmt;

	$query = $uquery;
	$stmt->prepare($query);
	$inserted_id=0;
	if ($stmt->execute()) {
		$inserted_id = $stmt->affected_rows ? $stmt->insert_id : 0;
	}

}

function startsWith ($string, $startString)
{
    $len = strlen($startString);
    return (substr($string, 0, $len) === $startString);
}

function endsWith($string, $endString)
{
    $len = strlen($endString);
    if ($len == 0) {
        return true;
    }
    return (substr($string, -$len) === $endString);
}

function getPureContent($string, $seperator){
	$seperatorLength = strlen($seperator);
	$finalString = substr($string, $seperatorLength);
	$finalString = substr($finalString, 0,-$seperatorLength);
	return $finalString;
}


$stmt->close();
$mysqli->close();

header("Location: {$_SERVER['PHP_SELF']}?msg=بکاپ+با+موفقیت+وارد+دیتابیس+شد");

?>


دانلود پروژه بکاپ گرفتن دیتابیس با PHP

ارسال نظر

جهت استفاده از کد حتما از تگ pre استفاده نمایید .

لیست نظرات

  1. amin
    amin

    سلام من بکاپ از دیتابیس رو گرفتم و الان میخام روی دیتابیس جدیدم بیارمشون با این اسکریپت امکانش هست که بکاپ رو روی دیتابیس جدیدم بیارم؟

    28 مهر 1402 | 15:41:14
  • حسین باقری
    حسین باقری

    درود ، بله میشه فقط حتما قبلش از دیتابیس تون بکاپ بگیرید .

    29 مهر 1402 | 13:27:08
  • امیرحسین آقاجانی
    امیرحسین آقاجانی

    سلام، ممنون از آموزش خوبتون. آیا راهی هست که بشه کاری کرد داخل فولدر backup ذخیره بشن؟ اینطوری میشه crownJob براش تعریف کرد. ممنون میشم راهنمایی بفرمایید

    21 اسفند 1401 | 09:17:02
    • حسین باقری
      حسین باقری

      درود ، بله میشه کافیه که مسیر اسکریپت رو که میشه exp.php هست رو بدید تا اون رو در یک زمان مشخص اجرا کنه و بکاپ بگیره ، البته باید خط های 44و45و46 پاک بشه و به جاش از

      file_put_contents("the-backup.spx",$jsonData);
      استفاده بشه
      21 اسفند 1401 | 10:14:00
      • امیرحسین آقاجانی
        امیرحسین آقاجانی

        دمت گرم استاد... سایت خیلی مفیدی دارین.. خیلی خیلی مممنونمممم

        24 اسفند 1401 | 11:04:09
  • مرتضی
    مرتضی

    سلام اموزشی خوبی بود من می خواستم یکی از جدول ها را بکاپ بگیرم لطفا راهنمایی کنید با تشکر

    13 آذر 1401 | 03:38:13
    • حسین باقری
      حسین باقری

      درود ، برای این کار کافیه که خط 27 اسکریپت exp.php به کد زیر تغییر بدید .

      $tables=["my_table"];
      13 آذر 1401 | 21:49:04
    contact us