Jeder Entwickler kennt das Problem:
Daten müssen in die Datenbank. Standardmäßig nimmt man dafür den phpMyadmin.

Gerade bei großen Dateien kann dies die Serverlimits jedoch schnell sprengen.
Eine zu große Filegröße oder zu lange Skriptlaufzeit verursachen Probleme oder lassen euch euer Skript nicht hochladen.

Hier möchte ich euch eine einfache und schnelle Alternative zeigen, mit der ihr auch große SQL Importe sicher und einfach mit PHP erledigen könnt.

Das Skript zeigt euch neben dem aktuellen Fortschritt ganz nebenbei auch Importfehler an.

Schritt 1: Ladet die sql Datei auf euren Server – zum Beispiel per FTP.

Schritt 2: erstellt eine Datei namens import.php
In dieser Datei speichert ihr das folgende Skript und ladet das Ganze auf den Server in das gleiche Verzeichnis wie eure SQL Datei.

Die maximale Laufzeit des Importskripts könnt ihr ebenfalls anpassen. Mit dem aktuellen Wert haben wir jedoch bereits gute Erfahrung

<?php

// Configuration- change here!
$filename = 'import.sql'; // Your Import File
$dbHost = 'localhost'; // DB HOST
$dbUser = 'euerDBUser'; // DB USER
$dbPass = 'euerDBPasswort'; //DB PASSWORD
$dbName = 'eureDB'; // DB NAME
$maxRuntime = 8; // less then your max script execution limit
// END Configuration!

// Be sure to load utf-8
header('Content-Type: text/html; charset=UTF-8');
$deadline = time()+$maxRuntime;
$progressFilename = $filename.'_filepointer'; // tmp file for progress
$errorFilename = $filename.'_error'; // tmp file for erro

$mysqli = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
// Check connection
if ($mysqli -> connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
if (!mysqli_set_charset($mysqli, "utf8")) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
exit();
}

($fp = fopen($filename, 'r')) OR die('failed to open file:'.$filename);

// check for previous errors
if( file_exists($errorFilename) ){
die('<pre> Previous error: '.file_get_contents($errorFilename));
}

// automatic reload in browser
echo '<html><head> <meta http-equiv="refresh" content="'.($maxRuntime+2).'"><pre>';

// load previous file position
$filePosition = 0;
if( file_exists($progressFilename) ){
$filePosition = file_get_contents($progressFilename);
fseek($fp, $filePosition);
}
$queryCount = 0;
$query = '';
while( $deadline>time() AND ( $line=fgets($fp, 1024000) ) ){
if(substr($line,0,2)=='--' OR trim($line)=='' ){
continue;
}

$query.= $line;

if( substr(trim($query),-1)==';' ){
if(!$result = $mysqli->query($query) ){
$error = 'Error performing query \'<strong>' . $query . '\': ' . $mysqli->error();
file_put_contents($errorFilename, $error."\n");
exit;
}
$query = '';
file_put_contents($progressFilename, ftell($fp)); // save current file position
$queryCount++;
}
}

if( feof($fp) ){
echo 'SQL dump successfully restored!';
}else{
echo ftell($fp).'/'.filesize($filename).' '.(round(ftell($fp)/filesize($filename), 2)*100).'%'."\n";
echo $queryCount.' queries processed! Please reload or wait for automatic browser refresh!';
}

 

Jetzt müsst ihr nur noch im Skript eure Settings anpassen und das Skript ausführen – viel Erfolg