Importazione dati da file xml in db mysql con php

  • Creatore Discussione Creatore Discussione Piri696
  • Data di inizio Data di inizio

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:
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
 
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:
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
 
.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
 
niente da fare....mi sa che rinuncio.
la tabella del db e settata cosi:
Immagine.png

magari sbaglio ancora qualcosa....
 
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>
 
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....
 
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:
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);
    }
}
 
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
 
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
 
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