Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Php: Datenbank-Backup... (https://www.delphipraxis.net/55408-php-datenbank-backup.html)

glkgereon 20. Okt 2005 13:42


Php: Datenbank-Backup...
 
Hi

ich versuche im moment mit Php ein Script zu schreiben mit welchem ich mir ein Backup einer Datenbank erstellen kann und dieses als Datei herunterzuladen.

wie ich gesehen hab gibt es wohl insgesamt 3 möglichkeiten
  • Dieser SELECT INTO OUTFILE-Query
  • mysqldump via system()
  • phpmyqdmin

da aber system() deaktiviert ist (funpic) und ich den weg über phpmyadmin eben nicht gehen will, würde ich gerne diesen Query nutzen.

dazu habe ich es mit folgendem Script versucht:
Code:
<?php
  $list = mysql_list_tables("glkgereon");
  while ($table = mysql_fetch_row($list)) {
    $bckfile = "/backup/bck_".$table[0]."_".date("d.m.y").".bck";
    $q = "SELECT * INTO OUTFILE '$bckfile' FROM $table[0]";
    mysql_query($q);
  }
?>
Das ganze wird von einer index.php aufgerufen, die die datenbank verbindung herstellt...
die liste mit den tabellen kommt auch völlig korrekt an, der backup-Ordner ist auch vorhanden

also die Verzeichnisstruktur ist (gekürzt) so:
Code:
FTP
  - backup (DIR)
  - php   (DIR)
    - anzeige
      - backup.inc.php
  - index.php

Der einzige Fehler:
es werden keine Dateien erstellt :(

woran liegt das?

NicNacMan 22. Okt 2005 23:44

Re: Php: Datenbank-Backup...
 
hi,

bei mir funktioniert dein script.
aber die datei liegt im mysql\data verzeichnis.

tn249 23. Okt 2005 00:23

Re: Php: Datenbank-Backup...
 
du könntest bei phpbb nachgucken, wie die ihr backup durchführen, wobei ich nicht weiß was die alles backupen

Gruß
Thomas

NicNacMan 23. Okt 2005 11:42

Re: Php: Datenbank-Backup...
 
hi,

oder du guckst mal bei http://www.hotscripts.com/PHP/Script...atabase_Tools/
vielleicht funktioniert ja das ein oder andere script auch bei funpic

Flocke 23. Okt 2005 11:52

Re: Php: Datenbank-Backup...
 
Zitat:

Zitat von glkgereon
Der einzige Fehler:
es werden keine Dateien erstellt :(

woran liegt das?

Du gibst ein absolutes Verzeichnis zu den Backup-Daten an - ich weiß nicht, ob das auf dem Server so korrekt ist. Kannst du nicht mit $_SERVER['DOCUMENT_ROOT'] arbeiten oder den Pfad relativ von $_SERVER['PHP_SELF'] ableiten?

glkgereon 23. Okt 2005 17:29

Re: Php: Datenbank-Backup...
 
ok, also /backup war schonmal falsch :)
is ja kein root-pfad...


wie ich schon sagte ist es ein funpic-server

@Flocke:
wie kriege ich denn raus, in welchem Verzeichnis meine index.php liegt?

S2B 23. Okt 2005 17:44

Re: Php: Datenbank-Backup...
 
Zitat:

Zitat von glkgereon
wie kriege ich denn raus, in welchem Verzeichnis meine index.php liegt?

Hast du schon mal ./deinPfad versucht? Ansonsten kannst du entweder mal __FILE__ oder ein $_SERVER['PHP_SELF'] nehmen und da den Dateinamen rauspflücken. :wink:

Phistev 23. Okt 2005 18:03

Re: Php: Datenbank-Backup...
 
Ein
Code:
<?php
echo getcwd();
?>
würd's auch tun.

glkgereon 23. Okt 2005 18:38

Re: Php: Datenbank-Backup...
 
getcwd gibt folgenden pfad aus:
/usr/export/www/vhosts/funnetwork/hosting/glkgereon
also müsste doch
/usr/export/www/vhosts/funnetwork/hosting/glkgereon/backup/bck_users_23.10.05.bck
ein korrekter dateiname sein, oder???

könnte es sein das bestimmte Querys (zb dieser :) ) auf dem server deaktiviert sind? geht das überhaupt?
oder das mysql auf dem server keine schreibrechte hat...oder auf den ordner nicht?

Flocke 23. Okt 2005 21:57

Re: Php: Datenbank-Backup...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bist du sicher, dass der MySQL-Server auf derselben Maschine läuft?

Als Anlage ein kleines PHP-Skript, mit dem du ein Backup deiner Datenbank ziehen kannst; du musst nur unten die Variablen anpassen:
Code:
define('DB_HOST',      'localhost');
define('DB_USER',      'root');
define('DB_PASS',      'DeinPasswort');
define('DB_DATABASE',   'DeineDatenbank');

glkgereon 24. Okt 2005 13:42

Re: Php: Datenbank-Backup...
 
genial...funktioniert :)

gibt es nun noch eine möglichkeit das a) wieder automatisch einzulesen und b) das ganze nicht einfach auszugeben sondern als Datei runterzuladen?

Edit:
wäre folgendes denkbar?
Code:
for ($i=0;$i<count($zeilen);$i++) {
  if ($zeilen[$i][1]!="-") {
    if ($zeilen[$i][strlen($zeilen[$i])]==",") {
      $akt = $akt.$zeilen[$i];
    } else if ($zeilen[$i][strlen($zeilen[$i])]==";") {
      $akt = $akt.$zeilen[$i];
      mysql_query($akt);
      $akt = "";
    }
  }
}

Flocke 24. Okt 2005 14:44

Re: Php: Datenbank-Backup...
 
Zu (b):
Wenn du diese Zeile einbaust, dann bietet dir der Browser das Abspeichern an.
Code:
header('Content-Disposition: attachment; filename="sqlbackup.txt"';
Ggf. solltest du auch noch
Code:
ob_start("ob_gz_handler");
aufrufen, dann wird's komprimiert (nicht die Datei sondern die Übertragung).

Zu (a):
Das ist nicht ganz trivial, weil ja in den Werten auch diese Zeichen vorkommen können, auf die du prüfst.

Ich schreib gerade mal was ...

glkgereon 24. Okt 2005 15:11

Re: Php: Datenbank-Backup...
 
Zitat:

Zitat von Flocke
Zu (b):
Wenn du diese Zeile einbaust, dann bietet dir der Browser das Abspeichern an.
Code:
header('Content-Disposition: attachment; filename="sqlbackup.txt"';
Ggf. solltest du auch noch
Code:
ob_start("ob_gz_handler");
aufrufen, dann wird's komprimiert (nicht die Datei sondern die Übertragung).

Zu (a):
Das ist nicht ganz trivial, weil ja in den Werten auch diese Zeichen vorkommen können, auf die du prüfst.

Ich schreib gerade mal was ...

naja...also ich prüfe zunächst ob das erste zeichen ein - ist....das ist eindeutig!
übrig bleiben dann nur noch 2 mögliche Zeilenarten. die mit Komma am Ende, die mit Semikolon am ende, und die leeren.
also eigentlich sollte das ja klappen...oder verhau ich mich da gerade?

Flocke 24. Okt 2005 15:52

Re: Php: Datenbank-Backup...
 
Liste der Anhänge anzeigen (Anzahl: 1)
[Unten folgt ein //NACHTRAG]

Ich denke, es würde gehen. Diese Funktion hier ist aber allgemeiner:
Code:
function SplitSqlStatements(&$fulltext)
{
    $states = array(
        // Normal (top-level)
        0 => array(
            "#" => array( 's' => 1, 'a' => 0 ),
            "-" => array( 's' => 2, 'a' => 0 ),
            "/" => array( 's' => 4, 'a' => 0 ),
            "\n" => array( 's' => 0, 'a' => 1 ),
            "'" => array( 's' => 7, 'a' => 1 ),
            '"' => array( 's' => 9, 'a' => 1 ),
            '`' => array( 's' => 11, 'a' => 1 ),
            ';' => array( 's' => -1, 'a' => 0 ),
            999  => array( 's' => 0, 'a' => 1 ),
        ),
        // Kommentar bis Zeilenende
        1 => array(
            "\n" => array( 's' => 0, 'a' => 0 ),
            999  => array( 's' => 1, 'a' => 0 ),
        ),
        // Minuszeichen gesehen
        2 => array(
            "-" => array( 's' => 3, 'a' => 0 ),
            999  => array( 's' => 0, 'a' => 1, 'i' => "-" ),
        ),
        // Zweites Minuszeichen gesehen
        3 => array(
            " " => array( 's' => 1, 'a' => 0 ),
            999  => array( 's' => 0, 'a' => 2, 'i' => "--" ),
        ),
        // Schrägstrich gesehen
        4 => array(
            "*" => array( 's' => 5, 'a' => 0 ),
            999  => array( 's' => 0, 'a' => 2, 'i' => "/" ),
        ),
        // C-style Kommentar
        5 => array(
            "*" => array( 's' => 6, 'a' => 0 ),
            999  => array( 's' => 5, 'a' => 0 ),
        ),
        // Stern gesehen im C-style Kommentar
        6 => array(
            "/" => array( 's' => 0, 'a' => 0 ),
            999  => array( 's' => 5, 'a' => 0 ),
        ),
        // Single quote
        7 => array(
            "'" => array( 's' => 0, 'a' => 1 ),
            "\\" => array( 's' => 8, 'a' => 1 ),
            999  => array( 's' => 7, 'a' => 1 ),
        ),
        // Backslash im single quote
        8 => array(
            999  => array( 's' => 7, 'a' => 1 ),
        ),
        // Double quote
        9 => array(
            '"' => array( 's' => 0, 'a' => 1 ),
            "\\" => array( 's' => 10, 'a' => 1 ),
            999  => array( 's' => 9, 'a' => 1 ),
        ),
        // Backslash im single quote
        10 => array(
            999  => array( 's' => 9, 'a' => 1 ),
        ),
        // Double quote
        11 => array(
            '`' => array( 's' => 0, 'a' => 1 ),
            "\\" => array( 's' => 12, 'a' => 1 ),
            999  => array( 's' => 11, 'a' => 1 ),
        ),
        // Backslash im backquote
        12 => array(
            999  => array( 's' => 11, 'a' => 1 ),
        ),
    );

    $state = 0;
    $result = array();
    $stmt = "";
    $len = strlen($fulltext);

    for ($k = 0; $k < $len; $k++)
    {
        $ch = $fulltext{$k};
        $ix = isset($states[$state][$ch]) ? $ch : 999;

        if (!empty($states[$state][$ix]['i']))
            $stmt .= $states[$state][$ix]['i'];

        if (!empty($states[$state][$ix]['a']))
            if (!empty($stmt) || ($ch != ' ' && $ch != "\n"))
                $stmt .= $ch;

        $state = $states[$state][$ix]['s'];

        if ($state == -1)
        {
            if (!empty($stmt))
                $result[] = $stmt;
            $stmt = "";
            $state = 0;
        }
    }

    if (!empty($stmt))
        $result[] = $stmt;

    return $result;
}
//NACHTRAG:

Hab's die Datei von oben noch mal ein bisschen angepasst und angehängt. Die Klasse ist jetzt um die Methode "Import" erweitert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz