[MySQL][PHP] Jak za pomoc膮 skryptu PHP umie艣ci膰 w bazie kopi臋 danych utworzon膮 wcze艣niej przez mysqldump?
Chcesz odtworzy膰 zawarto艣膰 bazy danych, ale na docelowym serwerze nie mo偶esz skorzysta膰 z programu mysqldump, dlatego chcesz wykorzysta膰 skrypt PHP do tego celu.
Cz臋sto jest tak, 偶e mo偶esz wykona膰 kopi臋 bazy danych do pliku za pomoc膮 programu mysqldump np. na swoim serwerze lokalnym (co opisuj臋 w osobnej poradzie - link na ko艅cu), natomiast nie zawsze masz dost臋p do tego programu na serwerze docelowym, np. u klienta.
Sam bardzo cz臋sto wykonuj臋 projekty baz danych lokalnie, w Windowsie, natomiast gdy baza danych zostanie zape艂niona rekordami, nale偶y j膮 przenie艣膰 na serwer klienta. Nie zawsze ma on uprawnienia administratora i nie mo偶na skorzysta膰 z programu mysqldump, aby odtworzy膰 struktur臋 i zawarto艣膰 bazy danych u niego.
W takim wypadku pozostaje albo r臋czne przepisywanie bazy danych albo zaimportowanie przez odpowiedni skrypt PHP pliku, kt贸ry powsta艂 z mysqldump, a kt贸ry sam pobierze wszystkie tabele oraz rekordy i odtworzy ich struktur臋 w bazie, identycznie, jak zrobi艂by to mysqldump. Napiszmy oczywi艣cie prosty i skuteczny skrypt.
Zanim napiszemy skrypt, wyeksportujmy sobie do pliku baza.sql zawarto艣膰 przyk艂adowej bazy o nazwie baza1:
mysqldump --all -u user -ppassword baza1 >baza.sql
w wyniku tego polecenia otrzymasz plik tekstowy wygl膮daj膮cy mniej wi臋cej tak:
-- MySQL dump 9.07
--
-- Host: localhost Database: baza1
---------------------------------------------------------
-- Server version 4.0.12-max
--
-- Table structure for table 'teksty'
--
CREATE TABLE teksty (
id int(11) NOT NULL auto_increment,
tytul char(100) default NULL,
tresc char(100) default NULL,
PRIMARY KEY (id)
) TYPE=MyISAM;
--
-- Dumping data for table 'teksty'
--
INSERT INTO teksty VALUES (1,'tytul1; reportaze','tresc1 reportaze');
INSERT INTO teksty VALUES (2,'tytul2 ;reportaze','tresc2 reportaze;');
INSERT INTO teksty VALUES (3,'tytul3 reportaze','tresc3 reporta;ze');
--
-- Table structure for table 'auta'
--
CREATE TABLE auta (
marka char(100) NOT NULL default '',
model char(100) NOT NULL default '',
rok char(100) NOT NULL default ''
) TYPE=MyISAM;
--
-- Dumping data for table 'auta'
--
INSERT INTO auta VALUES ('Ford','Escort','1996');
INSERT INTO auta VALUES ('Ford','Escort','1998');
INSERT INTO auta VALUES ('Ford','Escort','1999');
INSERT INTO auta VALUES ('Ford','Sierra','1990');
INSERT INTO auta VALUES ('Ford','Sierra','1989');
INSERT INTO auta VALUES ('Ford','Mustang','1994');
INSERT INTO auta VALUES ('Opel','Corsa','1996');
INSERT INTO auta VALUES ('Opel','Corsa','1993');
INSERT INTO auta VALUES ('Opel','Corsa','1995');
INSERT INTO auta VALUES ('Opel','Vectra','1999');
INSERT INTO auta VALUES ('Opel','Vectra','2001');
INSERT INTO auta VALUES ('Opel','Vectra','1998');
INSERT INTO auta VALUES ('Opel','Astra','1999');
INSERT INTO auta VALUES ('Fiat','Punto','2002');
INSERT INTO auta VALUES ('Fiat','Punto','2001');
INSERT INTO auta VALUES ('Fiat','Punto','2001');
INSERT INTO auta VALUES ('Fiat','Tipo','1992');
INSERT INTO auta VALUES ('Fiat','Siena','1998');
INSERT INTO auta VALUES ('Fiat','Siena','1997');
INSERT INTO auta VALUES ('Fiat','Brava','2001');
Zawiera on dane o wszystkich tabelach w bazie (auta i teksty) w bazie baza1. Opisana jest ich struktura i dane w postaci gotowych zapyta艅 SQL. Wystarczy te zapytania odczyta膰 i wykona膰 w nowej bazie, aby stworzy膰 takie same tabele i dane w tych tabelach. Oto skrypt, kt贸ry wykona to zadanie:
<?
$sql_serwer = "localhost";
$sql_user = "user";
$sql_password = "password";
$sql_baza = "baza1";
$plik = file("baza.sql");
foreach ($plik as $linia) {
if (!eregi("^--", $linia)) $sql .= trim($linia)."\n";
}
// echo $sql;
$b = mysql_connect($sql_serwer, $sql_user, $sql_password);
if ($b) {
$wynik = mysql_select_db($sql_baza,$b);
if ($wynik) {
$pytania = explode(";\n", $sql);
for ($i=0;$i<count($pytania)-1;$i++) {
if (mysql_query($pytania[$i],$b)) echo "<br><b>OK:</b> $pytania[$i]\n";
else echo "<br><b>B艂膮d:</b> $pytania[$i]\n";
}
}
mysql_close($b);
}
?>
Odczytuje on zawarto艣膰 pliku i usuwa linie z komentarzami (zaczynaj膮 si臋 od dw贸ch 艣rednik贸w, co powodowa艂yby b艂臋dy), a ca艂o艣膰 umieszcza w zmiennej $sql.
Nast臋pnie 艂膮czymy si臋 z wybran膮 baz膮 na docelowym serwerze i rozbijamy wcze艣niej pobrany plik ze struktur膮 i danymi na posta膰 tablicy z pojedynczymi poleceniami. 艁atwo mo偶na podzieli膰 ca艂y plik na fragmenty, bo polecenia oddzielone s膮 艣rednikami i przej艣ciem do nowej linii.
Pozosta艂o ju偶 tylko wykona膰 wszystkie polecenia w p臋tli for i wypisa膰 na ekran stan wykonania dla ka偶dego polecenia. Gdyby co艣 posz艂o nie tak, 艂atwo wy艂apa膰 wtedy b艂臋dy. Mo偶esz te偶 wypisywa膰 tylko b艂臋dy bez poprawnie dodanych rekord贸w