使用PHP导出SQL表
所以我写的一个脚本有一个小问题,它可以在管理员点击备份按钮时运行 其功能是备份数据库中的每个表,并将它们保存为单个.sql文件 我已经能够创建目录将它们放入其中,甚至.sql文件本身,但我似乎无法让它写入文件 我甚至满足于整个数据库的一个文件转储,我只需要以某种方式保存它,要么保存到服务器上,要么下载到本地机器上 这是我的密码。使用PHP导出SQL表,php,mysql,Php,Mysql,所以我写的一个脚本有一个小问题,它可以在管理员点击备份按钮时运行 其功能是备份数据库中的每个表,并将它们保存为单个.sql文件 我已经能够创建目录将它们放入其中,甚至.sql文件本身,但我似乎无法让它写入文件 我甚至满足于整个数据库的一个文件转储,我只需要以某种方式保存它,要么保存到服务器上,要么下载到本地机器上 这是我的密码。 if(isset($\u GET['perform\u backup'])){ $site_connection=mysqli_connect(“$db_host”、“
if(isset($\u GET['perform\u backup'])){
$site_connection=mysqli_connect(“$db_host”、“$db_user_dec”、“$db_password_dec”、“$db_name_dec”)或die(“连接错误:$db_Error |”。mysqli_错误($site_connection));
$web\U output.=“已连接…”。mysqli\u获取主机信息($site\u connection)。“\n”;
如果(!$site\u连接){
$web_output.=“错误12:无法连接到MySQL。”.PHP_EOL;
$web\u output.=“调试错误号:”.mysqli\u connect\u errno().PHP\u EOL;
$web_output.=“调试错误:”.mysqli_connect_error().PHP_EOL;
}否则{
$tableList=array();
$SHOW_TABLES=$site_connection->query(“SHOW TABLES FROM$set_db_name”)或die(“Error 12:.mysqli_Error($site_connection));
$SHOW\u TABLES\u total=$SHOW\u TABLES->num\u行;
如果($SHOW\u TABLES\u total!=0){
while($row2=mysqli\u fetch\u assoc($SHOW\u TABLES)){
//$table=$row2[0];
//$web_输出。=“[$table]
”;
$directory\u ctr=0;
$dir\u name\u backup\u new=“站点文件/$set\u目录名称/备份/$current\u日期戳”;
如果(是目录($dir\u name\u backup\u new)){
$web\U output.=“$dir\U name\U backup\U new”存在。”;
$web_输出=“
”;
}否则{
$web\U output.=“$dir\U name\U backup\U new”目录不存在。
”;
$web_output.=“正在尝试创建Directroy…
”;
mkdir($dir_name_backup_new));
如果(是目录($dir\u name\u backup\u new)){
$web_output.=“成功制作目录!”;
}否则{
$web_output.=“创建目录失败!”;
$directory_ctr++;
}
$web_输出=“
”;
}
如果($directory\u ctr==0){
foreach($key=>$table_name的行2){
$web_output.=“[$table_name]-”;
$backup\u file=“$dir\u name\u backup\u new/$current\u date\u stamp-$table\u name.sql”;
$web_输出。=“$backup_文件
”;
fopen(“$backup_file”,“w+”);
//$db_stmt=$site_connection->query(“从$table_name中选择*);
$db_stmt=$site_connection->query(“选择*从$table_name导出文件“$backup_file”);
如果(!$db\u stmt){
$web\U output.=“无法进行数据备份…错误:”.$site\U connection->错误;
}否则{
$web_output.=“已成功备份数据。”;
}
$web_输出=“
”;
}
}否则{
$web_output.=“错误:未创建目录。
”;
}
}
}
}
echo$web_输出;
}
试试这个
$result = $db_con->query('SELECT * FROM `some_table`');
$fp = fopen('php://output', 'w');
if ($fp && $result) {
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export.csv"');
while ($row = $result->fetch_array(MYSQLI_NUM)) {
fputcsv($fp, array_values($row));
}
die;
}
试试这个
$result = $db_con->query('SELECT * FROM `some_table`');
$fp = fopen('php://output', 'w');
if ($fp && $result) {
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export.csv"');
while ($row = $result->fetch_array(MYSQLI_NUM)) {
fputcsv($fp, array_values($row));
}
die;
}
好的,这是我得出的结果。在使用@Pankaj Kaityar回复的帮助指示后。我能够做更多的研究,找到一段代码,让我可以编写一个函数来下载数据库的副本,或者通过按下一个或另一个按钮将其保存到服务器 代码尽可能地简化了,我相信还有其他人可以改进这一点。但这对我有用。其他人可以随意使用它
//HTML Buttons
<a href="pagename?perform_new_backup=download">Perform Server Backup</a>
<a href="pagename?perform_new_backup=server">Perform Download Backup</a>
//PHP Code
$db_array = array();
$directory_ctr = 0;
$dir_name_backup_new = "site_files/backups/";
if(isset($_GET['perform_new_backup'])) {
include('function_db_export.php');
$site_connection = mysqli_connect("$db_host", "$db_user_dec", "$db_password_dec", "$db_name_dec") or die("Error Connecting: $DB_ERROR | " . mysqli_error($site_connection));
echo 'Connected... ' . mysqli_get_host_info($site_connection) . "<br />";
if(!$site_connection) {
echo "Error 12: Unable to connect to MySQL." . PHP_EOL;
echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
} else {
$SHOW_TABLES=$site_connection->query("SHOW TABLES FROM $db_name_dec") or die("Error 13: " . mysqli_error($site_connection));
$SHOW_TABLES_total = $SHOW_TABLES->num_rows;
if($SHOW_TABLES_total != 0) {
while($row2=mysqli_fetch_assoc($SHOW_TABLES)) {
if(!is_dir($dir_name_backup_new)) {
echo "'$dir_name_backup_new' directory does not exist. <br />";
echo "Attempting To Create Directroy ... <br />";
mkdir("$dir_name_backup_new");
if(is_dir($dir_name_backup_new)) {
echo "Success Making Directory! <br />";
} else {
echo "Failed To Make Directory! <br />";
$directory_ctr++;
}
}
if($directory_ctr == 0) {
foreach($row2 as $key=>$table_name) {
array_push($db_array,"$table_name");
echo "Found '<u>$table_name</u>' Table... Attempting Backup... <br />";
}
} else {
echo "Error: Directories Not Created. <br />";
}
}//END WHILE
//echo print_r($db_array); //Testing Purposes
$new_file_name = $db_name_dec.'-db-backup-'.$current_date_stamp.'.sql';
if($_GET['perform_new_backup'] == "server") {
$save_setting = $save_location=false;
} elseif($_GET['perform_new_backup'] == "download") {
$save_setting = $dir_name_backup_new;
} else {
$save_setting = $dir_name_backup_new;
}
$cur_page = "$select_variable?id=$website_id";
Export_Database($db_host, $db_user_dec, $db_password_dec, $db_name_dec, $save_setting, $table_name = $db_array, $new_file_name, $cur_page);
} //END IF
}
}
//FUNCTION FILE (function_db_export.php)
function Export_Database($host,$user,$pass,$name,$save_location=false, $tables=false, $backup_name=false, $current_page ) {
global $web_output;
$new_conn = new mysqli($host,$user,$pass,$name);
$new_conn->select_db($name);
$new_conn->query("SET NAMES 'utf8'");
$queryTables = $new_conn->query('SHOW TABLES');
while($row = $queryTables->fetch_row()) {
$target_tables[] = $row[0];
}
if($tables !== false) { $target_tables = array_intersect( $target_tables, $tables); }
foreach($target_tables as $table) {
$result = $new_conn->query('SELECT * FROM '.$table);
$fields_amount = $result->field_count;
$rows_num=$new_conn->affected_rows;
$res = $new_conn->query('SHOW CREATE TABLE '.$table);
$TableMLine = $res->fetch_row();
$content = (!isset($content) ? '' : $content) . "\n\n".$TableMLine[1].";\n\n";
for ($i = 0, $st_counter = 0; $i < $fields_amount; $i++, $st_counter=0) {
while($row = $result->fetch_row()) { //when started (and every after 100 command cycle):
if ($st_counter%100 == 0 || $st_counter == 0 ) {
$content .= "\nINSERT INTO ".$table." VALUES";
}
$content .= "\n(";
for($j=0; $j<$fields_amount; $j++) {
$row[$j] = str_replace("\n","\\n", addslashes($row[$j]) );
if (isset($row[$j])) {
$content .= '"'.$row[$j].'"' ;
} else {
$content .= '""';
}
if ($j<($fields_amount-1)) {
$content.= ',';
}
}
$content .=")";
//every after 100 command cycle [or at last line] ....p.s. but should be inserted 1 cycle earlier
if ( (($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num) {
$content .= ";";
} else {
$content .= ",";
}
$st_counter=$st_counter+1;
}
} $content .="\n\n\n";
}
if($save_location !== false) {
$myfile = fopen($save_location.$backup_name, "w") or die("Unable to open file!");
fwrite($myfile, $content);
fclose($myfile);
$web_output .= "... Backup Has Completed. <br />";
$web_output .= "Page will refresh in 5 seconds.";
header( "refresh:5;url=$current_page" );
} else {
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"".$backup_name."\"");
echo $content; exit();
header( "refresh:5;url=$current_page" );
}
}
//HTML按钮
//PHP代码
$db_array=array();
$directory\u ctr=0;
$dir_name_backup_new=“site_files/backups/”;
如果(isset($\u GET['perform\u new\u backup'])){
包括('function_db_export.php');
$site_connection=mysqli_connect(“$db_host”、“$db_user_dec”、“$db_password_dec”、“$db_name_dec”)或die(“连接错误:$db_Error |”。mysqli_错误($site_connection));
echo“已连接…”。mysqli_获取主机信息($site_connection)。“
”;
如果(!$site\u连接){
echo“错误12:无法连接到MySQL。”.PHP\u EOL;
echo“调试错误号:”.mysqli\u connect\u errno().PHP\u EOL;
echo“调试错误:”.mysqli\u connect\u error().PHP\u EOL;
}否则{
$SHOW_TABLES=$site_connection->query(“SHOW TABLES FROM$db_name_dec”)或die(“Error 13:.mysqli_Error($site_connection));
$SHOW\u TABLES\u total=$SHOW\u TABLES->num\u行;
如果($SHOW\u TABLES\u total!=0){
while($row2=mysqli\u fetch\u assoc($SHOW\u TABLES)){
如果(!is_dir($dir_name_backup_new)){
echo“$dir\u name\u backup\u new”目录不存在。
;
echo“正在尝试创建Directroy…
”;
mkdir($dir_name_backup_new));
如果(是目录($dir\u name\u backup\u new)){
echo“成功制作目录!
”;
}否则{
echo“创建目录失败!
”;
$directory_ctr++;
}
}
如果($directory\u ctr==0){
foreach($key=>$table_name的行2){
数组推送($db_数组,“$table_名称”);
echo“找到“$table_name”表…正在尝试备份…
”;
}
}否则{
echo“错误:未创建目录。
”;
$para = array(
'db_host'=> '$DB_HOST', //mysql host
'db_uname' => '$DB_USER', //user
'db_password' => '$DB_PASS', //pass
'db_to_backup' => '$DB_NAME', //database name
'db_backup_path' => './sql-backups/', //where to backup
'db_exclude_tables' => array('') //tables to exclude
);
$dbBackup = new backupDB();
$dbBackup->__backup_mysql_database($para);
class backupDB {
private $params;
function __backup_mysql_database($params) {
date_default_timezone_set("America/New_York");
$tables_array = array();
$contents = "-- Database: `".$params['db_to_backup']."` --\n";
$mysqli = new mysqli($params['db_host'], $params['db_uname'], $params['db_password'], $params['db_to_backup']);
if (!$mysqli) {
echo "Error: Unable to connect to MySQL." . PHP_EOL;
echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
exit;
}
//if ($mysqli->connect_error) {
// die('Error : ('. $mysqli->connect_errno .') '. $mysqli->connect_error);
//}
$show_tables = $mysqli->query("SHOW TABLES");
while($row = $show_tables->fetch_array()){
if (!in_array($row[0], $params['db_exclude_tables'])){
$tables_array[] = $row[0];
}
}
foreach($tables_array as $table){
$contents .= "-- Table `".$table."` --\n";
$show_tables = $mysqli->query("SHOW CREATE TABLE ".$table);
while($row = $show_tables->fetch_array()){
$contents .= $row[1].";\n\n";
}
$show_tables = $mysqli->query("SELECT * FROM ".$table);
$row_count = $show_tables->num_rows;
$fields = $show_tables->fetch_fields();
$fields_count = count($fields);
$insert_head = "INSERT INTO `".$table."` (";
for($i=0; $i < $fields_count; $i++){
$insert_head .= "`".$fields[$i]->name."`";
if($i < $fields_count-1){
$insert_head .= ', ';
}
}
$insert_head .= ")";
$insert_head .= " VALUES\n";
if($row_count>0){
$row_counter = 0;
while($row = $show_tables->fetch_array()){
if(($row_counter % 400) == 0){
$contents .= $insert_head;
}
$contents .= "(";
for($i=0; $i < $fields_count; $i++){
$row_content = str_replace("\n","\\n",$mysqli->real_escape_string($row[$i]));
switch($fields[$i]->type){
case 8: case 3:
$contents .= $row_content;
break;
default:
$contents .= "'". $row_content ."'";
}
if($i < $fields_count-1){
$contents .= ', ';
}
}
if(($row_counter+1) == $row_count || ($row_counter % 400) == 399){
$contents .= ");\n\n";
} else {
$contents .= "),\n";
}
$row_counter++;
}
}
}
if (!is_dir ( $params['db_backup_path'] )) { mkdir ( $params['db_backup_path'], 0777, true ); }
$backup_file_name = $params['db_backup_path']."sql-backup-".date("Y-m-d_H-i-s").".sql";
$fp = fopen($backup_file_name ,'w+');
if (($result = fwrite($fp, $contents))) {
echo "-- Backup file created on ".date("h:i:s a M j, Y")."\n";
}
fclose($fp);
if (file_exists($backup_file_name)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($backup_file_name).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($backup_file_name));
readfile($backup_file_name);
exit;
}
mysqli_close($mysqli);
}
}