PDA

View Full Version : Back up & restor White PHP



morteza_carefree
دوشنبه 10 آبان 1389, 15:12 عصر
سلام من تو یه برنامه نیاز خیلی واجبی دارم که با php از دیتا بیسم پشتیبان بگیریم و به موقع بتونم اون رو بازگردونم
اما تا حاللا نتونستم با این مشکل کنار بیام تقریبا میشه یه سال این مشکل رو دارم و تا حالا از چند سایت خارجی هم مطالبی رو پیدا کردم اما من می خوام پشتیبان بگیرم و رونرو بشه ذخیره کرد و بعدش معرفی کنم به سایت و restore fai
من میخوام این رو به مدیریت سایتی که طراحی می کنم اضافه کنم
کسی میتونه کمکم کنه
:گریه:

binyaft
دوشنبه 10 آبان 1389, 16:18 عصر
همه این کارهایی که گفتید با phpmyadmin میشه انجام داد که روی سرور نصب هست

funpatogh
دوشنبه 10 آبان 1389, 21:55 عصر
Back up


function backup_tables($host,$user,$pass,$name,$tables = '*')
{

$link = mysql_connect($host,$user,$pass);
mysql_select_db($name,$link);
mysql_query("SET NAMES UTF8");
mysql_set_charset("utf8");
date_default_timezone_set("Asia/Tehran");

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

//cycle through
foreach($tables as $table)
{
$result = mysql_query('SELECT * FROM '.$table);
$num_fields = mysql_num_fields($result);


$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$return.= "\n\n".$row2[1].";\n\n";

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] = ereg_replace("\n","\\n",$row[$j]);
if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ");\n";
}
}
$return.="\n\n\n";
}

//save file
$file="backup/".'backup-'.date("Y-m-d-H-i-s").'.sql';
$handle = fopen($file,'w+');
fwrite($handle,$return);
fclose($handle);
}

Restore


<?php
$filename = 'test.sql';
$mysql_host = 'localhost';
$mysql_username = 'root';
$mysql_password = '';
$mysql_database = 'test';
mysql_connect($mysql_host, $mysql_username, $mysql_password) or die('Error connecting to MySQL server: ' . mysql_error());
mysql_select_db($mysql_database) or die('Error selecting MySQL database: ' . mysql_error());
$templine = '';
$lines = file($filename);
foreach ($lines as $line) {
if (substr($line, 0, 2) == '--' || $line == '')
continue;
$templine .= $line;
if (substr(trim($line), -1, 1) == ';'){
mysql_query($templine) or print('Error performing query \'<strong>' . $templine . '\': ' . mysql_error() . '<br /><br />');
$templine = '';
}
} ?>

funpatogh
سه شنبه 11 آبان 1389, 00:12 صبح
اینم یک نمونه دیگه
Back Up


<?php
include 'config.php';
$tableName = 'mypet';
$backupFile = 'backup/mysql.sql';
$query = "SELECT * INTO OUTFILE '$backupFile' FROM $tableName";
$result = mysql_query($query);
?>
Restore

<?php
include 'config.php';
$tableName = 'mypet';
$backupFile = 'mysql.sql';
$query= "LOAD DATA INFILE '$backupFile' INTO TABLE $tableName";
$result = mysql_query($query);
?>

morteza_carefree
سه شنبه 11 آبان 1389, 12:54 عصر
اینم یک نمونه دیگه
Back Up


<?php
include 'config.php';
$tableName = 'mypet';
$backupFile = 'backup/mysql.sql';
$query = "SELECT * INTO OUTFILE '$backupFile' FROM $tableName";
$result = mysql_query($query);
?>
Restore

<?php
include 'config.php';
$tableName = 'mypet';
$backupFile = 'mysql.sql';
$query= "LOAD DATA INFILE '$backupFile' INTO TABLE $tableName";
$result = mysql_query($query);
?>


خوب میشه اون فایل config.php رو هم بزارید
ممنون میشم

alonemm
سه شنبه 11 آبان 1389, 13:57 عصر
ابزارهای زیادی هستن که این کارو انجام میدن اما خود PHPMYAdmin که روی هاست شما نصب هست عالیه.
من خودم همیشه به صورت gzip بکاپ میگیرم و بعد ریستور میکنم هیچ مشکلی نداره.

funpatogh
سه شنبه 11 آبان 1389, 20:25 عصر
فاdل config.php همون مقادیر مربوط به نام هاست و userوpass توابع وصل شدن به mysql هست
یک نمونه:


<?php
$link=mysql_connect("localhost","root","")or die(mysql_error());
mysql_select_db("test",$link);

?>

morteza_carefree
چهارشنبه 12 آبان 1389, 12:54 عصر
سلام من دو نمونه که دادید رو امتحان کردم اما بازم نشد
تو اولی که اول به این خطا داد
mysql_set_charset("utf8");
date_default_timezone_set("Asia/Tehran");
که اونارم حذف کردم بعدش این خطا هارو داد
Warning: mysql_num_fields(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\bk\untitled-1.php on line 30

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\bk\untitled-1.php on line 33

Notice: Undefined variable: return in c:\program files\easyphp1-8\www\bk\untitled-1.php on line 34

Warning: fopen(backup/backup-2010-11-03-13-11-30.sql): failed to open stream: No such file or directory in c:\program files\easyphp1-8\www\bk\untitled-1.php on line 56

Warning: fwrite(): supplied argument is not a valid stream resource in c:\program files\easyphp1-8\www\bk\untitled-1.php on line 57

Warning: fclose(): supplied argument is not a

و دومی رو هم امتحان کردم اون خطا نداشت اما پشتیبان نگرفت

funpatogh
چهارشنبه 12 آبان 1389, 22:04 عصر
دومی رو احتمالا به خاطر امنیت توی mysql بستند
اما اولی رو من خودم دارم باهاش کار میکنم و مشکلی نداره ورژن php شما زیر 5 هست؟

morteza_carefree
پنج شنبه 13 آبان 1389, 12:45 عصر
ببخشید که بازم سوال بی مورد می پرسم
من از کجا ورژن 5 دانلود کنم و چطوری نصب کنم
من رو محیط ویندوزم با برنامه easyPHP ورژن 1.8 استفاده می کنم الان من چیکار کنم که درست جواب بده
میشه اینم راهنماییم کنید
تعریف از خود نباشه من برنامه نویسیم خوبه اما تو php زیاد مهارت ندارم اونم به خاطر آشنایی کم با توابع هست اما تو برنامه نویسی تحت ویندوز این مشکلارو ندارم
:عصبانی++:

funpatogh
پنج شنبه 13 آبان 1389, 23:00 عصر
<?php
$host="localhost";
$user="root";
$pass="";
$db="test";
function backup_tables($host,$user,$pass,$name,$tables = '*'){
$link = mysql_connect($host,$user,$pass)or die(mysql_error());
mysql_select_db($name,$link);
date_default_timezone_set("Asia/Tehran");
//get all of the tables
if($tables == '*')
{
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);
}

//cycle through
foreach($tables as $table)
{
$result = mysql_query('SELECT * FROM '.$table);
$num_fields = mysql_num_fields($result);


$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$return.= "\n\n".$row2[1].";\n\n";

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] = ereg_replace("\n","\\n",$row[$j]);
if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ");\n";
}
}
$return.="\n\n\n";
}

//save file
$file="backup/".'backup-'.date("Y-m-d-H-i-s").'.sql';
$handle = fopen($file,'w+');
fwrite($handle,$return);
fclose($handle);
}
backup_tables($host,$user,$pass,$db);
?>

شما از این استفاده کنید و مقادیر host user pass db رو در کد با چیزی که دارید تغییر بدهید و اجرا کنید بک اپ دیتابیس شما کنار همین فایل ذخیره میشود

morteza_carefree
دوشنبه 17 آبان 1389, 15:51 عصر
اینم یه سرس خطای جدید

Notice: Undefined variable: return in c:\program files\easyphp1-8\www\bk\bk.php on line 33

اما پشتیبان رو گرفت حالا چطوری restore کنم

funpatogh
دوشنبه 17 آبان 1389, 21:15 عصر
اون خطا هم به خاطر اینه


$return.= "\n\n".$row2[1].";\n\n";
چون تنظیمات php شما جوری هست که همه جور خطا (e_error,e_warning,e_enotice) رو چاپ میکنه متغییر return رو قبلش باید با مقدار خالی تعریف کنیم
کدت رو اینجوری بنویس که دیگه اون خطا رو هم نده


<?php
$host="localhost";
$user="root";
$pass="";
$db="test";
function backup_tables($host,$user,$pass,$name,$tables = '*'){
$link = mysql_connect($host,$user,$pass)or die(mysql_error());
mysql_select_db($name,$link);
date_default_timezone_set("Asia/Tehran");
//get all of the tables
if($tables == '*')
{
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);
}
$return="";
//cycle through
foreach($tables as $table)
{
$result = mysql_query('SELECT * FROM '.$table);
$num_fields = mysql_num_fields($result);


$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$return.= "\n\n".$row2[1].";\n\n";

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] = ereg_replace("\n","\\n",$row[$j]);
if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ");\n";
}
}
$return.="\n\n\n";
}

//save file
$file="backup/".'backup-'.date("Y-m-d-H-i-s").'.sql';
$handle = fopen($file,'w+');
fwrite($handle,$return);
fclose($handle);
}
backup_tables($host,$user,$pass,$db);
?>
برای Restore هم که نمونه گزاشتم براتون

morteza_carefree
سه شنبه 18 آبان 1389, 11:13 صبح
بارم ممنون اگه ناراحت نشید من وشکلی داشتم از خود شما بپرسم

funpatogh
سه شنبه 18 آبان 1389, 21:33 عصر
مشکلتون رو خوب همینجا مطرح کنید که همگی چیزی بیاموزیم

morteza_carefree
چهارشنبه 19 آبان 1389, 12:14 عصر
بازم از کمکتون ممنونم
اما با این روش داده های فارسی رو علامت سوال ( ؟؟؟ ) میزاره
من تو هر دو تا هم backup و هم restore بعد از connect شدن این کد رو گذاشتم درست شد



mysql_query("SET CHARACTER SET utf8;");
mysql_query("SET SESSION collation_connection = 'utf8_persian_ci'");

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

funpatogh
چهارشنبه 19 آبان 1389, 23:04 عصر
خوب میتونید هم این کاری که گفتید رو انجام بدهید هم اینکه تغییری در خروجی گرفتن انجام بدهید که اگر تیبل وجود داشت drop کنه بعد CREATE کنه

اینم کد


<?php
$host="localhost";
$user="root";
$pass="";
$db="test";
function backup_tables($host,$user,$pass,$name,$tables = '*'){
$link = mysql_connect($host,$user,$pass)or die(mysql_error());
mysql_select_db($name,$link);
date_default_timezone_set("Asia/Tehran");
mysql_query("SET CHARACTER SET utf8;");
mysql_query("SET SESSION collation_connection = 'utf8_persian_ci'");
//get all of the tables
if($tables == '*')
{
$tables = array();
$result = mysql_query('SHOW TABLES');
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(',',$tables);
}

//cycle through
foreach($tables as $table)
{
$result = mysql_query('SELECT * FROM '.$table);
$num_fields = mysql_num_fields($result);
$return.= 'DROP TABLE '.$table.';';
$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
$return.= "\n\n".$row2[1].";\n\n";

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] = ereg_replace("\n","\\n",$row[$j]);
if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
if ($j<($num_fields-1)) { $return.= ','; }
}
$return.= ");\n";
}
}
$return.="\n\n\n";
}

//save file
$file="backup/".'backup-'.date("Y-m-d-H-i-s").'.sql';
$handle = fopen($file,'w+');
fwrite($handle,$return);
fclose($handle);
}
backup_tables($host,$user,$pass,$db);
?>

morteza_carefree
پنج شنبه 20 آبان 1389, 11:07 صبح
به نظر شما این بهتر نیست که به جای این موقع restore چک کنیم که اگه جدول وجود داشت drop کنیم چون با این روش اگه جدول یه موقع وجود نداشت واسه drop خطا میده
میشه نظرتون رو بدبد

funpatogh
پنج شنبه 20 آبان 1389, 20:05 عصر
خوب درسته پس این خط رو


$return.= 'DROP TABLE '.$table.';';

بکنیدش این:


$return.= 'DROP TABLE if exists '.$table.';';