Importazione dati da file xml in db mysql con php

Piri696

Nuovo Utente
16 Feb 2018
13
0
1
46
Salve sono nuovo del forum e spero che tra divoi ci sia chi potra aiutarmi...stavo porvando a fare quanto in oggeto seguendo le indicazioni trovate in questa discussiaone
..giorgiotave.it/forum/php-mysql/201693-importare-dati-da-xml-db-mysql.html
ma nonostante molteplici prove modifiche aver letto un po di tutto sul web son sempre punto e accapo.

il codic ewhe uso per eseguire l'importazione del file e in teoria la query di sinerimento è il seguente:
PHP:
<?php
// Richiamo il file di configurazione
require 'config.php';


// Richiamo lo script responsabile della connessione a MySQL
require 'connect.php';


// Recupero il file
$file = $_FILES['filexml'];


codice:
// Controllo che il file sia stato inserito
if ( $file['tmp_name'] != '' ) {
    // Carica il file in una variabile $xml
    $xml = simplexml_load_file( $file['tmp_name'] );
  
    // Controllo tutti i tag "utenti"
    foreach( $xml->utenti as $value ) {
      
        // Recupero tutti i campi da ogni tag "utenti"
        $nome = $value->NOME;
        $cognome = $value->COGNOME;
        $indirizzo = $value->INDIRIZZO;
        $mail = $value->MAIL;
        $telefono = $value->TELEFONO;
      
        // Creo una query di inserimento e la eseguo
    $sql = "INSERT INTO Utenti (nome, cognome, indirizzo, mail, telefono) VALUES ('$nome', '$cognome', '$indirizzo', '$mail', '$telefono')";
    $rssql = mysql_query( $sql );
      
        // Controllo che l'importazione sia avvenuta con successo
        echo ( $rssql ) ? "Importazione avvenuta con successo" : "Errore nella query o connessione al DB mancante";
    }
}
else
    echo "Nessun file inserito";
il risultato che ho una volta provato a eseguire il tutto è il mio messaggio di errore "Errore nella query o connessione al DB mancante" ripetuto tante volte quante sono i record del file xml che provo a importare.
all'inizio pensavo fosse proprio l'upload del file e il parsing dell'xml in php ma poi provandoa sostituire le variabili della query ...VALUES ('$nome', '$cognome', '$indirizzo', '$mail', '$telefono')...con VALUES ('1', '2', '3', '4', '5')...questi valori vengono scritti sul db tante volte quanti sono i record del file xml di prova.
Leggendo su svariati forum e discussioni sembra che la sintassi della query sia corretta quindi non so cosa altro andare a vedere.
per dovere di cronaca ho provato a far stampare a video il risultato dell'upload con questo codice :

codice:
PHP:
<?php
// Recupero il file
$file = $_FILES['filexml'];


// Controllo che il file sia stato inserito
if ( $file['tmp_name'] != '' ) {
// $xml = simplexml_load_file('dati.xml');
$xml = simplexml_load_file( $file['tmp_name'] );
echo "<h2>Dati presenti nel file: (".count($xml->utenti).")</h2>";
echo "<ul>";
$n = 0;
foreach ($xml->utenti as $utenti){


$nome =$utenti->NOME;
$cognome =$utenti->COGNOME;
$indirizzo =$utenti->INDIRIZZO;
$mail =$utenti->MAIL;
$telefono =$utenti->TELEFONO;
echo "<li>Utente $n / Nome: $nome / Cognome: / $cognome / Indirizzo: $indirizzo / Mail: / $mail / Telefono: / $telefono</li>";
}
}
echo "</ul>";
e viene eseguito correttamente
spero che qualcuno risponda al mio appello ...grazie mille fin d'ora
 
Ultima modifica:

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.449
338
83
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
code.gif
quando posti del codice, oppure la funzione codice dalla barra degli strumenti
box inserisci 2.png.JPG

Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie
Sei pregato di correggere il tuo post nel modo indicato
Ancora grazie
 

mr.x

Utente Attivo
9 Apr 2016
252
25
28
controlla i log di apche e vedi che errore hai
a me facendo una prova va

PHP:
<?php
    $link = mysqli_connect("localhost", "db", "pass", "test");
if (!$link) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}
// Recupero il file
$file = 'mrw.xml';

    // Carica il file in una variabile $xml
    $xml = simplexml_load_file( $file );
 
    // Controllo tutti i tag "utenti"
    foreach( $xml->utenti as $value ) {
    
        // Recupero tutti i campi da ogni tag "utenti"
        $nome = $value->NOME;
        $cognome = $value->COGNOME;
        $indirizzo = $value->INDIRIZZO;
            
        // Creo una query di inserimento e la eseguo
    $sql = "INSERT INTO xml (nome, cognome, indirizzo) VALUES ('$nome', '$cognome', '$indirizzo')";
    $rssql = mysqli_query( $link, $sql );
    
        // Controllo che l'importazione sia avvenuta con successo
        echo ( $rssql ) ? "Importazione avvenuta con successo" : "Errore nella query o connessione al DB mancante";
    }
?>

ho utilizzato il tuo stesso codice, sostituito le istruzioni mysql con mysqli ( ma nn influisce sull'errore)
controlla anche i file che includi ed eventuali che parentesi che non restino aperte.

il file XML utilizzato
Codice:
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2018-02-17T12:34:02">
 <utenti>
  <NOME>AAA</NOME>
  <COGNOME>aaa</COGNOME>
  <INDIRIZZO>Via di aaa, 11</INDIRIZZO>
</utenti>
 <utenti>
  <NOME>bb</NOME>
  <COGNOME>bbb</COGNOME>
  <INDIRIZZO>Via di bb, 22</INDIRIZZO>
</utenti>
</dataroot>

PS
controlla anche la struttura del fdatabase e di aver impostato correttamente il tipo di dato
 
Ultima modifica:

Piri696

Nuovo Utente
16 Feb 2018
13
0
1
46
Grazie Mister X ma non risolvo neanche con il tuo codice...mi sta sorgendo il terribile dubbio che dipenda dal db o dal server...io sto facendo le prove su un spazio gratuito di altervista con il loro db mysql...la tabella l'ho creata io e da neofita ho creato i campi tutti come INT....non so se c'entra
 

mr.x

Utente Attivo
9 Apr 2016
252
25
28
.la tabella l'ho creata io e da neofita ho creato i campi tutti come INT....non so se c'entra
è quello il problema.. lascia come INT il campo ID (se l'hai creato altrimenti crealo e impostalo autoincrement e come chiave primaria) e gli altri campi impostali come VARCHAR
 

Piri696

Nuovo Utente
16 Feb 2018
13
0
1
46
niente da fare....mi sa che rinuncio.
la tabella del db e settata cosi:
Immagine.png

magari sbaglio ancora qualcosa....
 

Piri696

Nuovo Utente
16 Feb 2018
13
0
1
46
Codice:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2012-07-17T12:34:02">
<utenti>
<NOME>AAA</NOME>
<COGNOME>aaa</COGNOME>
<INDIRIZZO>Via di aaa, 11</INDIRIZZO>
<MAIL>[email protected]</MAIL>
<TELEFONO>0123456</TELEFONO>
</utenti>
<utenti>
<NOME>BBB</NOME>
<COGNOME>bbb</COGNOME>
<INDIRIZZO>Via bbb, 22</INDIRIZZO>
<MAIL>[email protected]</MAIL>
<TELEFONO>6543210</TELEFONO>
</utenti>
<utenti>
<NOME>CCC</NOME>
<COGNOME>ccc</COGNOME>
<INDIRIZZO>Via ccc, 33</INDIRIZZO>
<MAIL>[email protected]</MAIL>
<TELEFONO>112233</TELEFONO>
</utenti>
</dataroot>
 

mr.x

Utente Attivo
9 Apr 2016
252
25
28
togli la prima riga

Codice:
This XML file does not appear to have any style information associated with it. The document tree is shown below.

fai iniziare il file da <dataroot....
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
premetto che non ho cambiato nessuna logica dello script (che mi sembra funzionare vedi anche Mr.x),
quindi ciò che ti propongo può comunque dare errore, ma
ho cercato di ottenere l'errore a video senza nasconderlo con un generico messaggio come nel tuo script originale

inoltre mancano dei controlli che garantiscano il funzionamento nel tempo, un esempio
se ricevi il nome D'ANGELO (con apice) l'insert si fermerà con errore

quindi ho impostato lo script per identificare facilmente i record errati e il relativo errore senza .... brancolare nel buio
PHP:
<?php
require_once 'config.inc.php';

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or die ('Unable to connect. Check your connection parameters.');
mysql_select_db(MYSQL_DB, $db) or die(mysql_error());

$file = $_FILES['filexml'];

if ( $file['tmp_name'] != '' )
{
    $xml = simplexml_load_file( $file['tmp_name'] );

    foreach( $xml->utenti as $value )
    {
        $nome      = $value->NOME;
        $cognome   = $value->COGNOME;
        $indirizzo = $value->INDIRIZZO;
        $mail      = $value->MAIL;
        $telefono  = $value->TELEFONO;

        $sql = "INSERT INTO Utenti (nome, cognome, indirizzo, mail, telefono) VALUES ('$nome', '$cognome', '$indirizzo', '$mail', '$telefono')";

        echo "nome : "     .$nome     ."<br />"
           . "cognome : "  .$cognome  ."<br />"
           . "indirizzo : ".$indirizzo."<br />"
           . "telefono : " .$telefono ."<br /><br />"
           . "sql : "      .$sql      ."<br />";

        mysql_query( $sql ) or die(mysql_error());
        echo "Importazione avvenuta con successo<br /><br />";
    }
}
else
    echo "Nessun file inserito";
?>
se veramente ti da ancora errore e non sai come risolvere, posta il testo completo dell'errore stesso

ps, non ti dico di passare ad msqli per non aggiungere un altro "problema", potrai farlo quando tutto funziona
 
Ultima modifica:

macus_adi

Utente Attivo
5 Dic 2017
1.343
91
48
IT/SW
Scusate l'intromissione....
Prova questa semplicemente implementando il metodo __toString()!:
PHP:
function parse_xml($conn){
    $cn=$conn->get_conn();
    $xml = new SimpleXMLElement( file_get_contents(__DIR__.'/xml/file.xml'));
    $model=['nome','cognome','indirizzo','email','telefono'];
    $data_to_insert=[];
    foreach( $xml->utenti as $k=>$value ) {
        $local=
            [
                $value->NOME->__toString(),
                $value->COGNOME->__toString(),
                $value->INDIRIZZO->__toString(),
                $value->EMAIL->__toString(),
                $value->TELEFONO->__toString()
            ];
        $q="INSERT INTO table1 (".join(',',$model).") VALUES ('".join("','",$local)."')";
        $cn->query($q);
    }
}
 

Piri696

Nuovo Utente
16 Feb 2018
13
0
1
46
premetto che non ho cambiato nessuna logica dello script (che mi sembra funzionare vedi anche Mr.x),
quindi ciò che ti propongo può comunque dare errore, ma
ho cercato di ottenere l'errore a video senza nasconderlo con un generico messaggio come nel tuo script originale

inoltre mancano dei controlli che garantiscano il funzionamento nel tempo, un esempio
se ricevi il nome D'ANGELO (con apice) l'insert si fermerà con errore

quindi ho impostato lo script per identificare facilmente i record errati e il relativo errore senza .... brancolare nel buio
PHP:
<?php
require_once 'config.inc.php';

$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or die ('Unable to connect. Check your connection parameters.');
mysql_select_db(MYSQL_DB, $db) or die(mysql_error());

$file = $_FILES['filexml'];

if ( $file['tmp_name'] != '' )
{
    $xml = simplexml_load_file( $file['tmp_name'] );

    foreach( $xml->utenti as $value )
    {
        $nome      = $value->NOME;
        $cognome   = $value->COGNOME;
        $indirizzo = $value->INDIRIZZO;
        $mail      = $value->MAIL;
        $telefono  = $value->TELEFONO;

        $sql = "INSERT INTO Utenti (nome, cognome, indirizzo, mail, telefono) VALUES ('$nome', '$cognome', '$indirizzo', '$mail', '$telefono')";

        echo "nome : "     .$nome     ."<br />"
           . "cognome : "  .$cognome  ."<br />"
           . "indirizzo : ".$indirizzo."<br />"
           . "telefono : " .$telefono ."<br /><br />"
           . "sql : "      .$sql      ."<br />";

        mysql_query( $sql ) or die(mysql_error());
        echo "Importazione avvenuta con successo<br /><br />";
    }
}
else
    echo "Nessun file inserito";
?>
se veramente ti da ancora errore e non sai come risolvere, posta il testo completo dell'errore stesso

ps, non ti dico di passare ad msqli per non aggiungere un altro "problema", potrai farlo quando tutto funziona

GRAZIE Marino 51 ho risolto utilizzando il tuo codice ma credo che alla fine il problema risiedeva su come era fatto il db, ho seguiti anche le indicazioni di Mr X su come impostare i campi della tabella.

GRAZIE MILLE A TUTTI E SCUSATE SE VI HO TEDIATO CON I MIEI PROBLEMI BUONA GIORNATA A TUTTI
 

Piri696

Nuovo Utente
16 Feb 2018
13
0
1
46
Marino 51 perdonami se approfitto della tua pazienza, ma se volessi mettere quel controllo per un dato con l'apostrofo (es il tuo D'ANGELO) come dovrei modificare il codice? Grazie sempre
 

marino51

Utente Attivo
28 Feb 2013
3.203
207
63
Lombardia
Marino 51 perdonami se approfitto della tua pazienza, ma se volessi mettere quel controllo per un dato con l'apostrofo (es il tuo D'ANGELO) come dovrei modificare il codice? Grazie sempre
gestisco le query passando i valori attraverso un'array, esempio
PHP:
$sql = "SELECT * FROM PERIODI WHERE id_periodo IN( ?, ?, ? ) and id_struttura=?";
$sth = $db->query( $sql, array( 11, 13, 15, 2 ) );
il metodo query richiama anche,
PHP:
  private function FixSQL( $params=array() )
  {
    $stringa = serialize($params);

    // error_log($stringa, 0);

    $stringa = str_replace("'", "''" , $stringa);
    $stringa = str_replace("%", "[%]", $stringa);
    $stringa = str_replace("[", "[[]", $stringa);
    $stringa = str_replace("]", "[]]", $stringa);
    $stringa = str_replace("_", "[_]", $stringa);
    $stringa = str_replace("#", "[#]", $stringa);

    // error_log($stringa, 0);

    return unserialize($stringa);
  }
che sistema i "problemi", uso questa funzione con sql server, per altro database forse deve essere aggiustata

ps, scusa se nell'esempio ci sono solo dati numerici, ma è poco importante
 
Ultima modifica:
Discussioni simili
Autore Titolo Forum Risposte Data
JellyBelly Importazione dati da file excel PHP 2
Z importazione di file txt con due campi e dati in mysql tramite phpmyadmin MySQL 1
Alex_70 sql importazione dati MySQL 0
A [CERCO] Programmatore per importazione dati da sito web Offerte e Richieste di Lavoro e/o Collaborazione 3
J Importazione dati EXCEL Windows e Software 0
mythar Importazione dati con MS-access MS Access 0
G Importazione file .sql Web Server 0
K Importazione e-mail da account gmail ad un altro account gmail Posta Elettronica 0
R Importazione csv su mysql tramite array PHP 2
FabioJ [mysql] importazione csv o json o excel Database 0
S Importazione immagini PHP 3
G Importazione PDF in Photoshop Presentati al Forum 0
F Importazione CSV in mySQL automatico PHP 1
M Problema importazione 3d su photoshop Photoshop 0
M [Photoshop] Problemi con importazione immagini trasparenti in indesign Photoshop 0
G [MySQL] Errore importazione tabella .sql #1062 - Duplicate entry '592' for key 'PRIMARY' MySQL 20
C [MySQL] errore nell'importazione tabella con file csv MySQL 0
M Problema con l'importazione file csv PHP 3
Marco_88 Errore di importazione da terminale MySQL 0
F os commerce importazione file cv E-Commerce 0
L [tomcat 7] JSP e importazione jar esterni Apache 0
I osCommerce - L'importazione funziona? CMS (Content Management System) 0
D Importazione file CSV con delimitatori particolari (=" text " )per leading 0 PHP 0
G CSV importazione campo numerico PHP 11
P problema importazione tabella excel in visual studio 2008 .NET Framework 1
B importazione csv su mysql MySQL 1
mythar Importazione access va in errore Classic ASP 0
G importazione dump database MySQL 5
S Problema importazione tabelle WP CMS (Content Management System) 0
C [HELP] importazione video Flash 3
N Errore in fase di importazione sql MySQL 1
B Importazione video: da .mov a .flv Flash 5
E Importazione file sql (restore/backup) MySQL 0
E Alterazione luminosità dell'immagine dopo l'importazione Flash 1
J importazione massaggi Outlook Express Windows e Software 0
N ostacolare importazione HTML e CSS 3
max75 query su due tabelle e dati doppioni MS Access 2
K Form che manda dati doppi PHP 1
T problemi con dati menu a tendina HTML e CSS 2
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
D Risultati diversi elaborazione dati fra localhost e Altervista PHP 0
C Creare Tabella Dati Meteo prelevandoli da dei Tags in un altro foglio PHP 27
M Invio dati database via email php PHP 0
K [php]form invio dati PHP 0
peppe0703 Come Estrarre dati da db wordpress e richiamarli in html esterno HTML e CSS 0
V dati scomparsi dal sito HTML e CSS 3
M Memorizzare i dati nei campi prima dell'invio al db PHP 4
A Stampare dati da form PHP 8
E Estrarre dati da doppia tabella, banale ma non sempre PHP 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1

Discussioni simili