Princip KISS :stačí použít phpMyAdmin? Je téměř jistě nainstalován. Pokud tomu tak není, nainstalujte jej .
Jeho importní schopnost je úžasná. Pokud je vaše databáze náhodou příliš velká, zazipujte ji. Pokud je stále příliš velký, zkuste ho rozdělit na několik kusů. Pochybuji, že to musíte převést jako jednu velkou transakci. Vy?
Po vysvětlení v prvním komentáři, no, jde to. Toto je můj velmi zjednodušený skript, který dělá, co chcete. Až na to, že se nedívá na oddělovače:jeden dotaz ==jeden řádek.
<link href="style/contents.css"/>
<?
function timesanitize($v) {
if ($v > 0)
return round($v, 4);
else
return 0;
}
$startmt = microtime();
include_once 'include/db.php';
$f = fopen("db.sql","r");
echo dbGetEngine() . "<br>";
echo "<ul>";
do {
$l = rtrim(fgets($f));
if (strlen($l) == 0)
continue;
if (substr($l, 0, 1) == '#')
continue;
$l = str_replace(
array("\\n"),
array("\n"),
$l);
if (dbGetEngine() == "pgsql")
$l = str_replace(
array("IF NOT EXISTS", "LONGBLOB"),
array("", "TEXT"),
$l);
try {
echo "<li>".nl2br(htmlspecialchars($l));
$mt = microtime();
$db->query($l);
echo "<ul><li>ok - " . timesanitize(microtime() - $mt) . "</ul>";
} catch (PDOException $e) {
echo "<ul><li>".$e->getMessage() . "</ul>";
}
} while (!feof($f));
fclose($f);
echo 'total: ' . timesanitize(microtime() - $startmt);
?>
Výstupem je také malá statistika o tom, jak dlouho každý dotaz trval. Je založen na PDO; Věřím, že PDO bylo zavedeno v PHP5.1 nebo PHP5.2. Myslím, že by mělo být triviální upravit jej tak, aby fungoval přímo s mysql_*()
funkce, pokud to z nějakého důvodu preferujete.
A ještě jednou:ano, vím, že je to na hovno. Ale pokud to funguje pro mě (tm), a možná i pro vás... :-)
Pro dokončení kódu zde jsou include/db.php
a ukázkový include/config.php
:
include/db.php
:
<?
include_once 'include/config.php';
try {
$attribs =
array(
PDO::ATTR_PERSISTENT => $config['db']['persistent'],
PDO::ATTR_ERRMODE => $config['db']['errormode']
);
$db = new PDO(
$config['db']['uri'],
$config['db']['user'],
$config['db']['pass'],
$attribs
);
$db->query("SET NAMES 'utf8'");
$db->query("SET CHARACTER SET 'utf8'");
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
function dbGetEngine() {
global $config;
return substr($config['db']['uri'], 0, strpos($config['db']['uri'], ':'));
}
?>
include/config.php
:
<?
//$config['db']['uri'] = 'sqlite:' . realpath('.') . '/site.db'; // PDO's database access URI
$config['db']['uri'] = 'mysql:host=localhost;dbname=sitedb'; // server should be : 195.78.32.7
//$config['db']['uri'] = 'pgsql:host=localhost;dbname=sitedb';
$config['db']['user'] = 'user_goes_here'; // database username
$config['db']['pass'] = 'pass_goes_here'; // database password
$config['db']['persistent'] = false; // should the connection be persistent
$config['db']['errormode'] = PDO::ERRMODE_EXCEPTION; // PDO's error mode
?>
Zahrnuty jsou vzorové připojovací řetězce pro SQLite, MySQL a PostgreSQL.