PDA

View Full Version : حرفه ای: درخواست کلاس بک اپ و بازگردانی دیتابیس



masiha68
پنج شنبه 01 اسفند 1392, 08:53 صبح
سلام
توی سایت پی اچ پی کلاس خیلی دنبال یه کلاس بک اپ گشتم پیداش نکردم . مشکل همشون اینکه فایل دانلود رو توی هاست ذخیره می کنن و لینک دانلود بهت نمی دن یا اون رو برات ایمیل نمی کنن
از دوستان کسی هست همچین کلاس در اختیار داشته باشه و بخواد اونو به اشتراک بذاره:چشمک:

MMSHFE
پنج شنبه 01 اسفند 1392, 10:34 صبح
این کد رو برای Backup استفاده کنید:


<?php
function backup_db($host, $user, $pass, $name, $tables = '*') {
date_default_timezone_set('Asia/Tehran');

$return = '';

mysql_connect($host,$user,$pass) or die('Connection error');
mysql_select_db($name) or die('Database error');
mysql_query('SET NAMES \'utf8\'');
mysql_set_charset('utf8');

if($tables == '*') {
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result)) {
$tables[] = $row[0];
}
mysql_free_result($result);
}
else {
$tables = is_array($tables) ? $tables : explode(',', $tables);
}

foreach($tables as $table) {
$result = mysql_query('SELECT * FROM `'.$table.'`');
$num_fields = mysql_num_fields($result);
$return .= 'DROP TABLE IF EXISTS `'.$table.'`;'.PHP_EOL.PHP_EOL;
$row = mysql_fetch_row(mysql_query('SHOW CREATE TABLE `'.$table.'`'));
$return .= $row[1].';'.PHP_EOL.PHP_EOL;

for ($i = 0; $i < $num_fields; $i++) {
while($row = mysql_fetch_row($result)) {
$return.= 'INSERT INTO `'.$table.'` VALUES(';
for($j = 0; $j < $num_fields; $j++) {
$row[$j] = addslashes($row[$j]);
$row[$j] = str_replace('\n', '\\n', $row[$j]);
if (isset($row[$j])) {
$return .= '\''.$row[$j].'\'';
}
else {
$return .= '\'\'';
}
if ($j < ($num_fields - 1)) {
$return .= ',';
}
}
$return .= ');'.PHP_EOL;
}
}
$return .= PHP_EOL.PHP_EOL.PHP_EOL;
}

header('Pragma: public'); // required
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private',false); // required for certain browsers
header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename="db-backup-' . $name . '-' . date('Y,m,d-H,i,s') . '.sql' . '";');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . mb_strlen($return, 'utf-8'));
echo $return;
}
?>

برای Restore هم بهتره از BigDump استفاده کنید.

masiha68
پنج شنبه 01 اسفند 1392, 10:45 صبح
این کد رو قبلا داشتم و مشکلش همون ندادن لینک دانلود بود . این کد شما هم کل دیتابیس رو توی صفحه نشون میده ...حالا نمی دونم مشکل از لوکال هاست منه یا ...

masiha68
پنج شنبه 01 اسفند 1392, 10:48 صبح
البته چند خطا هم از این نوع میده :



Warning: Cannot modify header information - headers already sent by (output started at

MMSHFE
پنج شنبه 01 اسفند 1392, 11:03 صبح
فایل رو با کدگذاری UTF-8 without BOM ذخیره کنید. قبل از کدهای PHP هم هیچ کدی نباشه (حتی یک Space خالی). مشکل بخاطر اینه که نمیتونه هدرها رو تغییر بده.

masiha68
پنج شنبه 01 اسفند 1392, 11:58 صبح
راه دیگه ای نداره ..چون من این فانکش رو توی پیج می زارم و اون رو توی یه پیج دیگه ای فراخوانی می کنم و تقریبا نمیشه که فضای خالی نداشته باشه ...

MMSHFE
پنج شنبه 01 اسفند 1392, 12:39 عصر
ببینید، مهم نیست که توی اون صفحه، محتوا وجود داره یا نه. مهم اینه که اولاً همه صفحات سایتتون با کدگذاری UTF-8 without BOM ذخیره بشن و ثانیاً وقتی این تابع فراخوانی میشه و میخواد Backup رو برای دانلود بفرسته، قبلش چیزی برای مرورگر کاربر ارسال نشده باشه. اینجور وقتها بهتره مثل سایتهای دانلود، کاربر رو به صفحه ای Redirect کنید (یا با لینک دانلود توی پنجره جدید بفرستین) که این تابع داخلش صدا زده شده و قبلش هم هیچی (حتی doctype و...) نوشته نشده چون اگه اونها رو بگذارین، دیگه نمیشه هدرها رو تغییر داد و حتی اگه از Output Buffering استفاده کنید تا بتونین هدرها رو تغییر بدین، باز هم توی فایلی که کاربر دریافت میکنه، اون کدها هم دیده میشه که قطعاً چیزی نیست که موردنظر شماست.