php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.07.2007, 22:06  
Erfahrener Benutzer
 
Registriert seit: 11.01.2005
Beiträge: 106
MerlinderZauberer ist zur Zeit noch ein unbeschriebenes Blatt
Standard Importieren einer Sql-Datei

Hallo,

ich habe eine TXT-Datei erstellt, in der sich MySQL-Befehlen befindet.

Auf der MySQL-Shell-Ebene besteht die Möglichkeit, meineTXT-Datei mittels dem Befehl "source Dateiname" zu importieren. Funktioniert auch.

Versuche das ganze als MySQL-Query abzusetzen, schlagen fehl. Fehlermeldungen gibt es keine.

PHP-Code:
<?php

mysql_query
("SOURCE [i]Dateiname[/i]",dbhandler);

?>
Gibt es ein SQL-Statment, mithilfe dessen ich eine solche Textdatei einlesen kann?

Kann man Grundsätzlich alle Befehle auf der Shellebene auch in einem MySQL-Query auf PHP-Ebe ne nutzen?

Zugriff auf Exec() habe ich nicht.

Merlin der Zauberer
__________________
www.Sternenwelt.net - Astronomie im Internet -
www.SternenweltForum.net - Antworten rund um die Astronomie -
MerlinderZauberer ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.07.2007, 22:38  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Äääh, dazu gibt in der Tutorial-Sektion einen schönen Beitrag
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline  
Alt 28.07.2007, 00:30  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ach ja? Ein Link wäre toll...
nikosch ist offline  
Alt 28.07.2007, 01:26  
Erfahrener Benutzer
 
Registriert seit: 11.01.2005
Beiträge: 106
MerlinderZauberer ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo Ihr beiden,

Zitat:
Zitat von phpdummi
Äääh, dazu gibt in der Tutorial-Sektion einen schönen Beitrag
Ich habe ja nun versucht, im Manuell und weiteren Quellen eine Lösung zu finden. Bin nur leider nicht fündig geworden. Habe das Problem anders gelöst. Damit umgehe ich unter anderem eine Excute des MySQL-Server.

Ich lese die Zeilen einzeln aus und prüfe einen Demeliter am Ende der Zeile. Ist einer vorhanden, führe ich ein Query durch.

Hier mal das Scriptschnipsel:

PHP-Code:
<?php
$zeile       
"";
$dbquery  "";

$datei gzopen(dateiname,"r");

while(!
FEOF($datei))
                        {
                        
$zeilegzgets($datei);
                        
                        
Prüfen, ob Befehlsende erreicht
                        
if (!preg_match("/\;/",(substr($zeile,strlen($zeile)-1,strlen($zeile)))))
                            {
                            
# Zeile hinzufügen zum Query, Befehlsende nicht erreicht
                            
$dbquery.= $zeile."\n";
                            }
                        else
                            {
                            
# Zeile hinzufügen zum Query, Befehlsende erreicht
                            
$dbquery.= $zeile;
                            
$dbanfrage mysql_query($dbquery,$dbhandler);
                            
                            if (
$dbanfrage == 0)
                                {
                                echo 
"Folgendes Query ist fehlgeschlagen:";
                                echo
".$dbquery."

";

                                }
                            $dbquery = "";
                            }

gzclose($datei);
Funktioniert einwandfrei.

Jetzt eine weitere Frage! Ist es für die Perfomance nicht besser, mehrere SQL-Anfragen zu bündeln und an den MySQL-Server zu schicken?

Manche Datenbanken erreichen mühelos 20-40 MByte.

Merlin der Zauberer
__________________
www.Sternenwelt.net - Astronomie im Internet -
www.SternenweltForum.net - Antworten rund um die Astronomie -
MerlinderZauberer ist offline  
Alt 28.07.2007, 02:39  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ist auf jeden Fall eine Variante. Die Kombination von preg_match () und substr () ist etwas doppelt gemoppelt. Je nach Ausgangsdatei wäre es vielleicht sinnvoll, zwischen ; und Zeilenende noch Leerzeichen zu erlauben.

Etwas abgeändert bekommst Du so die einzelnen Befehle in einem Array:
PHP-Code:
$sAll file_get_contents ('test.txt');
$aQueries preg_split ('/;\s*[\n\r]+/' $sAll); 
Ansonsten täte es auch ein
PHP-Code:
$sAll file_get_contents ('test.txt');
$aQueries explode (";\r\n" $sAll); 
Gesetzt den Fall, Du hältst Dich konsequent an das Muster.

Was meinst Du mit bündeln? Z.B. Multi-Inserts?
nikosch ist offline  
Alt 28.07.2007, 12:16  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich meinte dieses Tutorial:
http://phpfriend.de/forum/ftopic32995.html

Dort steht im Script sql_back.php:
PHP-Code:
<?php
/**
* [...]
*/

// read file into database
$mysql mysql_connect($mysql_hostname$mysql_username$mysql_password) or die("Could not connect to $mysql_hostname - ".mysql_error());
mysql_select_db($mysql_database) or die("Could not select database $mysql_database - ".mysql_error());

$dump file($filename) or die("Could not read file $filename");
foreach (
$dump as $data) {
  if (
strlen($data) > 1mysql_query(substr($data0, -1)) or die("Could not exec $data - ".mysql_error());
}

/**
* [...]
*/

?>
Ich dachte das hilft. Gefunden habe ich das Tutorial bei einer Suche nach "mysql dump php" unter den ersten 10 Ergebnissen, deshalb die blöde Anmerkung oben.
Tut mir leid
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline  
Alt 28.07.2007, 23:10  
Erfahrener Benutzer
 
Registriert seit: 11.01.2005
Beiträge: 106
MerlinderZauberer ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von nikosch77
Etwas abgeändert bekommst Du so die einzelnen Befehle in einem Array:

PHP-Code:
$sAll file_get_contents ('test.txt');
$aQueries preg_split ('/;\s*[\n\r]+/' $sAll); 
Ansonsten täte es auch ein
PHP-Code:
$sAll file_get_contents ('test.txt');
$aQueries explode (";\r\n" $sAll); 
Gesetzt den Fall, Du hältst Dich konsequent an das Muster.
Du hast recht, mit meinen substr sieht es nicht besonders elegant aus. Ich habe allerdings das Problem, das z.B. in Feld meiner Datenbank das Delemiter vorkommen kann. Mit dem substr wollte ich das vermeiden. Tatsächlich muß ich aufgrund von Leerzeichen die letzten 3-4 Zeichen einer Zeile prüfen.

Hier brauche ich letzendlich nur das Zeichen $ für Stringende nutzen, damit wäre mein substr erledigt, denke ich mal. Aus dem FF-Denke ich mal so:

PHP-Code:
preg_match("/\;(\r)*$/",$zeile);       # ungetestet 
Die Lösung mit dem Array habe ich auch überlegt. Allerdings stoße ich hier aufgrund der Dateigröße und der großen Anzahl von Query´s an die Grenze des Verfügbaren Arbeitsspeicher (Hoster). Deswegen das Auslesen jeder Zeile.

Zitat:
Zitat von nikosch77
Was meinst Du mit bündeln? Z.B. Multi-Inserts?
Das wäre der richtige Begriff gewesen Das meine ich!

Zitat:
Zitat von phpdummi
Ich dachte das hilft. Gefunden habe ich das Tutorial bei einer Suche nach "mysql dump php" unter den ersten 10 Ergebnissen, deshalb die blöde Anmerkung oben.
Manchmal sucht man nicht mit den elementaren Dingen...
Gesucht habe ich jedenfalls

Danke für eure Antworten

Merlin der Zauberer
__________________
www.Sternenwelt.net - Astronomie im Internet -
www.SternenweltForum.net - Antworten rund um die Astronomie -
MerlinderZauberer ist offline  
Alt 29.07.2007, 13:35  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,
habe hier eine kleine Funktion geschrieben, vielleicht kannst du sie verwenden und Feedback über das korrekte zerlegen geben:
PHP-Code:
<?php
function getQueriesFromFile($file)
{
    
// import file line by line
    // and filter (remove) those lines, beginning with an sql comment token
    
$file array_filter(file('import.sql'),
                         
create_function('$line',
                                         
'return strpos(ltrim($line), "--") !== 0;'));
    
// this is a list of SQL commands, which are allowed to follow a semicolon
    
$keywords = array('ALTER''CREATE''DELETE''DROP''INSERT''REPLACE''SELECT''SET',
                      
'TRUNCATE''UPDATE''USE');
    
// create the regular expression
    
$regexp sprintf('/\s*;\s*(?=(%s)\b)/s'implode('|'$keywords));
    
// split there
    
$splitter preg_split($regexpimplode("\r\n"$file));
    
// remove trailing semicolon or whitespaces
    
$splitter array_map(create_function('$line',
                                          
'return preg_replace("/[\s;]*$/s", "", $line);'),
                          
$splitter);
    
// remove empty lines
    
return array_filter($splittercreate_function('$line''return !empty($line);'));
}
?>
Zergling-new ist offline  
Alt 30.07.2007, 22:02  
Erfahrener Benutzer
 
Registriert seit: 11.01.2005
Beiträge: 106
MerlinderZauberer ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo Zergling,

danke für Deinen Code.

Ich habe ihn nicht ausprobiert, da ich zwischenzeitlich meine Klasse etwas anders gestaltet habe.

Ich habe mich dazu entschlossen, jedes Query mit nur einem Befehl zu bestücken. Das ergibt für mich eine sinnvolle Fehleranalyse.
Desweiteren werden alle folgenden Querys bei Fehlschlägen soweit Möglich ausgeführt.

Die Klasse von mir funktioniert gut. Für 1300000 (Millionen!) Querys inklusive auslesen aus den Tabellen braucht mein Script 30 Minuten.

Merlin der Zauberer
__________________
www.Sternenwelt.net - Astronomie im Internet -
www.SternenweltForum.net - Antworten rund um die Astronomie -
MerlinderZauberer ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
importieren von csv datei in mysql tabelle Datenbanken 3 02.06.2009 23:45
SQL Datei mit PHP importieren?! Nightuser PHP Tipps 2008 13 01.02.2009 01:51
[Erledigt] Hochgeladene Datei wird doppelt abgelegt thecracked PHP Tipps 2008 3 01.07.2008 16:31
Datei per Buttonklick runterladen... go1denboy PHP Tipps 2008 7 14.06.2008 20:25
Großer Baum -> Große Datei -> Hohe Ladezeit :( PsychoEagle PHP Tipps 2008 7 22.09.2007 12:44
XML Datei in Datenbank importieren Plague PHP Tipps 2007 13 06.08.2007 10:26
CSV Datei in MySQL importieren phpler1609 PHP Tipps 2006 6 23.03.2006 14:48
Datei durchsuchen Wöllchen Beitragsarchiv 3 02.03.2006 22:23
Datei importieren Mano PHP Tipps 2005-2 3 16.10.2005 15:14
Datei auf FTP-Server ändern ohne lokal abzuspeichern faux PHP-Fortgeschrittene 11 02.09.2005 11:54
Ordner Struktur auslesen bestimmte datei finden .... silverghost PHP Tipps 2005 3 24.05.2005 13:55
[Erledigt] CSV Datei in MySQL importieren Datenbanken 3 04.04.2005 09:11
php und ftp PHP Tipps 2004 4 07.10.2004 09:58
Datei als hochgeladene Datei in $_FILES-Array abrufen PHP Tipps 2004 1 19.09.2004 03:49
[Erledigt] Kann SQL Datei über phpMyAdmin nicht importieren Datenbanken 1 11.08.2004 09:53

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
getqueriesfromfile, http://www.php.de/php-einsteiger/44462-importieren-einer-sql-datei.html, csv demeliter

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:46 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.