importare dati xml a mysql

luigi777

Utente Attivo
14 Feb 2008
1.073
1
38
38
Massa, Italy
Salve, sto finendo il sistema utenti del sito di un mio amico..

ora vedendo in giro ho provato fare l'export dati da mysql a xml e fin qui tutto bene..

Ora chiedevo come fare per far l'import essendo che l'utente "_user", non si trova mai cancallare dalla tabella principale degli utenti..
vi posto l'export :

PHP:
<?php
// Includo 
require_once(dirname(__FILE__) . '/../inc.php');
require_once(dirname(__FILE__) . '/admin.php');


		
		$id = (isset($_GET["id"])) ? trim ((int)$_GET["id"]): '';

		$db_id = $db->real_escape_string($id);
	
		
		$query = "SELECT * FROM utenti WHERE id='".$db_id."'";
		$result = $db->query($query) or die($db->error);
		$row = $result->fetch_assoc();
		if(empty($db_id)) {
		echo "ID non specificato";
}
elseif ($result->num_rows==0) { echo "Record non trovato"; }
else
{


$user = $row["_user"];

$tables = array("news","photo","pagine");

header('Content-type: text/xml');
header('Content-Disposition: attachment; filename='.$user.'.xml');

$text ='<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<'.$user.'>';

foreach($tables as $table){
	$result = $db->query("SELECT * FROM  `$table` WHERE _userid='".$db_id."'");
	$text .='
	<table_'.$table.'>';

	while($row = $result->fetch_array()) {
		$text .=  "
		<$table>";
			foreach($row as $key => $val){
				if (!preg_match('#^\d+$#', $key, $match)){
					$text .=  "
					<$key>$val</$key>";
				}
			}
		$text .=  "
		</$table>";
	}

	$text .= "
	</table_$table>";
}
	$text .= "</$user>";
	echo $text;
	$result->free_result(); 
	$db->close();
}
?>
ho usato questo tutorial:

http://mhseptiadi.wordpress.com/2011/05/20/export-mysql-into-xml/

ora con il solito codice come faccio fare l'imporT?

grazie mille.
 

luigi777

Utente Attivo
14 Feb 2008
1.073
1
38
38
Massa, Italy
scusate, molto ma posto anche l'output del file export xml:

questo e del codice che ho scritto sopra.

PHP:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<michele>
	<table_news>
		<news>
					<id>3</id>
					<_userid>2</_userid>
					<_catid>1</_catid>
					<titolo>Prova</titolo>
					<intro>Prova</intro>
					<testo>Prova</testo>
					<tag></tag>
					<data>2013-01-07 19:05:17</data>
					<active>1</active>
					<_update>2013-01-07 19:05:26</_update>
		</news>
		<news>
					<id>4</id>
					<_userid>2</_userid>
					<_catid>1</_catid>
					<titolo>Ciaoooooooo</titolo>
					<intro>Ciao</intro>
					<testo>Ciao</testo>
					<tag></tag>
					<data>2013-01-07 19:59:49</data>
					<active>1</active>
					<_update>2013-01-07 20:00:00</_update>
		</news>
	</table_news>
	<table_photo>
	</table_photo>
	<table_pagine>
		<pagine>
					<id>2</id>
					<_userid>2</_userid>
					<url>prova</url>
					<titolo>prova</titolo>
					<testo>[bpppppppldede
de

de
d
e
de

de
d
e
d
e
de
d
e
d
e</testo>
					<tag></tag>
					<data>2013-01-07 19:06:14</data>
					<active>1</active>
					<_update>2013-01-07 19:06:28</_update>
		</pagine>
		<pagine>
					<id>3</id>
					<_userid>2</_userid>
					<url>test</url>
					<titolo>test</titolo>
					<testo>test</testo>
					<tag></tag>
					<data>2013-01-07 20:01:02</data>
					<active>1</active>
					<_update>2013-01-07 20:01:10</_update>
		</pagine>
	</table_pagine></michele>
idee?
grazie mille.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Ho fatto delle prove e cosi l'insert è andato a buon fine vedi se ti puo essere utile

PHP:
$xml = simplexml_load_file('file_da_importare.xml');
$tables = array('news','photo','pagine');

foreach($tables as $table){
    
    $current_array = json_decode(json_encode($xml->{'table_'.$table}),true);
  
 if(isset($current_array[$table])){
     
    foreach($current_array[$table] as $insert){
        $query = "INSERT INTO ".$table." SET ";
        
        foreach($insert as $key => $value)
        if(!is_array($value))
         $query .= $db->real_escape_string($key)."='".$db->real_escape_string($value).(end($insert)==$value?'\'':'\','); 
        
        if($query!="INSERT INTO ".$table." SET ")
        $db->query($query) or die('Errore nella query: '.$query.' '.$db->error);
    }    
        
 }
}

echo 'Query inserite con successo';
 

luigi777

Utente Attivo
14 Feb 2008
1.073
1
38
38
Massa, Italy
ciao, mi da questo avviso :


Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\mc3\admin\utenti_import.php on line 18
Query inserite con successo

e non mi inserisce nulla.

lo scritto cosi:
PHP:
<?php
// Includo 
require_once(dirname(__FILE__) . '/../inc.php');
require_once(dirname(__FILE__) . '/admin.php');

$xml = simplexml_load_file('michele.xml');
$tables = array('news','photo','pagine');

foreach($tables as $table){
    
    $current_array = json_decode(json_encode($xml->{'table_'.$table}),true);
  
 if(isset($current_array[$table])){
     
    foreach($current_array[$table] as $insert){
        $query = "INSERT INTO ".$table." SET ";
        
        foreach($insert as $key => $value)
        if(!is_array($value))
         $query .= $db->real_escape_string($key)."='".$db->real_escape_string($value).(end($insert)==$value?'\'':'\','); 
        
        if($query!="INSERT INTO ".$table." SET ")
        $db->query($query) or die('Errore nella query: '.$query.' '.$db->error);
    }    
        
 }
}

echo 'Query inserite con successo'; 


?>
va bene?

grazie mille.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Usa il var_dump prima del secondo foreach e posta il risultato

PHP:
if(isset($current_array[$table])){ var_dump($current_array[$table]);
Inoltre, per caso hai modificato la struttura del file xml da quello postato prima?
 
Ultima modifica:

luigi777

Utente Attivo
14 Feb 2008
1.073
1
38
38
Massa, Italy
scusa, no non ho cambiato nulla... ma leggendo il codice che mi hai scritto forse è qua l'errore:
$query = "INSERT INTO ".$table." SET ";

ma per la insert non si usa insert table values(etc..

scusa molto.

ma ho visto un'altro problema nell'export:
che salva <id>1</id>

forse non inserisce nulla per questo .. perché le id delle varie tabelle i id sono auto increment..

dici che è questo perché non inserisce e come posso modificare l'export se è questo il problema?

grazie mille.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
La sintassi puo essere anche in stile SET nome=valore, infatti testando in locale con la copia del file xml di prima a me è andato correttamente, non credo sia quello il problema perché a me con l'export di prima è andato (cioè col file xml che hai postato), prova a fare un var_dump solo di $current_array oppure a postare eventualmente il file michele.xml da esportato
 

luigi777

Utente Attivo
14 Feb 2008
1.073
1
38
38
Massa, Italy
ciao. te lo risposto solamente che i dati di prima non ci sono perché sto faccendo le prove di cancellazione , svuotamento e esportazione
PHP:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<michele>
	<table_news>
		<news>
					<id>1</id>
					<_userid>2</_userid>
					<_catid>1</_catid>
					<titolo>Prova notizia</titolo>
					<intro>Prova notizia</intro>
					<testo>Prova notizia corpo</testo>
					<tag></tag>
					<data>2013-01-07 17:48:06</data>
					<active>1</active>
					<_update>2013-01-07 17:48:22</_update>
		</news>
	</table_news>
	<table_photo>
		<photo>
					<id>1</id>
					<_userid>2</_userid>
					<_catid>1</_catid>
					<titolo>tulipani</titolo>
					<testo>tulipani</testo>
					<url>Tulips.jpg</url>
					<tag></tag>
					<data>2013-01-07 17:49:47</data>
					<active>1</active>
					<_update>2013-01-07 17:49:57</_update>
		</photo>
	</table_photo>
	<table_pagine>
		<pagine>
					<id>1</id>
					<_userid>2</_userid>
					<url>prova</url>
					<titolo>prova</titolo>
					<testo>prova</testo>
					<tag></tag>
					<data>2013-01-07 17:48:33</data>
					<active>1</active>
					<_update>2013-01-07 17:48:43</_update>
		</pagine>
	</table_pagine></michele>
a me non inserisce nulla. non so come mai.

ti ringrazio e buona serata.
 

luigi777

Utente Attivo
14 Feb 2008
1.073
1
38
38
Massa, Italy
eccolo l'output che mi chiedevi:
Codice:
array(10) { ["id"]=> string(1) "1" ["_userid"]=> string(1) "2" ["_catid"]=> string(1) "1" ["titolo"]=> string(13) "Prova notizia" ["intro"]=> string(13) "Prova notizia" ["testo"]=> string(19) "Prova notizia corpo" ["tag"]=> array(0) { } ["data"]=> string(19) "2013-01-07 17:48:06" ["active"]=> string(1) "1" ["_update"]=> string(19) "2013-01-07 17:48:22" }
Warning: Invalid argument supplied for foreach() in D:\xampp\htdocs\mc3\admin\utenti_import.php on line 18
Query inserite con successoarray(10) { ["id"]=> string(1) "1" ["_userid"]=> string(1) "2" ["_catid"]=> string(1) "1" ["titolo"]=> string(8) "tulipani" ["testo"]=> string(8) "tulipani" ["url"]=> string(10) "Tulips.jpg" ["tag"]=> array(0) { } ["data"]=> string(19) "2013-01-07 17:49:47" ["active"]=> string(1) "1" ["_update"]=> string(19) "2013-01-07 17:49:57" } Query inserite con successoarray(9) { ["id"]=> string(1) "1" ["_userid"]=> string(1) "2" ["url"]=> string(5) "prova" ["titolo"]=> string(5) "prova" ["testo"]=> string(5) "prova" ["tag"]=> array(0) { } ["data"]=> string(19) "2013-01-07 17:48:33" ["active"]=> string(1) "1" ["_update"]=> string(19) "2013-01-07 17:48:43" } Query inserite con successo
c'è un invalid argument..
che sarebbe?
grazie mille.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Ho capito da cosa dipende il problema forse, prova cosi

PHP:
$xml = simplexml_load_file('file_da_importare.xml');
$tables = array('news','photo','pagine');

function OttieniDati($insert){
    global $db,$query;
    foreach($insert as $key => $value)
            if(!is_array($value))
             $query .= $db->real_escape_string($key)."='".$db->real_escape_string($value).(end($insert)==$value?'\'':'\','); 
}

foreach($tables as $table){
    
    $current_array = json_decode(json_encode($xml->{'table_'.$table}),true);
  
 if(isset($current_array[$table])){
     
    foreach($current_array[$table] as $insert){
        $query = "INSERT INTO ".$table." SET ";
        
        OttieniDati(is_array($insert) ? $insert : $current_array[$table]);
        
        if($query!="INSERT INTO ".$table." SET ")
        $db->query($query) or die('Errore nella query: '.$query.' '.$db->error);
    }    
        
 }
}

echo 'Query inserite con successo';
 

luigi777

Utente Attivo
14 Feb 2008
1.073
1
38
38
Massa, Italy
ora la prima notizia la inserita ma dopo dice questo:

Errore nella query: INSERT INTO news SET id='1',_userid='2',_catid='1',titolo='Prova notizia',intro='Prova notizia',testo='Prova notizia corpo',data='2013-01-07 17:48:06',active='1',_update='2013-01-07 17:48:22' Duplicate entry '1' for key 'PRIMARY'

ed come dicevo come posso fare?

grazie mille a domani e buona notte.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
ora la prima notizia la inserita ma dopo dice questo:

Errore nella query: INSERT INTO news SET id='1',_userid='2',_catid='1',titolo='Prova notizia',intro='Prova notizia',testo='Prova notizia corpo',data='2013-01-07 17:48:06',active='1',_update='2013-01-07 17:48:22' Duplicate entry '1' for key 'PRIMARY'

ed come dicevo come posso fare?

grazie mille a domani e buona notte.
L'id essendo chiave primaria non accetta valori uguali ad un record esistente (quello caricato prima) quindi ti consiglio di mettere l'id in auto_increment e non settarlo oppure di settare un id personalizzato che non sia chiave primaria, notte
 

luigi777

Utente Attivo
14 Feb 2008
1.073
1
38
38
Massa, Italy
non è il problema del database ho fatto delle prove e il problema xml e la lettura del file ..

perché ora le notizie e le pagine me le inserisce ma la foto avvendo l'id 10 della prima notizia mi dice che non può avere doppioni..

ecco il file di test:
Codice:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<michele>
	<table_news>
		<news>
					<id>11</id>
					<_userid>2</_userid>
					<_catid>1</_catid>
					<titolo>Test_02</titolo>
					<intro>Test_02</intro>
					<testo>Test_02</testo>
					<tag></tag>
					<data>2013-01-07 22:33:02</data>
					<active>1</active>
					<_update>2013-01-07 22:33:10</_update>
		</news>
		<news>
					<id>10</id>
					<_userid>2</_userid>
					<_catid>1</_catid>
					<titolo>Test_01</titolo>
					<intro>Test_01</intro>
					<testo>Test_01</testo>
					<tag></tag>
					<data>2013-01-07 22:32:33</data>
					<active>1</active>
					<_update>2013-01-07 22:32:59</_update>
		</news>
	</table_news>
	<table_photo>
		<photo>
					<id>10</id>
					<_userid>2</_userid>
					<_catid>2</_catid>
					<titolo>Test_01</titolo>
					<testo>Test_01</testo>
					<url>Tulips.jpg</url>
					<tag></tag>
					<data>2013-01-07 22:35:11</data>
					<active>1</active>
					<_update>2013-01-07 22:35:18</_update>
		</photo>
	</table_photo>
	<table_pagine>
		<pagine>
					<id>3</id>
					<_userid>2</_userid>
					<url>Test_01</url>
					<titolo>Test_01</titolo>
					<testo>Test_01</testo>
					<tag></tag>
					<data>2013-01-07 22:33:13</data>
					<active>1</active>
					<_update>2013-01-07 22:33:24</_update>
		</pagine>
	</table_pagine></michele>
ti ringrazio a domani.. notte.
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Credo che veniva ripetuto 2 volte nel caso c'era un solo risultato, quindi ho aggiunto una condizione che interrompe il foreach nel caso ce ne sia solo uno

PHP:
$xml = simplexml_load_file('file_da_importare.xml');
$tables = array('news','photo','pagine');

function OttieniDati($insert){
    global $db,$query;
    foreach($insert as $key => $value)
            if(!is_array($value))
             $query .= $db->real_escape_string($key)."='".$db->real_escape_string($value).(end($insert)==$value?'\'':'\',');
}

foreach($tables as $table){
    
    $current_array = json_decode(json_encode($xml->{'table_'.$table}),true);
    
  
 if(isset($current_array[$table])){
     
    foreach($current_array[$table] as $insert){
        $query = "INSERT INTO ".$table." SET ";

        OttieniDati(is_array($insert) ? $insert : $current_array[$table]);

        if($query!="INSERT INTO ".$table." SET ")
        $db->query($query) or die('Errore nella query: '.$query.' '.$db->error);
        
        if(!is_array($insert)) break;
    }    
        
 }
}

echo 'Query inserite con successo';
 
Ultima modifica:

luigi777

Utente Attivo
14 Feb 2008
1.073
1
38
38
Massa, Italy
ok, ti ringrazio molto.. ma è giusto fare cosi come dici ?

perché se comincio ad avere tanti dati non e che si blocca prima poi?

comunque ho provato e funziona.

ti ringrazio e buona giornata.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
generalmente da un errore del tipo che hai detto quando la variabile non è un array
verifica che $insert sia un array (solito var_dump)
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
ok, ti ringrazio molto.. ma è giusto fare cosi come dici ?

perché se comincio ad avere tanti dati non e che si blocca prima poi?

comunque ho provato e funziona.

ti ringrazio e buona giornata.
Con questa struttura dovrebbe funzionare bene anche con molti dati e più tabelle
 

luigi777

Utente Attivo
14 Feb 2008
1.073
1
38
38
Massa, Italy
ciao per testare come faccio ad inserire molti dati senza che li inserisco io uno alla volta..

avendo sempre l'xml per far prima e riempire i dati fino a 100 dati inseriti di tutte le tabelle cosi provo se funziona a modo avendo anche tanti dati.

grazie mille.

luigi
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
ciao per testare come faccio ad inserire molti dati senza che li inserisco io uno alla volta..

avendo sempre l'xml per far prima e riempire i dati fino a 100 dati inseriti di tutte le tabelle cosi provo se funziona a modo avendo anche tanti dati.

grazie mille.

luigi
Beh, tramite qualche ciclo in php, oppure manualmente o esportando una parte di dati già inserita