I have an export script for multiple tables into .sql file as a backup. The script works great but I want to save a copy of the backup on the server too! I can insert it as a record but I can't use the method move_uploaded_file
as I used to for the photo upload.
Here is my script:
<?php
//ENTER THE RELEVANT INFO BELOW
//http://stackoverflow.com/a/31531996/1620626
$mysqlUserName = "root";
$mysqlPassword = "xxx";
$mysqlHostName = "localhost";
$DbName = "xxx_db";
$backup_name ="mybackup.sql";
$tables = array("table1","table2");
//or add 5th parameter(array) of specific tables: array("mytable1","mytable2","mytable3") for multiple tables
Export_Database($mysqlHostName,$mysqlUserName,$mysqlPassword,$DbName, $tables=false, $backup_name=false );
function Export_Database($host,$user,$pass,$name, $tables=false, $backup_name=false )
{
$mysqli = new mysqli($host,$user,$pass,$name);
$mysqli->select_db($name);
$mysqli->query("SET NAMES 'utf8'");
$queryTables = $mysqli->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 = $mysqli->query('SELECT * FROM '.$table);
$fields_amount = $result->field_count;
$rows_num=$mysqli->affected_rows;
$res = $mysqli->query('SHOW CREATE TABLE '.$table);
$TableMLine = $res->fetch_row();
$content = (!isset($content) ? '' : $content) . "
".$TableMLine[1].";
";
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 .= "
INSERT INTO ".$table." VALUES";
}
$content .= "
(";
for($j=0; $j<$fields_amount; $j++)
{
$row[$j] = str_replace("
","\
", 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 eariler
if ( (($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num)
{
$content .= ";";
}
else
{
$content .= ",";
}
$st_counter=$st_counter+1;
}
} $content .="
";
}
$backup_name = $backup_name ? $backup_name : $name."_(".date('H-i-s')."_".date('d-m-Y').").sql";
//$backup_name = $backup_name ? $backup_name : $name.".sql";
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"".$backup_name."\"");
move_uploaded_file($backup_name, 'files/bak/'.$backup_name);
echo $content; exit;
}
?>
So, I want to save the exported file into files/bak
as the user downloaded .sql
file.
So this bit of code get the backup file downloaded to your browser and therefore your client machine, backup is safe and sound!
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"".$backup_name."\"");
echo $content; exit;
But the move_uploaded_file();
is closely linked to Uploading file via the $_FILES mechanism, so dont use that.
All you need to do is write $content
to a file, it could be done as simply as
file_put_contents('files/bak/'.$backup_name, $content);
Link to manual - file-put-contents
So the complete code for the tail of your script would be
file_put_contents('files/bak/'.$backup_name, $content);
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary");
header("Content-disposition: attachment; filename=\"".$backup_name."\"");
echo $content;
exit;
Thanks for the help from @RiggsFolly. I come up with my own solutions :
$bakDir='files/bak/';
if (!is_dir($bakDir) or !is_writable($bakDir)) {
// Error if directory doesn't exist or isn't writable.
exit($bakDir." is unwritable");
} elseif (!empty($backup_name)) {
// Error if the file exists and isn't writable.
if(file_put_contents($bakDir.$backup_name, $content)){
echo "<script>alert('Backup successfully');</script>";
}else{
echo "<script>alert('Backup failed');</script>";
}
}