dostępność funkcji exec na hostingu, kopia bazy danych z poziomu strony

0

witam!

nie jestem specjalistą od PHP a muszę w tym języku zrobić parę pierdół na zaliczenie przedmiotu... nawet udało mi się już to zrobić ale.... od początku:

zadanie było następujące: dostaliśmy serwis www napisany w PHP umożliwiający podstawowe księgowanie i wystawianie faktur. naszym zadaniem było zrobić taką funkcjonalność jak:

  • zapisać tabelę bazy danych z fakturami do pliku (jej kopię)
  • wyczyścić tabelę z wpisów
  • umożliwić ponowne wrzucenie kopii tabeli na serwer

trochę pogooglowałem i udało mi się to zrobić, problem pojawił się kiedy prowadzący stwierdził, że moje zmiany mają znaleźć się na jego serwerze. a jego serwer to darmowy hosting z cba... i tutaj zaczynają się cyrki, gdyż do zrobienia kopii bazy danych użyłem polecenia mysqldump które wywołałem za pomocą funkcji exec - na cba funkcja taka jest zablokowana i tutaj pierwsze pytanie:

  • jak zrobić w prosty sposób kopię jednej tabeli z bazy danych nie używająć mysqldump?
    idąc dalej - polecenia exec używam również do wrzucenia kopii bazy na serwer - jak wrzucić plik na serwer bez polecenia exec?
    nie widzi mi się pisanie funkcji która kopiowałaby tabelę wiersz po wierszu - ktoś ma jakieś sugestie w jaki sposób najlepiej rozwiązać ten problem? będę wdzięczny za wszelkie sugestie
1

Czy tabela z fakturami w bazie jest tylko jedna? W sumie nawet jeśli jest kilka - to możesz w php'ie - pobrać wszystkie dane z tabel i zapisać wyniki do pliku np csv. Wyczyścić bazę, a potem przywracać te dane z pliku. Nie potrzeba Ci chyba robić całego mysqldumpa. Kopiowanie tabeli wiersz po wierszu? Możesz przecież porcjować te dane i zapisywać do pliku np po 500 rekordów.

0

Najłatwiej wygooglowac php backup mysql

0
axelbest napisał(a):

Czy tabela z fakturami w bazie jest tylko jedna? W sumie nawet jeśli jest kilka - to możesz w php'ie - pobrać wszystkie dane z tabel i zapisać wyniki do pliku np csv. Wyczyścić bazę, a potem przywracać te dane z pliku. Nie potrzeba Ci chyba robić całego mysqldumpa. Kopiowanie tabeli wiersz po wierszu? Możesz przecież porcjować te dane i zapisywać do pliku np po 500 rekordów.

dane są tylko w jednej tabeli, za pomocą mysqldump pobieram tylko tą tabelę i nie ma problemu - nie potrzebna mi cała baza.

rozwiązanie które zastosowałem działa w jednej linijce, kopiowanie tabel będzie wymagało napisania trochę większego kawałka kodu a tego chciałbym sobie oszczędzić.

wieczorem wrzucę fragment kodu żeby pokazać o co dokładnie chodzi bo teraz nie siedzę przed swoim komputerem

mimo wszystko dzięki za zainteresowanie i odpowiedź

0

W internecie są gotowce. Jak Ty sobie dajesz radę na tych studiach?:D

0
Desu napisał(a):

W internecie są gotowce. Jak Ty sobie dajesz radę na tych studiach?:D

jakoś tam daje, nic się nie martw.

wracając do kodu mam coś takiego:

function zrob_kopie_bazy(){
	echo "robie kopie bazy";
	$zapytanie_kopia = "mysqldump --opt -h HOST -u USER -pPASS DBNAME TABLENAME > faktura.sql";
	exec($zapytanie_kopia,$output,$return_val);
	echo '<br><br><a href="faktura.sql" download>Pobierz baze danych</a>';
}

function czysc_baze(){
	echo "czyszcze faktury";
	mysql_query("mysql -h HOST -u USER  -pPASS;");
	mysql_query("USE DBNAME;");
	mysql_query("TRUNCATE TABLENAME;");

function wrzucam_na_serwer(){
	echo 'jestem w funkcji wrzucam_na_serwer';
	$plik_tmp = $_FILES['plik']['tmp_name']; 
	$plik_nazwa = $_FILES['plik']['name']; 
	$plik_rozmiar = $_FILES['plik']['size']; 

	if(is_uploaded_file($plik_tmp)) { 
		 move_uploaded_file($plik_tmp, "upload/$plik_nazwa"); 
		echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze 
		<strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!"; 
	}
	$zapytanie_wgraj = "mysql -h HOST -u USER  -pPASS DBNAME < upload/$plik_nazwa";
	$odpowiedz_kopia = mysql_query($zapytanie_kopia);
	exec($zapytanie_wgraj,$output,$return_val);
	echo "$odpowiedz_kopia";
}

powyższe funkcje robią mi praktycznie całą robotę - teraz pytanie jak poradzić sobie bez funkcji exec :/

1

Łooooo Panie......babcia.jpg

nie korzystaj z funkcji mysql_query - czytałeś chociaż dokumentację do tego? czy po prostu wziąłeś pierwszy lepszy wynik z google nie patrząc na datę utworzenia zawartości tegoż linka? WIesz jak pobrać dane z tabeli? Jeśli tak to to zrób, a następnie poszukaj informacji jak zapisać wyniki zapytania do pliku (plik niech zawiera odpowiednio spreparowaną instrukcję INSERT do każdego rekordu). Potem ten plik otworzysz i wykonasz zapytania w nim zawarte.

Nie myśl że jestem jakiś złośliwy czy coś - no ale jako prowadzący zajęcia (nawet w liceum) nie zaliczyłbym tego programu (kodu który wkleiłeś).

0
axelbest napisał(a):

nie korzystaj z funkcji mysql_query - czytałeś chociaż dokumentację do tego? czy po prostu wziąłeś pierwszy lepszy wynik z google nie patrząc na datę utworzenia zawartości tegoż linka? WIesz jak pobrać dane z tabeli? Jeśli tak to to zrób, a następnie poszukaj informacji jak zapisać wyniki zapytania do pliku (plik niech zawiera odpowiednio spreparowaną instrukcję INSERT do każdego rekordu). Potem ten plik otworzysz i wykonasz zapytania w nim zawarte.

Nie myśl że jestem jakiś złośliwy czy coś - no ale jako prowadzący zajęcia (nawet w liceum) nie zaliczyłbym tego programu (kodu który wkleiłeś).

haha, to się dowiedziałem :)

jak pisałem z PHP do czynienia nie miałem więc kod wygląda jak wygląda, druga sprawa, że działa i robi to co chce - tylko że nie na cba :/

wiem jak pobrać dane z tabeli do zmiennej, później wartość zmiennej jakoś do pliku i jest powiadasz... spróbuję, tylko jedna rzecz mnie zastanawia: jak robię kopię poleceniem mysqldump od razu mam gotowy plik w takim formacie, że mogę to później bez problemu wczytać z powrotem - czy jeśli zapiszę do pliku całe zapytanie w jaki sposób będę mógł ją później wgrać na serwer? w taki sam sposób - rekord po rekordzie w pętli? i w jaki sposób wyczyścić tabelę bez używania mysql_query???

1

Ok,
no to po kolei:

  1. Funkcje mysql_* są deprecated więc jeśli już to używaj mysqli_* Najlepiej gdybyś użył PDO
  2. Jak zapiszesz dane z bazy w takim formacie (ofc w pętli)
$singleInsertRow = sprintf('INSERT INTO $tableName VALUES(%1$s, %2$s, "%3$s");', $dbRow['id'], $dbRow['category_id'], $dbRow['description']);

i wrzucisz to do pliku z rozszerzeniem sql - to będziesz mógł je potem ładnie zaimportować np w mysql workbenchu.
3. Potem otwierasz ten plik w phpie i jego treść dajesz to mysqli_query i tyle. Nie musisz nawet nic w pętli robić.

Odnośnie używania funkcji exec się nie wypowiem - bo nie przypominam sobie nawet kiedy ostatni raz jej używałem. Skoro prowadzący ma to mieć na CBA i nie możesz używać exec - to znaczy że musisz obrać inną ściężkę rozumowania - ja polecam tą przedstawioną przeze mnie.

Dlaczego chcesz czyścić tabelę inaczej niż poprzez usunięcie wszystkich rekordów za pomocą funkcji z php'a? Chciałbym się dowiedzieć co Cie powstrzymuje? Pamiętaj że w przyszłości, pracując w zawodzie możesz nawet nigdy nie dostać dostępu do serwera bazodanowego(mała szansa na to w januszSofcie, większa szansa w corpo i większych firmach), no chyba że chcesz zostać specem od baz.... :)

Ps. nie trzeba było cytować całego posta :) babcia tego nie wytrzyma :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1