بکاپ گرفتن از دیتابیس 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=بکاپ+با+موفقیت+وارد+دیتابیس+شد"); ?>
لیست نظرات
سلام من بکاپ از دیتابیس رو گرفتم و الان میخام روی دیتابیس جدیدم بیارمشون با این اسکریپت امکانش هست که بکاپ رو روی دیتابیس جدیدم بیارم؟
درود ، بله میشه فقط حتما قبلش از دیتابیس تون بکاپ بگیرید .
سلام، ممنون از آموزش خوبتون. آیا راهی هست که بشه کاری کرد داخل فولدر backup ذخیره بشن؟ اینطوری میشه crownJob براش تعریف کرد. ممنون میشم راهنمایی بفرمایید
درود ، بله میشه کافیه که مسیر اسکریپت رو که میشه exp.php هست رو بدید تا اون رو در یک زمان مشخص اجرا کنه و بکاپ بگیره ، البته باید خط های 44و45و46 پاک بشه و به جاش از
استفاده بشهدمت گرم استاد... سایت خیلی مفیدی دارین.. خیلی خیلی مممنونمممم
سلام اموزشی خوبی بود من می خواستم یکی از جدول ها را بکاپ بگیرم لطفا راهنمایی کنید با تشکر
درود ، برای این کار کافیه که خط 27 اسکریپت exp.php به کد زیر تغییر بدید .