Hallo,
kleines Skript, noch nicht im Einsatz aber mit einigen Test-Dateien erprobt:
Ermittelt die in einer SQL-Datei gespeicherten Queries und gibt diese als Array wieder. Die Trennung erfolgt über das Semikolon mit einer zusätzlichen Bedingung, dass darauf ein SQL-Schlagwort folgen muss. Kommentare werden vorher entfernt.
Da die Liste der Treffer mehrfach durchlaufen wird, kann es bei größeren Dateien zu Performance-Problemen kommen. In diesem Fall sollte jedoch so oder so ein Hoster verwendet werden, der den Zugang zur PHP-Funktion exec() freigibt, um die Datei direkt über die Konsole mittels MySQL zu importieren (welches extreme Geschwindigkeitsvorteile bringt).
Hier das Skript:
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($file),
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($regexp, implode("\r\n", $file));
// remove trailing semicolon or whitespaces
$splitter = array_map(create_function('$line',
'return preg_replace("/[\s;]*$/", "", $line);'),
$splitter);
// remove empty lines
return array_filter($splitter, create_function('$line', 'return !empty($line);'));
}
?>
Die Anwendung könnte dann wie folgt aussehen:
PHP-Code:
<?php
$csvfile = 'my-dump-import.sql';
if (!is_readable($csvfile)) {
die("$csvfile does not exist or is not readable");
}
$queries = getQueriesFromFile($csvfile);
for ($i = 0, $ix = count($queries); $i < $ix; ++$i) {
$sql = $queries[$i];
if (!mysql_query($sql)) {
die(sprintf("error while executing mysql query #%u: %s
\nerror: %s", $i + 1, $sql, mysql_error()));
}
}
echo "$ix queries imported";
?>
Edit: Danke robo47 noch für die Korrektur - 'import.sql' muss natürlich $file heißen

Edit 2: Danke Promaetheus für den Hinweis, dass $sql noch undefiniert war und erst mit $queries[$i] befüllt werden muss.