PDA

View Full Version : سوال: پشتيبان گيري از ديتابيس



ravand
جمعه 08 اردیبهشت 1391, 20:44 عصر
سلام
من يه برنامه نوشتم كه از يك جدول از يك ديتابيس بك آپ ميگيره ولي نميتونه از كل ديتابيس بك آپ بگيره .
خواستم راهنماييم كنيد تا اين مشكلش رو حل كنم پسوندش sql است.
متشكرم:

<?php
$host='localhost';
$user='root';
$pass='';
$name='search';
mysql_connect($host,$user,$pass) or die('Connection error');
$qry= mysql_select_db($name) or die('Database error');
mysql_query('SET NAMES \'utf8\'');
mysql_set_charset('utf8');
$result = mysql_query($qry);
$row = mysql_fetch_row(mysql_query("SHOW CREATE TABLE `posts`"));
$return .= $row[1].';'.PHP_EOL.PHP_EOL;
$matn=$return;
$file="export";
header('Content-disposition: attachment; filename='."$file".'.sql');
header("content-type:text/plain");
header('Content-Transfer-Encoding: utf-8');
echo $matn;
?>

MMSHFE
جمعه 08 اردیبهشت 1391, 21:00 عصر
اینجا (http://barnamenevis.org/showthread.php?215150-snippet-%D9%87%D8%A7%DB%8C-php&p=1484585&viewfull=1#post1484585) رو ببینید.

ravand
جمعه 08 اردیبهشت 1391, 21:01 عصر
اين كد رو ديدم ولي چيزي ازش نفهميدم يعني برام كار نكرد. يا در واقع بگم نميدونم چجوري كار ميكنه؟

MMSHFE
شنبه 09 اردیبهشت 1391, 12:21 عصر
هیچ کار عجیبی نداره. فقط تابع مربوطه رو صدا میزنید و اون برای شما یک فایل با اسم دیتابیس و تاریخ و ساعت جاری و با پسوند sql. میسازه که Export دیتابیس توش ذخیره شده. برای دانلود مستقیم هم اینطوری تغییرش بدین:


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

$sql = '';

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);
$sql .= 'DROP TABLE IF EXISTS `'.$table.'`;'.PHP_EOL.PHP_EOL;
$row = mysql_fetch_row(mysql_query('SHOW CREATE TABLE `'.$table.'`'));
$sql .= $row[1].';'.PHP_EOL.PHP_EOL;

for ($i = 0; $i < $num_fields; $i++) {
while($row = mysql_fetch_row($result)) {
$sql .= '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])) {
$sql .= '\''.$row[$j].'\'';
}
else {
$sql .= '\'\'';
}
if ($j < ($num_fields - 1)) {
$sql .= ',';
}
}
$sql .= ');'.PHP_EOL;
}
}
$sql .= PHP_EOL.PHP_EOL.PHP_EOL;
}

$file = $name.'.sql';
header('Content-Disposition: attachment; filename='.$file);
header('Content-Type: text/x-sql');
header('Content-Transfer-Encoding: utf-8');
echo $sql;
}
?>

مثالی از نحوه استفاده:

backup_db('localhost', 'root', '', 'dbname');
موفق باشید.

ravand
شنبه 09 اردیبهشت 1391, 19:30 عصر
مهندس.
اينجا چند تا متغيير قرار گرفته كه بايد قبلش به اين متغيير ها مقاديري داده بشه.

$host, $user, $pass, $name,
من به اين صورت مقدار بهشون ميدم ولي كار نميكنن.

$host="localhost";
$user="root";
$pass="";
$name="search";

ravand
شنبه 09 اردیبهشت 1391, 19:31 عصر
مهندس.
اينجا چند تا متغيير قرار گرفته كه بايد قبلش به اين متغيير ها مقاديري داده بشه.

$host, $user, $pass, $name,
من به اين صورت مقدار بهشون ميدم ولي كار نميكنن.

$host="localhost";
$user="root";
$pass="";
$name="search";

MMSHFE
یک شنبه 10 اردیبهشت 1391, 00:27 صبح
دوست عزيز، لطفاً كد كامل رو بگذارين. توي كدي كه من گذاشتم بصورت يك تابع هست كه موقع فراخواني بايد مقادير رو براش بفرستين. مثل نمونه اي كه گذاشتم. حالا شما كد رو تغيير دادين. بنابراين لازمه كد كامل رو بگذارين تا ببينم مشكلش چيه. موفق باشيد.

ravand
یک شنبه 10 اردیبهشت 1391, 09:14 صبح
كد كامل نميخواد مهندس
اين كدها رو گذاشتم بالاي همه ي كدهايي كه شما دادي.

$host="localhost";
$user="root";
$pass="";
$name="search";

MMSHFE
یک شنبه 10 اردیبهشت 1391, 12:38 عصر
واسه همين ميگم كد كامل بگذارين چون الان نميدونم اين دستورات رو توي تابع گذاشتين؟ بيرونشه؟ اصلا تابع گذاشتين يا نه؟ درهرحال اگه نميخواين كد كامل رو بگذارين يكبار با mysql_error خطاي احتمالي رو چاپ كنيد ببينيم مشكل از كجاست؟

ravand
یک شنبه 10 اردیبهشت 1391, 12:41 عصر
<?php
$host="localhost";
$user="root";
$pass="";
$name="search";
function backup_db($host, $user, $pass, $name, $tables = '*') {
date_default_timezone_set('Asia/Tehran');

$sql = '';

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);
$sql .= 'DROP TABLE IF EXISTS `'.$table.'`;'.PHP_EOL.PHP_EOL;
$row = mysql_fetch_row(mysql_query('SHOW CREATE TABLE `'.$table.'`'));
$sql .= $row[1].';'.PHP_EOL.PHP_EOL;

for ($i = 0; $i < $num_fields; $i++) {
while($row = mysql_fetch_row($result)) {
$sql .= '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])) {
$sql .= '\''.$row[$j].'\'';
}
else {
$sql .= '\'\'';
}
if ($j < ($num_fields - 1)) {
$sql .= ',';
}
}
$sql .= ');'.PHP_EOL;
}
}
$sql .= PHP_EOL.PHP_EOL.PHP_EOL;
}

$file = $name.'.sql';
header('Content-Disposition: attachment; filename='.$file);
header('Content-Type: text/x-sql');
header('Content-Transfer-Encoding: utf-8');
echo $sql;
}
?>

MMSHFE
یک شنبه 10 اردیبهشت 1391, 14:24 عصر
ديدين يك جاي كار مشكل داره؟


<?php
$host = 'localhost';
$user = 'root';
$pass = '';
$name = 'search';
$tables = '*';
date_default_timezone_set('Asia/Tehran');

$sql = '';

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);
$sql .= 'DROP TABLE IF EXISTS `'.$table.'`;'.PHP_EOL.PHP_EOL;
$row = mysql_fetch_row(mysql_query('SHOW CREATE TABLE `'.$table.'`'));
$sql .= $row[1].';'.PHP_EOL.PHP_EOL;

for ($i = 0; $i < $num_fields; $i++) {
while($row = mysql_fetch_row($result)) {
$sql .= '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])) {
$sql .= '\''.$row[$j].'\'';
}
else {
$sql .= '\'\'';
}
if ($j < ($num_fields - 1)) {
$sql .= ',';
}
}
$sql .= ');'.PHP_EOL;
}
}
$sql .= PHP_EOL.PHP_EOL.PHP_EOL;
}

$file = $name.'.sql';
header('Content-Disposition: attachment; filename='.$file);
header('Content-Type: text/x-sql');
header('Content-Transfer-Encoding: utf-8');
echo $sql;
?>

دوست عزيز، اگه نميخواين از كد بصورت يك تابع استفاده كنيد، قسمت تعريف تابع رو بايد حذف كنيد.
موفق باشيد.

ravand
یک شنبه 10 اردیبهشت 1391, 14:27 عصر
من نگفتم كد مشكل داره مهندس.
گفتم من بلد نيستم باهاش كار كنم.:لبخند:

Hamid.RDN
یک شنبه 10 اردیبهشت 1391, 17:40 عصر
مهندس دستت درد نکنه و لی ماژولاریتی کد رو خراب کردیا! :قهقهه:

MMSHFE
یک شنبه 10 اردیبهشت 1391, 23:35 عصر
چه كنيم ديگه. امان از وقتي كه اجبار بياد وسط وگرنه من خودم تأكيدم بر همون Modularization هست!

ravand
دوشنبه 11 اردیبهشت 1391, 10:06 صبح
ببخشيد اين ماژولاریتی چي هست؟‌:لبخند:

Hamid.RDN
دوشنبه 11 اردیبهشت 1391, 12:02 عصر
به زبان ساده: قابلیت استفاده مجدد از کد با قرار دادن کدها در توابع و کلاس ها که با اینکار میشه به همین کدها که دیگه به عنوان ماژول شناخته می شن در سایر بخشها و یا حتی پروژه ها دسترسی داشت و ازشون استفاده کرد.

ravand
یک شنبه 17 اردیبهشت 1391, 06:59 صبح
ببخشيد من اين كدها رو اول كد هاي بك آپم ميارم ولي پسورد رو در نظر نميگيره و به محض اينكه فايل رو اجرا ميكنم خودش بك آپ ميگيره:

session_start();
if(isset($_SESSION['login'])) {
unset($_SESSION['login']);
}
من كدهاي بالا را گذاشتم اول كدهاي پشتيبان، ولي از وقتي فايل رو اجرا ميكنم از من پسورد نميخواد و خودش بك آپ ميگره!
بايد چيكار كرد؟

MMSHFE
یک شنبه 17 اردیبهشت 1391, 14:45 عصر
دوست عزیز این کدها ربطی به پسورد نداره. اگه میشه کد کامل رو بگذارین. برای مثال، اگر این کدها چک میکنن ببینن کاربر لاگین کرده یا نه و برای این کار از سشن استفاده کردین، باید درصورت عدم وجود سشن، کاربر رو به صفحه اصلی سایت هدایت کنید (Redirect). موفق باشید.

ravand
یک شنبه 17 اردیبهشت 1391, 14:49 عصر
منظور شما رو متوجه نميشم . خوب اينم همين كار رو ميكنه. اين دستور ميگه اگه سيژن هست اجازه ي ورود بده:

session_start();
if(isset($_SESSION['login'])) {
unset($_SESSION['login']);
}
اين كد اول همه ي كدهاي منه. همه ي كد من همينه.

MMSHFE
یک شنبه 17 اردیبهشت 1391, 17:36 عصر
این کجا میگه اگه سشن هست اجازه ورود بده؟! اینکه داره میگه اگه سشن هست پاکش کن!!!

ravand
یک شنبه 17 اردیبهشت 1391, 17:45 عصر
اين كد رو اولين بار شما به من دادي :لبخند:
گفتيد اين خط باعث ميشه اگه سيژن قبلا وجود داشته باشه پاك ميكنه:

unset($_SESSION['login']);
من اين كد رو توي فرم لوگينم استفاده كردم و كار ميكنه فقط براي اين قسمت پشتيبان كار نميكنه

MMSHFE
یک شنبه 17 اردیبهشت 1391, 18:03 عصر
دوست عزیز این کد رو اونجا من برای این گذاشته بودم (توی خود صفحه لاگین) که سشن کاربر قبلی ازبین بره. برای چک کردن سشن از این کد استفاده کنید:


if(!isset($_SESSION['user'])) {
@header('Location: index.php');
echo '<meta http-equiv="Refresh" content="0; url=index.php"/>';
exit();
}

ravand
یک شنبه 17 اردیبهشت 1391, 18:06 عصر
پس يعني اون unset رو هنگام ورود به فرم استفاده ميشه و اين كدي كه الان نوشتيد براي رفتن به صفحات ديگر هست؟
درسته؟ چون الان ما نميخوايم سيژن رو از بين ببريم.

ravand
یک شنبه 17 اردیبهشت 1391, 19:23 عصر
مهندس اين روش كار نكرد.
اين روش چطوره؟
ميايم اين كد رو اول كدهاي اون صفحه قرار ميديم:

<?php
session_start();
if(isset($_SESSION['login'])) {
?>
كد بالا ميگه اگه سيژن مورد نظر وجو داشت اجازه ورود بده .
كد پايين رو هم پايين همه ي كدهامون مي نويسيم:

<?php
} else {
header("Location:login.php");
exit;
}
?>
و كد بالا ميگه اگه سيژن مورد نظر وجود نداشت و رمز رو اشتباه وارد كرده باشيم به آدرس login.php برگرد و از اين صفحه خارج شو.

MMSHFE
یک شنبه 17 اردیبهشت 1391, 19:27 عصر
این هم خوبه. البته روش قبل هم کار میکرد اگه قبلش session_start رو میگذاشتین که من بخاطر اینکه وجودش بدیهی بود، نگذاشتم.

lady64
یک شنبه 17 اردیبهشت 1391, 20:56 عصر
دوست عزیز این کد رو اونجا من برای این گذاشته بودم (توی خود صفحه لاگین) که سشن کاربر قبلی ازبین بره. برای چک کردن سشن از این کد استفاده کنید:


if(!isset($_SESSION['user'])) {
@header('Location: index.php');
echo '<meta http-equiv="Refresh" content="0; url=index.php"/>';
exit();
}



ببخشید استفاده از این خط کد برای چیه؟

echo '<meta http-equiv="Refresh" content="0; url=index.php"/>';

و علامت @ قبل از header?
وقتی با header به صفحه index.php میریم ، لزوم گذاشتن اون کد چیه؟

ravand
یک شنبه 17 اردیبهشت 1391, 21:09 عصر
من هيچ وقت از علامت @ استفاده نميكنم و به جاش در برنامه ي notepad++ در منوي انكودينگ گزينه ي Encode in UTF-8 without BOM رو انتخاب ميكنم و مشكلي پيش نمياد. و كاراكتر اضافه اي هم نمياد.

MMSHFE
یک شنبه 17 اردیبهشت 1391, 22:24 عصر
استفاده از @ رو برای مواقعی گذاشتم که به هر دلیلی اگه نتونست هدر رو تغییر بده خطایی ظاهر نشه. مثلاً روی بعضی از سرورها حتی با وجود کدگذاری UTF-8 without BOM درصورتی که از Outbut Buffering استفاده نکنید، امکان تغییر هدرها رو نخواهید داشت. دستور echo هم که بعدش گذاشتم برای اینه که درصورتی که header نتونه کاربر رو به صفحه مربوطه هدایت کنه، با کمک تگ متا این کار انجام بشه. دستور exit هم برای اینه که اگه درهرحال هیچ کدوم انجام نشد (که احتمال انجام نشدن دومی خیلی کمه چون مثل JS هم نیست که بشه غیرفعالش کرد)، درهرحال بقیه اسکریپت اجرا نشه. موفق باشید.