PDA

View Full Version : سوال: مشکل در export دیتابیس



.fatemeh
دوشنبه 25 فروردین 1393, 22:59 عصر
سلام
کدی گذاشته بودم برای پشتیبان گیری توسط کاربر مشکلی نداشت کار می کرد.
ولی الان که تعداد رکوردها زیاد شده مشکل پیدا کرده.
جدول prodcut تعداد رکوردهاش 185 تاست ولی فقط تا 161 ادامه میده. رکورد 161 رو هم کامل نمی ریزه
فایل ناقصه و نمیشه import کرد.فکر کردم شاید همین رکورد مشکل خاصی داره پاکش کردم بازم جواب نداد.
کد اینه:

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');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private', false);
header('Content-Type: text/plain');
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'));
ob_clean();
flush();
echo $return;
}


خیلی خیلی ضروریه.دیونه ام کرده

abolfazl-z
دوشنبه 25 فروردین 1393, 23:36 عصر
ببینید این کد عمل می کند ؟

backup_tables('localhost','username','password','b log');


/* backup the db OR just a table */
function backup_tables($host,$user,$pass,$name,$tables = '*')
{

$link = mysql_connect($host,$user,$pass);
mysql_select_db($name,$link);

//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
$handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');
fwrite($handle,$return);
fclose($handle);
}

یا این کد :


$filename='database_backup_'.date('G_a_m_d_y').'.s ql';

$result=exec('mysqldump database_name --password=your_pass --user=root --single-transaction >/var/backups/'.$filename,$output);

if($output==''){/* no output is good */}
else {/* we have something to log the output here*/}

abolfazl-z
دوشنبه 25 فروردین 1393, 23:38 عصر
اینم reference :

dev.mysql.com/doc/refman/5.1/en/mysqldump.html (http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html)

.fatemeh
دوشنبه 25 فروردین 1393, 23:54 عصر
خیلی خیلی از لطف شما ممنونم. با کد اول درست شد.
حالا اگه بخوام موقع ذخیره پنجره save as باز بشه باید چه کار کرد؟

SlowCode
سه شنبه 26 فروردین 1393, 00:10 صبح
خیلی خیلی از لطف شما ممنونم. با کد اول درست شد.
حالا اگه بخوام موقع ذخیره پنجره save as باز بشه باید چه کار کرد؟

باید با Header برای دانلود بفرستین سمت کاربر.


if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>

منبع (http://php.net/manual/en/function.readfile.php)

.fatemeh
سه شنبه 26 فروردین 1393, 00:18 صبح
نه پنجره دانلود منظورم نبود.
مدیر سایت می گه متوجه نمی شم کجا ذخیره میشه !!!! میگه پنجره ای باز بشه که خودم آدرس ذخیره شدن رو بدم
چیزی مثل save as در نرم افزارها.اصلا امکان چنین چیزی توی وب هست؟

abolfazl-z
سه شنبه 26 فروردین 1393, 21:16 عصر
نه پنجره دانلود منظورم نبود.
مدیر سایت می گه متوجه نمی شم کجا ذخیره میشه !!!! میگه پنجره ای باز بشه که خودم آدرس ذخیره شدن رو بدم
چیزی مثل save as در نرم افزارها.اصلا امکان چنین چیزی توی وب هست؟

در خط زیر :


$handle = fopen('your address'.'db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');

در پارامتر اول میتونین مسیر را تغییر دهید و میتونین این مسیر را از دیتابیس فراخوانی کنید یا می توانید بصورت کانفیگ در بیارید و ...

بحث save as کلا جداست! اون پنجره که باز می شود برای سیستم کاربر هست و ربطی به سرور ندارد !

شما می تونین با جاوا اسکریپت یک پنجره باز کنید و درآن اسکریپتی اجرا کنید که پوشه های هاست رو نشون بده که این میتونه نقش همان پنجره save as را بازی کند.