Wczytywanie pliku *.sql do bazy danych
Popularnym sposobem na tworzenie "zrzutów" baz danych, jest zapisywanie poleceń języka SQL w postaci pliku *.sql (takią opcję umożliwia m.in. PHPMyAdmin). W tym artykule zaprezentujemy w jaki sposób odczytać zawartość takiego pliku (należy wysłać go na serwer), a następnie wysłać odpowiednie polecenia do bazy danych.
Formularz HTML będzie wyglądał następująco:
Teraz podstawowe uploadowanie. Będziemy zapisywać plik w katalogu tmp. Utwórz go w tym samym katalogu, co skrypt. Fragment kodu odpowiedzialny za wysłanie pliku:
Teraz odczytamy ten plik, podzielimy go na pojedyncze zapytania i je wykonamy:
I to jest cały kod naszego programiku - wystarczy utworzyć plik sql_read.php (+katalog tmp):
Formularz HTML będzie wyglądał następująco:
<form action="sql_read.php" method="post" enctype="multipart/form-data">
<input type="file" name="sqlfile">
<br><hr>Dane bazy danych:<br>
Host bazy danych: <input type="text" name="host"><br>
Login bazy danych: <input type="text" name="login"><br>
Hasło bazy danych: <input type="password" name="passwd"><br>
Nazwa bazy danych: <input type="text" name="bazaname"><br>
<input type="submit" name="send" value="Wyślij plik">
</form>
<input type="file" name="sqlfile">
<br><hr>Dane bazy danych:<br>
Host bazy danych: <input type="text" name="host"><br>
Login bazy danych: <input type="text" name="login"><br>
Hasło bazy danych: <input type="password" name="passwd"><br>
Nazwa bazy danych: <input type="text" name="bazaname"><br>
<input type="submit" name="send" value="Wyślij plik">
</form>
Teraz podstawowe uploadowanie. Będziemy zapisywać plik w katalogu tmp. Utwórz go w tym samym katalogu, co skrypt. Fragment kodu odpowiedzialny za wysłanie pliku:
$sqlfile = $HTTP_POST_FILES['sqlfile']; //uchwyt pobranego pliku przekazujem do krótszej zmiennej
if(isset($send)) { //wysłano dane formularzem
if(is_uploaded_file($sqlfile['tmp_name'])) { //jeśli plik jest gdzieś na serwerze
if(move_uploaded_file($userfile['tmp_name'],'tmp/sql.sql'))
echo '<p>Plik został zapisany na serwerze</p>';
}
}
if(isset($send)) { //wysłano dane formularzem
if(is_uploaded_file($sqlfile['tmp_name'])) { //jeśli plik jest gdzieś na serwerze
if(move_uploaded_file($userfile['tmp_name'],'tmp/sql.sql'))
echo '<p>Plik został zapisany na serwerze</p>';
}
}
Teraz odczytamy ten plik, podzielimy go na pojedyncze zapytania i je wykonamy:
if (file_exists('tmp/sql.sql'))
{
$sql = file('tmp/sql.sql'); // wczytaj plik do tablicy (jedna linia = jeden element tablicy)
for ($i=0; $i<count($sql_file); $i++)
{
if ($sql[$i][0] != "#")//linia nie jest komentarzem
{
$sql_cmd .= $sql[$i];
}
}
//znakiem ';' okreslającym koniec polecenia SQL rozdzielamy wszystkie zapytania
$sql_cmd = split(';', $sql_cmd);
$j = 1; // ilosc zapytan
//lączymy się z bazą
mysql_connect($host,$login,$passwd);
mysql_select_db($bazaname);
for ($i=0; $i<count($sql_cmd) -1; $i++)
{
if (!mysql_query($sql_cmd[$i]))
{
echo 'Zapytanie nr <b>' . $j . '</b>: błąd. MySQL zwraca:' . mysql_error() . '...<br>';
$iserror=true;
}
++$j;
}
if ($iserror) echo "BŁĄD WPROWADZANIA DANYCH DO MYSQL - URUCHOM INSTALACJĘ PONOWNIE";
if (!$iserror) echo '<h3>Operacja instalowania tabel w bazie danych zakończona sukcesem!</H3>';
} else print "<h3>Bł?d - brak pliku ze zrzutem bazy danych!!! (sql.sql)</H3>";
{
$sql = file('tmp/sql.sql'); // wczytaj plik do tablicy (jedna linia = jeden element tablicy)
for ($i=0; $i<count($sql_file); $i++)
{
if ($sql[$i][0] != "#")//linia nie jest komentarzem
{
$sql_cmd .= $sql[$i];
}
}
//znakiem ';' okreslającym koniec polecenia SQL rozdzielamy wszystkie zapytania
$sql_cmd = split(';', $sql_cmd);
$j = 1; // ilosc zapytan
//lączymy się z bazą
mysql_connect($host,$login,$passwd);
mysql_select_db($bazaname);
for ($i=0; $i<count($sql_cmd) -1; $i++)
{
if (!mysql_query($sql_cmd[$i]))
{
echo 'Zapytanie nr <b>' . $j . '</b>: błąd. MySQL zwraca:' . mysql_error() . '...<br>';
$iserror=true;
}
++$j;
}
if ($iserror) echo "BŁĄD WPROWADZANIA DANYCH DO MYSQL - URUCHOM INSTALACJĘ PONOWNIE";
if (!$iserror) echo '<h3>Operacja instalowania tabel w bazie danych zakończona sukcesem!</H3>';
} else print "<h3>Bł?d - brak pliku ze zrzutem bazy danych!!! (sql.sql)</H3>";
I to jest cały kod naszego programiku - wystarczy utworzyć plik sql_read.php (+katalog tmp):
<?php
// SQL FILE READER v .1.0
// *** WRITTEN by Vegat
// www.vxcprogramming.prv.pl
$sqlfile = $HTTP_POST_FILES['sqlfile']; //uchwyt pobranego pliku przekazujem do krótszej zmiennej
if(isset($send)) { //wysłano dane formularzem
if(is_uploaded_file($sqlfile['tmp_name'])) { //jeśli plik jest gdzieś na serwerze
if(move_uploaded_file($sqlfile['tmp_name'],'tmp/sql.sql'))
echo 'Plik został zapisany na serwerze';
} else echo(' Błąd uploadu');
if (file_exists('tmp/sql.sql'))
{
$sql = file('tmp/sql.sql'); // wczytaj plik do tablicy (jedna linia = jeden element tablicy)
for ($i=0; $i<count($sql_file); $i++)
{
if ($sql[$i][0] != "#")//linia nie jest komentarzem
{
$sql_cmd .= $sql[$i];
}
}
//znakiem ';' okreslającym koniec polecenia SQL rozdzielamy wszystkie zapytania
$sql_cmd = split(';', $sql_cmd);
$j = 1; // ilosc zapytan
//lączymy się z bazą
mysql_connect($host,$login,$passwd);
mysql_select_db($bazaname);
for ($i=0; $i<count($sql_cmd) -1; $i++)
{
if (!mysql_query($sql_cmd[$i]))
{
echo 'Zapytanie nr <b>' . $j . '</b>: błąd. MySQL zwraca:' . mysql_error() . '...<br>';
$iserror=true;
}
++$j;
}
if ($iserror) echo "BŁĄD WPROWADZANIA DANYCH DO MYSQL - URUCHOM INSTALACJĘ PONOWNIE";
if (!$iserror) echo '<h3>Operacja instalowania tabel w bazie danych zakończona sukcesem!</H3>';
} else print "<h3>Bł?d - brak pliku ze zrzutem bazy danych!!! (sql.sql)</H3>";
}
?>
<form action="sql_read.php" method="post" enctype="multipart/form-data">
<input type="file" name="sqlfile">
<br><hr>Dane bazy danych:<br>
Host bazy danych: <input type="text" name="host"><br>
Login bazy danych: <input type="text" name="login"><br>
Hasło bazy danych: <input type="password" name="passwd"><br>
Nazwa bazy danych: <input type="text" name="bazaname"><br>
<input type="submit" name="send" value="Wyślij plik">
</form>
// SQL FILE READER v .1.0
// *** WRITTEN by Vegat
// www.vxcprogramming.prv.pl
$sqlfile = $HTTP_POST_FILES['sqlfile']; //uchwyt pobranego pliku przekazujem do krótszej zmiennej
if(isset($send)) { //wysłano dane formularzem
if(is_uploaded_file($sqlfile['tmp_name'])) { //jeśli plik jest gdzieś na serwerze
if(move_uploaded_file($sqlfile['tmp_name'],'tmp/sql.sql'))
echo 'Plik został zapisany na serwerze';
} else echo(' Błąd uploadu');
if (file_exists('tmp/sql.sql'))
{
$sql = file('tmp/sql.sql'); // wczytaj plik do tablicy (jedna linia = jeden element tablicy)
for ($i=0; $i<count($sql_file); $i++)
{
if ($sql[$i][0] != "#")//linia nie jest komentarzem
{
$sql_cmd .= $sql[$i];
}
}
//znakiem ';' okreslającym koniec polecenia SQL rozdzielamy wszystkie zapytania
$sql_cmd = split(';', $sql_cmd);
$j = 1; // ilosc zapytan
//lączymy się z bazą
mysql_connect($host,$login,$passwd);
mysql_select_db($bazaname);
for ($i=0; $i<count($sql_cmd) -1; $i++)
{
if (!mysql_query($sql_cmd[$i]))
{
echo 'Zapytanie nr <b>' . $j . '</b>: błąd. MySQL zwraca:' . mysql_error() . '...<br>';
$iserror=true;
}
++$j;
}
if ($iserror) echo "BŁĄD WPROWADZANIA DANYCH DO MYSQL - URUCHOM INSTALACJĘ PONOWNIE";
if (!$iserror) echo '<h3>Operacja instalowania tabel w bazie danych zakończona sukcesem!</H3>';
} else print "<h3>Bł?d - brak pliku ze zrzutem bazy danych!!! (sql.sql)</H3>";
}
?>
<form action="sql_read.php" method="post" enctype="multipart/form-data">
<input type="file" name="sqlfile">
<br><hr>Dane bazy danych:<br>
Host bazy danych: <input type="text" name="host"><br>
Login bazy danych: <input type="text" name="login"><br>
Hasło bazy danych: <input type="password" name="passwd"><br>
Nazwa bazy danych: <input type="text" name="bazaname"><br>
<input type="submit" name="send" value="Wyślij plik">
</form>
vegat dnia 29-12-2004 11:17
nie wiem. Zawsze wstawiałem <php> i </php> może chodzi o znacznik <? ??
Ktos dnia 28-12-2004 21:00
dlaczego część jest pokolorowana a część nie?


