Newsgroup: it.comp.www.php
Titolo: [mysql] - Esecuzione di query per il ripristino di un DB

Buongiorno.
Nel pannello di amministrazione di un software gestionale ho creato un
tool per la gestione dei backup. Permette di creare backup, visualizzare
tutti i file di backup presenti (con relative proprietą), eliminare
backup inutili e 'dovrebbe permettere' anche di ripristinare i backup.
Il codice che non funziona č proprio questo:
if ($action == "restore")
{	$backup = $_GET['backup'];
	$query = "source " . BACKUP_DIR . $backup;
	if (mysql_query ($query, $db) != FALSE)
		print ("Ripristino del database effettuato.");
	else
		print ("<b>" . mysql_errno() . ":</b><br>" . mysql_error() .
"<br><br>" . $query);
}
Inutile dire che, aprendo il mysql monitor e facendo un copia/incolla
della query incriminata, essa funziona... :(
Qualcuno sa quale potrebbe essere la causa?
Grazie per le eventuali risposte,
-- 
dorje
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Qualcuno sa quale potrebbe essere la causa?
Dovresti prima spiegarci l'errore SQL che viene fuori.
-- 
* Immolo - Motore di ricerca immobiliare
* web: 
http://www.immolo.it

 
La query ha il punto e virgola finale come da sintassi ? :-)
"source c:/blablabla/dump.sql;"
ciao!


forse ho detto una baggianata :-P 

 Dovresti prima spiegarci l'errore SQL che viene fuori.
Oooops... ;)
1064:
You have an error in your SQL syntax. Check the manual that corresponds
to your MySQL server version for the right syntax to use near 'source
/home/dorje/public_html/work/medical/admin/backups/2005


 forse ho detto una baggianata :-P
Tranquillo, ogni tanto qualche baggianata la dicono tutti... ;)


 /home/dorje/public_html/work/medical/admin/backups/2005
Ho il forte sospetto che il comando "source" non faccia parte del linguaggio 
SQL
di MySQL, ecco perchè non puoi eseguire una query dal genere !
Evidentemente quel "source" sarà un comando specifico di  MySQL Monitor.
Ciao.


 Monitor.
Accidenti...
Qualcuno ha qualche idea su come posso ripristinare un database
da un file SQL con uno script php? Voglio dire... Senza dover
farmi il parsing di tutto lo script ed eseguire le query riga
per riga... :(


 	$query = "source " . BACKUP_DIR . $backup;
questa non va.
la query che devi eseguire è dentro al file dump.
Anzi il file contiene una serie di query separate da punto e virgola, 
quindi puoi anche considerarlo come una query sola.

 quindi puoi anche considerarlo come una query sola.
Ok.
Ho provato cosě:
if ($action == "restore")
{	$backup = $_GET['backup'];
	$query = implode ('', file (BACKUP_DIR . $backup));
		if (mysql_query ($query, $db) != FALSE)
		    print ("Ripristino del database effettuato.");
		else
		    print ("<b>" . mysql_errno() . ":</b><br>" . mysql_error() .
"<br><br>" . $query);
}
Ma l'esecuzione mi da l'errore:
1064:
You have an error in your SQL syntax. Check the manual that corresponds
to your MySQL server version for the right syntax to use near '; create
table elenco ( id_elenco int(10) unsigned not null a
Ho come l'impressione che un'unica query con tanti ';' non vada giů
a mysql_query()...


 a mysql_query()...
In effetti ho letto un su google perchè l'argomento mi interessava e 
pare che sia proprio come dici.
Qualcuno può confermare o smentire?
Quindi di fatto anche i problemi di SQL injection dove si passa una 
seconda query usando mysql non sono possibili, dico bene?
Comunque non ti rimane che fare il parse del dump riga per riga.

 Comunque non ti rimane che fare il parse del dump riga per riga.
E' che sono un po' pigro... ;)
Ho risolto in un modo forse utile a qualcuno:
la procedura che crea il dump è una procedura che genera il
file sql facendo le dovute query (partendo da 'show tables'),
memorizzando l'output in un array e proseguendo quindi ad interrogare
tutti i record. Il file viene quindi creato aggiungendo gli opportuni
comandi drop, create e insert con il contenuto dell'array.
A questo punto ho aggiunto al ';' di fine comando una semplice sequenza
(nel
mio caso ';#end#'), in modo da poter esplodere il tutto in un array
di query ed eseguirle una alla volta (eliminando ambiguità dovute alla
presenza di ';' nei cami di testo del db):
if ($action == "restore")
{	$backup = $_GET['backup'];
	$file = explode (';#end#', implode ('', file (BACKUP_DIR . $backup)));
	$err = 0;
	while ( list(,$query) = each ($file))
		if (mysql_query ($query, $db) == FALSE && $query != "\n")
			print ($err++ . ": <b>" . mysql_errno() . ":</b><br>" . mysql_error()
. "<br><br>" . $query . "<br>");
	if ($err > 0)
		print ("Sono stati rilevati " . $err . " errori.");
	else
		print ("Ripristino eseguito senza errori.");
}
Secono voi va bene così o possono esserci situazioni ambigue?


 dorje
;-)


www.danilobottone.com
 (.it)
Meglio stare zitti dando l'impressione di essere stupido, che parlare
togliendo ogni dubbio. (Confucio) 

 anche usare il comando file (se non ricordo male).
Infatti ho usato proprio file ... (o forse non ho capito io cosa
intendi).
