نوشتن کد بک آپ گیری

saalek110

Well-Known Member
ساخت بک آپ گیر خودتان :
با کد بالا میشه از پستها و چیزای دیگه دیتابیس کپی به شکل فایل نگه داشت. و در موقع لزوم از کپی استفاده کنند.

من در مراحل مختلف ساخت ، کد بک آپ گیر را گذاشتم تا حالت آموزشی داشته باشه و شما بتوانید خودتان(حرفه ای تر ها را میگم) کدهای فایل بک آپ گیر را با توجه به نیازهای خود تغییر داده و استفاده کنید.

من در حالت echo روی صفحه کار ساخت بک آپ گیر را شروع کردم که کارهای قابل مشاهده باشد ، و وقتی نهایی شد ، مقادیر را داخل اون متغیر sqlScript ریختم با کاراکترهای نقطه مساوی =.

شما هم اولش با چاپ بوسیله echo کار ساخت کدتان را شروع کنید تا همه چیز روی صفحه چاپ شود و بتوانید کد را تصحیح کنید.

توصیه می کنم در هاستی ، ساخت بک آپ گیر را به شروع کنید که خلوت تر باشه و کار راحت تر باشه.. هاست مبدا ، یعنی جایی که جدول مبدا هست ، من مشکل شپلتر داشتم ،ولی در این هاست ندارم... وقتی کد نهایی تر شد می برم روی هاست مبدا کد را تکمیل تر می کنم.

فایل ساخته شده که دانلود میشه میره توی گوشی ، و می توانید هاست مقصد را هم همزمان باز کنید و سطرها را درج کنید.

من حین کار انتقال پست ها ، ممکن است باز کدهای بک آپ گیر را تغییر دهم و تغییرات را در تاپیک گزارش می کنم.

هاست مقصد من روی profreehost است و می توانم هر دو هاست را همزمان در یک بروسر کار کنم. ولی اگر هر دو هاست در یک هاست بود ، یعنی دو تا اکانت با دو تا جیمیل از یک هاست داشتید، باید دو بروسر باز کنید ، مثلا اپرا یا فایرفاکس را هم باز کنید.
 

saalek110

Well-Known Member
ادامه بک آپ گیری:

انتخاب ستونهای خاص در بک آپ گیری:

من نمی خواهم همه ستون های جدول مبدا را کپی کنم ، بعضی ستون هایش را نیاز دارم
.
چطور کد بک آپ را دستکاری کنم تا به این هدف برسم؟

مثلا فقط ستون ۱ و ۳ را کپی کنم.


کد زیر:
PHP:
<?php
require"ccoonn.php";
$charset = "utf8";
$conn->set_charset($charset);


 if(!isset($_POST['action_2']))
{
?>
<br><br>
<form id='myform' action="<?php echo $_SERVER['PHP_SELF']; ?>"  method = 'POST'>
<center>
start: <input type="text" style=" font-size:35px; height:55px; width:120px" name="start">
end: <input type="text" style=" font-size:35px; height:55px; width:120px" name="end"><br><br>
<input type="submit" style=" font-size:35px; height:55px; width:120px"name='action_2' value="Submit">
</center>
</form>
<?php
}// form badan namayesh peyda nakonad
 if(isset($_POST['action_2']))
 {
     echo"<br>";
     $start=test_input($_POST["start"]);
     $end=test_input($_POST["end"]);

 echo "<br>start= ".$start;
 echo "<br>end= ".$end;
 echo"<br><br>";



 $sqlScript = "";
//-------------
$table="test";
$table2="test2";
$max_soton=3;
//-------------

 for ($i = $start; $i <=$end; $i ++) {
    $query = "SELECT * FROM $table WHERE number=$i";
    $result = mysqli_query($conn, $query);
      echo"INSERT INTO $table2 (`a1`,`a3`) VALUES(";
       $sqlScript .="INSERT INTO $table2 (`a1`,`a3`) VALUES(";


     while ($row = mysqli_fetch_row($result)) {
         for ($p = 1; $p <=$max_soton; $p ++) {

         if ($p==1 || $p==3)
         {
  
    if (isset($row[$p]))
    {
        echo"'".$row[$p]."'";
         $sqlScript .= "'".$row[$p]."'";
    }
    if (!isset($row[$p]))
    {
    echo"''";
     $sqlScript .= "''";

    }

      if ($p <= ($max_soton - 1)) {   echo',';  }
         }//if soton==
         }//second for loop
    }// while fetch
        echo ");<br>";
      $sqlScript .= ");\n";

   } // for loop
 
        echo "<br>";
           $sqlScript .= "\n";





echo"<br> chaape sqlScrip: <br><br>";
echo $sqlScript;

//if(!empty($sqlScript))
if (false)
{
// Save the SQL script to a backup file
$backup_file_name = $database_name . '_backup_' . time() . '.sql';
$fileHandler = fopen($backup_file_name, 'w+');
$number_of_lines = fwrite($fileHandler, $sqlScript);
fclose($fileHandler);
// Download the SQL backup file to the browser
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($backup_file_name));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($backup_file_name));
ob_clean();
flush();
readfile($backup_file_name);
exec('rm ' . $backup_file_name);
}


 }// if action
        function test_input($data) {
              $data = trim($data);
             $data = stripslashes($data);
             $data = htmlspecialchars($data);
                 return $data;                                                                    }
    
?>

در کد بالا داخل حلقه ، داخلی ، یک if گذاشتم و شماره ستون های مورد نظر را ذکر کردم و با ((یا )) بین شرط ها ، (کارکترهای خطوط موازی عمودی در php معنی ((یا)) می دهد.) کاری کردم ، اعداد مورد نظرم ثبت شود.

PHP:
         if ($p==1 || $p==3)
{


}// if soton==
کد بالا فایل سازش را از کار انداختم ، با نوشتن if داخل پرانتز فالس false.

همچنین کوئری insert باید متناسب با ستون ها باشه که a1 و a3 است.

SQL:
      echo"INSERT INTO $table2 (`a1`,`a3`) VALUES(";

در ضمن توجه کنید که ستون ها از صفر شماره می خوره نه از یک... ستون شماره صفر ، همان ستون number است که نمیشه چیزی درش insert کرد و اگرinsert کنید phpmyadmin خطا می گیره.
پس من وقتی نوشتم ستون ۱ و ۳ در اصل شماره اونها ۲ و ۴ است... ولی چون من در حلقه از ۱ شروع کردم ، خودبخود ستون صفر حذف شده.
 

saalek110

Well-Known Member
در ادامه من شروع به استفاده از کد بک آپ گیر خودم کردم و مشکلاتی که پیش می اومد را رفع می کردم...




ساختن کد بک آپ:

در کد بک آپ کوئری را این طوری نوشتم:
PHP:
 echo"INSERT INTO $table2 (`topic_id`,`poster_id`,`time`,`post`,`time_edit`) VALUES(";

حالا باید خط زیر را بسازیم:
PHP:
         if ($p==1 || $p==3)
به جای ۱ و ۳ ، ما ۵ تا عدد نیاز داریم...
یک و ۳ باید بمونه چون شانسی همون شماره تاپیک و شماره یوزر است.
شماره ۱۴ برای متن پست است.
شماره ۶ برای تایم پست.
شماره ۲۰ برای ادیت است.
PHP:
         if ($p==1 || $p==3 || $p==6 || $p==14 || $p==20)

توجه: بایستی ترتیب در کوئری با شماره ستون جور باشه. یعنی time که شماره اش ۶ است در کویری باید قبل محتوای پست بشه که شماره اش ۱۴ است...آخری زمان ادیت است که شماره ۲۰ دارد.


به جای number هم باید post_id گذاشت.

max_soton مقدارش قبلا ۳ بود به ۳۰ تغییر دادم.(بعدا خواهید دید ۳۰ اشتباه است ، باید ۲۰ گرفت)
 

saalek110

Well-Known Member
در جدولی که ساخته بودم در مقصد هم باید post بعد time و قبل time_edit قرار می گرفت تا به کوئری ساخته شده جور در می اومد.
پس ستون time را دیلت کردم و قبل post دوباره اضافه کردم.

Max_soton را باید برابر آخرین ستون یعنی ۲۰ گرفت ، ۲۰ شماره ستون زمان ادیت پست بود.... چون اگر بزرگتر بگیریم یک ویرگول ته خط می افته و phpmyadmin خطا می گیره.

فعلا کوئری ما قبول شد.

من یک تغییری هم قبلا ایجاد کرده بودم ، نمی دونم لازم بود یا نه....کد زیر را ببینید:
PHP:
 echo"INSERT INTO `posts` (`number`,`topic_id`,`poster_id`,`time`,`post`,`time_edit`) VALUES(NULL,";
تغییر اینه که ستون number هم در کوئری insert هست ولی NULL درش درج میشه ، یعنی چیزی درج نمیشه.
از این حالت کد خوشم اومده ، بذار همین شکلی باشه.
کل کد را در پست بعدی می زنم ببینید.
 

saalek110

Well-Known Member
PHP:
<?php
require"base/ccoonn.php";
$charset = "utf8";
$conn->set_charset($charset);


 if(!isset($_POST['action_2']))
{
?>
<br><br>
<form id='myform' action="<?php echo $_SERVER['PHP_SELF']; ?>"  method = 'POST'>
<center>
start: <input type="text" style=" font-size:35px; height:55px; width:120px" name="start">
end: <input type="text" style=" font-size:35px; height:55px; width:120px" name="end"><br><br>
<input type="submit" style=" font-size:35px; height:55px; width:120px"name='action_2' value="Submit">
</center>
</form>
<?php
}// form badan namayesh peyda nakonad
 if(isset($_POST['action_2']))
 {
     echo"<br>";
     $start=test_input($_POST["start"]);
     $end=test_input($_POST["end"]);

 echo "<br>start= ".$start;
 echo "<br>end= ".$end;
 echo"<br><br>";



 $sqlScript = "";
//-------------
$table="phpbb_posts";

$max_soton=20;
//-------------

 for ($i = $start; $i <=$end; $i ++) {
    $query = "SELECT * FROM $table WHERE post_id=$i";
    $result = mysqli_query($conn, $query);
 echo"INSERT INTO `posts` (`number`,`topic_id`,`poster_id`,`time`,`post`,`time_edit`) VALUES(NULL,";
       $sqlScript .="INSERT INTO `posts` (`number`,`topic_id`,`poster_id`,`time`,`post`,`time_edit`) VALUES(NULL,";


     while ($row = mysqli_fetch_row($result)) {
         for ($p = 1; $p <=$max_soton; $p ++) {

         if ($p==1 || $p==3 || $p==6 || $p==14 || $p==20)
         {
   
    if (isset($row[$p]))
    {
        echo"'".$row[$p]."'";
         $sqlScript .= "'".$row[$p]."'";
    }
    if (!isset($row[$p]))
    {
    echo"''";
     $sqlScript .= "''";

    }

      if ($p <= ($max_soton - 1)) {   echo',';  }
         }//if soton==
         }//second for loop
    }// while fetch
        echo ");<br>";
      $sqlScript .= ");\n";

   } // for loop
 
        echo "<br>";
           $sqlScript .= "\n";





echo"<br> chaape sqlScrip: <br><br>";
echo $sqlScript;

//if(!empty($sqlScript))
if (false)
{
// Save the SQL script to a backup file
$backup_file_name = $database_name . '_backup_' . time() . '.sql';
$fileHandler = fopen($backup_file_name, 'w+');
$number_of_lines = fwrite($fileHandler, $sqlScript);
fclose($fileHandler);
// Download the SQL backup file to the browser
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($backup_file_name));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($backup_file_name));
ob_clean();
flush();
readfile($backup_file_name);
exec('rm ' . $backup_file_name);
}


 }// if action
        function test_input($data) {
              $data = trim($data);
             $data = stripslashes($data);
             $data = htmlspecialchars($data);
                 return $data;                                                                    }
     
?>

روش کار اینه اون قدر کوئری ساخته شده را تغییر بدهید تا شبیه کوئری خود phpmyadmin بشه.
دکمه insert را در phpmyadmin بزنید و یک سطر دستی درج کنید ، موقع درج کوئری insert را هم به شما نشون میدهد. باید دقیقا شبیه کوئری خودش بشه.
کد بالا الان دقیقا کوئری شبیه کوئری phpmyadmin می سازه.

اسم $table2 را از کد بالا حذف کردم چون مستقیم در کد نوشتم posts.
 

saalek110

Well-Known Member
الان یک فایل حاوی ۵ کوئری را دادم به import هر ۵ کوئری را اجرا کرد.



با زدن دکمه empty جدول خالی میشه نیاز نیست جدول را دیلت کنید و از اول بسازید.

همچنین وقتی به حالت بروس یعنی دیدن جدول بروید دکمه دیلت برای هر سطر هست. عکس چند پست بعد را ببینید.
 

saalek110

Well-Known Member
نتیجه کار:
Screenshot_۲۰۲۴-۰۱-۲۴_۱۲۲۸۵۵.jpg
۵ پست را می بینید...پست اول را خود phpbb برای نمونه زده و انگلیسی است. پست آخر هم فقط چند تا نقطه است.
ستون time می بینید یک عدد ۱۰ رقمی است که بعدا طرز خوندنش را با توابع php میگم یا همین الان زمان را در php خودتان سرچ کنید و بخونید.
Poster_id دائما ۲ است که خود من هستم. فکر کنم یک جدول users داریم که با این poter_id می تونیم بفهمیم شماره ۲ کیه.
تاپیک id را می بینید که اعداد ۱ و ۲ و ۳ داره ، که شماره تاپیک هاست.
ستون number هم خود ایجاد شونده است و به هر ردیف یک عدد می دهد که بعدا برای کار با ردیف ها لازمش داریم. مثلا حذف یک پست یا ادیت یک پست.
ستون time_edit هم خالی است ، شاید چون پستی ادیت نشده.
من الان رفتم در فروم پست دوم را ادیت کردم ، ولی همچنان عدد اون ستون صفر است. کل اون ستون همش صفره.پس ستون آخر یعنی time_edit را از برنامه خارج می کنیم.
 

saalek110

Well-Known Member
ستون time_edit از برنانه خارج شد:
تغییرات لازم در کد:
کوئری ها: اسم time_edit از کوئری حذف شد.
PHP:
 echo"INSERT INTO `posts` (`number`,`topic_id`,`poster_id`,`time`,`post`) VALUES(NULL,";


       $sqlScript .="INSERT INTO `posts` (`number`,`topic_id`,`poster_id`,`time`,`post`) VALUES(NULL,";

در کد شماره ستون ها ، شماره ۲۰ حذف شد:
PHP:
         if ($p==1 || $p==3 || $p==6 || $p==14)

Max_soton برابر ۱۴ شد تا ویرگول اضافه ته خط نیاندازد:
PHP:
$max_soton=14;

در جدول هدف ، ستون time_edit حذف شد.
 

saalek110

Well-Known Member
جدول فعلی بدون ستون time_edit

Screenshot_۲۰۲۴-۰۱-۲۴_۱۲۵۲۵۶.jpg
فروم قدیمی هم آدرسش اینه:saalek110.rf.gd در تالار اول می توانید این پست ها را ببینید.
 

جدیدترین ارسال ها

بالا