Восстановление резервной копии таблицы в sql и php


<?php
   $dbhost = 'XXXXXXX';
   $dbuser = 'XXXXXXX';
   $dbpass = 'XXXXXXX';

   $conn = mysqli_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $table_name = "chofer";
   $backup_file  = "chofer.sql";
   $sql = "LOAD DATA INFILE '$backup_file' INTO TABLE $table_name";

   mysqli_select_db($conn,'test_db');
   $retval = mysqli_query($conn, $sql);

   if(! $retval ) {
      die('No se puede acceder al registro : ' . mysql_error());
   }

  echo "<script>";
  echo "alert ('Restauración exitosa.');";
  echo "window.location.replace('index.php');";
  echo "</script>";

   mysqli_close($conn);
?>

с помощью этого скрипта вы должны восстановить таблицу chofer с информацией о файле chofer.sql, но отметьте эту ошибку "невозможно получить доступ к реестру" и не восстановите таблицу, теперь идея состоит в том, что вы спрашиваете, какой файл вы хотите восстановить, и также восстановите все таблицы, содержащиеся в файле .sql, надеюсь, вы можете помочь мне с этой дилеммой, большое спасибо.

это файл, с которым я поддерживаю таблицы

<?php

backup_tables('XXXXXXX','XXXXXXX','XXXXXXX','XXXXXXX');

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

   $link = mysqli_connect($host,$user,$pass);
   mysqli_select_db($link,$name);

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

   //cycle through
   foreach($tables as $table)
   {
      $result = mysqli_query($link,'SELECT * FROM '.$table);
      $num_fields = mysqli_num_fields($result);

      $return.= 'DROP TABLE '.$table.';';
      $row2 = mysqli_fetch_row(mysqli_query($link,'SHOW CREATE TABLE '.$table));
      $return.= "\n\n".$row2[1].";\n\n";

    for ($i = 0; $i < $num_fields; $i++)
      {
         while($row = mysqli_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.= ");\n";
         }
      }
      $return.="\n\n\n";
   }

   //save file
   $handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+');
   fwrite($handle,$return);
   fclose($handle);
}
?>
Author: Stravos77, 2016-08-29

1 answers

Вы хотите запустить SQL-скрипт из php.

Перед кодом решения я обязан рекомендовать не разрешать любому пользователю выполнять произвольный SQL на вашем сервере, потому что это открывает дверь для умеренно способного пользователя, чтобы уничтожить данные и их структуры.

Тем не менее, и после того, как вы увидели процедуру, которая генерирует backup, у вас есть SQL-скрипт, содержащий несколько операторов (один чтобы удалить таблицу, другую, чтобы создать ее снова, и несколько insert строк данных).

Использует функцию mysqli_multi_query для выполнения всего содержимого скрипта SQL за один вызов. Следуя строкам вашего примера, это будет что-то вроде:

<?php
  $dbhost = 'XXXXXXX';
  $dbuser = 'XXXXXXX';
  $dbpass = 'XXXXXXX';

  $conn = mysqli_connect($dbhost, $dbuser, $dbpass);

  if(! $conn ) {
    die('Could not connect: ' . mysql_error());
  }

  $backup_file  = "/path/to/chofer.sql";
  $sql = file_get_contents($backup_file);

  mysqli_select_db($conn,'test_db');

  if (mysqli_multi_query($conn, $sql)) {
    do {
      /* almacenar primer juego de resultados */
      if ($result = mysqli_store_result($link)) {
        while ($row = mysqli_fetch_row($result)) {
          printf("%s\n", $row[0]);
        }
        mysqli_free_result($result);
      }
      /* mostrar divisor */
      if (mysqli_more_results($link)) {
        printf("-----------------\n");
      }
    } while (mysqli_next_result($link));
  }


echo "<script>";
echo "alert ('Restauración exitosa.');";
echo "window.location.replace('index.php');";
echo "</script>";
mysqli_close($conn);
?>

Код, вероятно, имеет некоторую синтаксическую ошибку, идея состоит в том, что вы обращаетесь к нему и создаете свое собственное решение.

 1
Author: jachguate, 2016-08-29 21:36:58