importare dati xml a mysql

  • Creatore Discussione Creatore Discussione luigi777
  • Data di inizio Data di inizio

luigi777

Utente Attivo
14 Feb 2008
1.086
1
38
42
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.
 
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.
 
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';
 
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.
 
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:
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.
 
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
 
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.
 
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.
 
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';
 
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.
 
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
 
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.
 
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:
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.
 
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)
 
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
 
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
 
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
 

Discussioni simili