Avatar billede kodak Mester
08. april 2011 - 16:58 Der er 48 kommentarer og
1 løsning

XML til MySQL

Jeg vil gerne have hjælp til at samlet et script der kan læse en xml fil og smide alt data'en ind i min MySQL DB
Alle mine xml filer har samme struktur.
Eksempel på xml fil:

<?xml version="1.0" encoding="UTF-8"?>
<form1>
    <Dato>DATO</Dato>
    <FirmaNavn>FIRMA_NAVN</FirmaNavn>
    <ATTnavn>ATT_NAVN</ATTnavn>
    <By>BY</By>
    <PostNr>POST_NR</PostNr>
    <Tlf>TLF</Tlf>
    <Fax>FAX</Fax>
    <FirmaCvr>CVR</FirmaCvr>
    <Adresse>ADRESSE</Adresse>
        <VareNr>VARER_NR_1</VareNr>
            <Beskrivelse>VARER_BESKRIVELSE_1</Beskrivelse>
            <Antal>VARER_ANTAL_1</Antal>
            <StkPris>VARER_STK_PRIS_1</StkPris>
            <Pris>VARER_PRIS_1</Pris>
        <VareNr>VARER_NR_2</VareNr>
            <Beskrivelse>VARER_BESKRIVELSE_2</Beskrivelse>
            <Antal>VARER_ANTAL_2</Antal>
            <StkPris>VARER_STK_PRIS_2</StkPris>
            <Pris>VARER_PRIS_2</Pris>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
        <VareNr/>
            <Beskrivelse/>
            <Antal/>
            <StkPris/>
            <Pris/>
    <Total>TOTAL</Total>
    <Moms/>
    <FederalTax/>
    <Fragt/>
    <SumTotal>SUM_TOTAL</SumTotal>
    <Kommentar>KOMMENTAR</Kommentar>
    <Ordre/>
    <betalt>BETALT</betalt>
    <OrdreNummer>ORDRE_NR</OrdreNummer>
</form1>


Min database:

--
-- Struktur-dump for tabellen `ordre_module`
--

CREATE TABLE IF NOT EXISTS `ordre_module` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `OrdreNummer` varchar(10) NOT NULL DEFAULT '',
  `Dato` varchar(10) NOT NULL DEFAULT '',
  `FirmaNavn` varchar(100) NOT NULL DEFAULT '',
  `ATTnavn` varchar(100) NOT NULL DEFAULT '',
  `Adresse` varchar(100) NOT NULL DEFAULT '',
  `By` varchar(40) NOT NULL DEFAULT '',
  `PostNr` varchar(6) NOT NULL DEFAULT '',
  `Tlf` varchar(14) NOT NULL DEFAULT '',
  `Fax` varchar(14) NOT NULL DEFAULT '',
  `FirmaCvr` varchar(20) NOT NULL DEFAULT '',
  `Total` varchar(30) NOT NULL DEFAULT '',
  `Moms` varchar(30) NOT NULL DEFAULT '',
  `FederalTax` varchar(30) NOT NULL DEFAULT '',
  `Fragt` varchar(50) NOT NULL DEFAULT '',
  `SumTotal` varchar(50) NOT NULL DEFAULT '',
  `Ordre` varchar(10) NOT NULL DEFAULT '',
  `betalt` varchar(10) NOT NULL DEFAULT '',
  `VareNr_1` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_1` text NOT NULL,
  `Antal_1` varchar(10) NOT NULL DEFAULT '',
  `StkPris_1` varchar(10) NOT NULL DEFAULT '',
  `Pris_1` varchar(30) NOT NULL DEFAULT '',
  `VareNr_2` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_2` text NOT NULL,
  `Antal_2` varchar(10) NOT NULL DEFAULT '',
  `StkPris_2` varchar(10) NOT NULL DEFAULT '',
  `Pris_2` varchar(30) NOT NULL DEFAULT '',
  `VareNr_3` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_3` text NOT NULL,
  `Antal_3` varchar(10) NOT NULL DEFAULT '',
  `StkPris_3` varchar(10) NOT NULL DEFAULT '',
  `Pris_3` varchar(30) NOT NULL DEFAULT '',
  `VareNr_4` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_4` text NOT NULL,
  `Antal_4` varchar(10) NOT NULL DEFAULT '',
  `StkPris_4` varchar(10) NOT NULL DEFAULT '',
  `Pris_4` varchar(30) NOT NULL DEFAULT '',
  `VareNr_5` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_5` text NOT NULL,
  `Antal_5` varchar(10) NOT NULL DEFAULT '',
  `StkPris_5` varchar(10) NOT NULL DEFAULT '',
  `Pris_5` varchar(30) NOT NULL DEFAULT '',
  `VareNr_6` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_6` text NOT NULL,
  `Antal_6` varchar(10) NOT NULL DEFAULT '',
  `StkPris_6` varchar(10) NOT NULL DEFAULT '',
  `Pris_6` varchar(30) NOT NULL DEFAULT '',
  `VareNr_7` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_7` text NOT NULL,
  `Antal_7` varchar(10) NOT NULL DEFAULT '',
  `StkPris_7` varchar(10) NOT NULL DEFAULT '',
  `Pris_7` varchar(30) NOT NULL DEFAULT '',
  `VareNr_8` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_8` text NOT NULL,
  `Antal_8` varchar(10) NOT NULL DEFAULT '',
  `StkPris_8` varchar(10) NOT NULL DEFAULT '',
  `Pris_8` varchar(30) NOT NULL DEFAULT '',
  `VareNr_9` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_9` text NOT NULL,
  `Antal_9` varchar(10) NOT NULL DEFAULT '',
  `StkPris_9` varchar(10) NOT NULL DEFAULT '',
  `Pris_9` varchar(30) NOT NULL DEFAULT '',
  `VareNr_10` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_10` text NOT NULL,
  `Antal_10` varchar(10) NOT NULL DEFAULT '',
  `StkPris_10` varchar(10) NOT NULL DEFAULT '',
  `Pris_10` varchar(30) NOT NULL DEFAULT '',
  `VareNr_11` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_11` text NOT NULL,
  `Antal_11` varchar(10) NOT NULL DEFAULT '',
  `StkPris_11` varchar(10) NOT NULL DEFAULT '',
  `Pris_11` varchar(30) NOT NULL DEFAULT '',
  `VareNr_12` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_12` text NOT NULL,
  `Antal_12` varchar(10) NOT NULL DEFAULT '',
  `StkPris_12` varchar(10) NOT NULL DEFAULT '',
  `Pris_12` varchar(30) NOT NULL DEFAULT '',
  `VareNr_13` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_13` text NOT NULL,
  `Antal_13` varchar(10) NOT NULL DEFAULT '',
  `StkPris_13` varchar(10) NOT NULL DEFAULT '',
  `Pris_13` varchar(30) NOT NULL DEFAULT '',
  `VareNr_14` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_14` text NOT NULL,
  `Antal_14` varchar(10) NOT NULL DEFAULT '',
  `StkPris_14` varchar(10) NOT NULL DEFAULT '',
  `Pris_14` varchar(30) NOT NULL DEFAULT '',
  `VareNr_15` varchar(10) NOT NULL DEFAULT '',
  `Beskrivelse_15` text NOT NULL,
  `Antal_15` varchar(10) NOT NULL DEFAULT '',
  `StkPris_15` varchar(10) NOT NULL DEFAULT '',
  `Pris_15` varchar(30) NOT NULL DEFAULT '',
  `time` int(11) NOT NULL DEFAULT '0',
  `Kommentar` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


Så alt data der står i xml filen skrives ind i min DB.

Håber det forståen.
Avatar billede kodak Mester
08. april 2011 - 17:07 #1
Fandt denne denne men kan ikke finde hoved og hale i den og er ikke suveræn til engelsk:
http://www.hotscripts.com/forums/php/34882-xml-mysql-using-php-urgent.html
Avatar billede tjens Nybegynder
08. april 2011 - 18:09 #2
Du kan omskrive din xml med xslt.

Her er en demo med et begrænset antal af dine felter: http://tjens.dk/eksperten/936266/

XSLT-transformation kan laves både på klient i javascript og på server i PHP.

Derfor skal vi vide, om dine XML-filer ligger på samme maskine som PHP, så PHP selv kan indlæse dem, eller om det er bedre at skrive et klientprogram, der finder alle XML-filerne, og bare afleverer den færdige SQL til PHP-serveren.
Avatar billede kodak Mester
08. april 2011 - 18:46 #3
Håber det er tæt nok.

xmltomysql/script.php
xmltomysql/dokumenter/xml/ikke_overskrevet_fil.xml
xmltomysql/dokumenter/DB/overskrevet_fil.xml
Avatar billede tjens Nybegynder
08. april 2011 - 19:49 #4
#3 Jo, det betyder vel, at xml og php ligger på samme maskine, så du kan skrive det hele i ét PHP-script.

I denne artikel http://devzone.zend.com/article/1302, kan du se
hvordan du udfører xslt-transform fra xml-fil til string under "method 2".

Den string, der kommer ud, er så sql'en, som du udfører på normal vis.
Avatar billede kodak Mester
08. april 2011 - 20:33 #5
Jeg forstår ikke hvordan det virker.
Avatar billede kodak Mester
08. april 2011 - 21:14 #6
Og hvis jeg forstod det virker det ikke får en blank side.
Avatar billede tjens Nybegynder
08. april 2011 - 21:21 #7
Nej, det er nok noget med hvor mange moduler, der er kompileret med i PHP installationen.

En alternativ løsning som virker på mit webhotel:
<h3>Result:</h3>
<p><?php

  $xslDoc = new DOMDocument();
  $xslDoc->load("Test01.xsl");

  $xmlDoc = new DOMDocument();
  $xmlDoc->load("Test01.xml");

  $proc = new XSLTProcessor();
  $proc->importStylesheet($xslDoc);
  $stmt = $proc->transformToXML($xmlDoc);
  echo $stmt;

?>
</p>
<h3>XML:</h3>
<textarea cols="100" rows="17"><?php readfile("Test01.xml"); ?></textarea>
<h3>XSL:</h3>
<textarea cols="100" rows="22"><?php readfile("Test01.xsl"); ?></textarea>


Demo: http://tjens.dk/eksperten/936266/Test01.php
Avatar billede kodak Mester
08. april 2011 - 21:34 #8
Jeg får vist result: og ellers blank
Avatar billede tjens Nybegynder
08. april 2011 - 21:50 #9
Der er desværre flere fejlmuligheder.

Mit webhotel er PHP 5 og kompileret med XML og XSL aktiveret.
Det er et standard linux fra Surftown, hvor jeg ikke har ændret indstillinger.

Måske er din PHP version for gammel til eksemplet i #7, eller også er det ikke kompileret med XSL-support.

prøv at sætte en phpinfo();  i toppen af din side.
Avatar billede kodak Mester
08. april 2011 - 22:16 #10
Der står ingen ting om XSL
Avatar billede kodak Mester
08. april 2011 - 22:40 #11
Og jeg kan ikke barre installere ny php da jeg har NAS server.
Avatar billede tjens Nybegynder
09. april 2011 - 07:37 #12
Det afhænger nok af, hvilken NAS du har.

Denne tråd indikerer, at det er ligetil at udvide PHP med flere moduler på nogen modeller: http://www.readynas.com/forum/viewtopic.php?f=35&t=23070
Avatar billede kodak Mester
09. april 2011 - 11:59 #13
Jeg har en Synology (DS210j)
Avatar billede kodak Mester
09. april 2011 - 13:17 #14
PHP Version 5.3.3
Avatar billede tjens Nybegynder
09. april 2011 - 19:57 #15
Hvis din PHP includerer XML, kan det laves laves på følgende måde.

Demo: http://tjens.dk/eksperten/936266/Test02.php


<h3>Result:</h3>
<p><?php

  $xmlDoc = new DOMDocument();
  $xmlDoc->load("Test01.xml");
  $vareCount=0;
  $fields = Array();
 
  $vars = '';
  $values = '';
  $xmlLines = $xmlDoc->firstChild->childNodes;
  foreach ($xmlLines as $node) {
    if ($node->nodeType==3) continue;
    $pling = "'";
    $nodeName = $node->nodeName;
    if (  $nodeName == 'Total' ||
          $nodeName == 'Antal' ) {
          $pling = '';
    }       
    $vars .= ($vars == '')?'':', '; 
    $vars .= $nodeName;
    if ( $nodeName == 'VareNr')
        $vareCount++;
    if (  $nodeName == 'VareNr' ||
          $nodeName == 'Beskrivelse' ||
          $nodeName == 'Antal' ) {
          $vars .= '_'.$vareCount;
    }       
    $values .= ($values == '')?'':', '; 
    $values .= $pling.$node->nodeValue.$pling;
  }
  echo '<br> insert into ordre_module ('.$vars.') ';
  echo '<br> values ('.$values.');';

?>
</p>
<h3>XML:</h3>
<textarea cols="100" rows="17"><?php readfile("Test01.xml"); ?></textarea>

Avatar billede kodak Mester
09. april 2011 - 21:16 #16
Skal den ikke udskrive:

"INSERT INTO `ordre_module` SET `OrdreNummer`='" . $values['OrdreNummer'] . "', `Dato`='" . $values['Dato'] . "', `FirmaNavn`='" . $values['FirmaNavn'] . "'" O.S.V
Avatar billede kodak Mester
09. april 2011 - 21:27 #17
Mener jeg så ikke:
$values .= $pling.$nodeName.'`='.$pling.$node->nodeValue.$pling;
}
echo '<br> INSERT INTO `ordre_module` SET '.$values.' ';
Avatar billede tjens Nybegynder
09. april 2011 - 21:40 #18
Der er flere alternative syntaxer på insert: http://dev.mysql.com/doc/refman/5.5/en/insert.html

Den jeg har valgt i demo 2 burde også være gyldig.
Avatar billede kodak Mester
09. april 2011 - 21:43 #19
Det vil sige sammenlagt således:


<h3>Result:</h3>
<p>
<?php
$directory = 'dokumenter/xml/Faktura1_data.xml'; //Fra mappe
$destination = 'dokumenter/DB/Faktura1_data.xml'; //Til mappe

  $xmlDoc = new DOMDocument();
  $xmlDoc->load($directory);
  $vareCount=0;
  $fields = Array();

  $vars = '';
  $values = '';
  $xmlLines = $xmlDoc->firstChild->childNodes;
  foreach ($xmlLines as $node) {
    if ($node->nodeType==3) continue;
    $pling = "'";
    $plingf = "`";
    $nodeName = $node->nodeName;
    if (  $nodeName == 'Total' ||
          $nodeName == 'Antal' ) {
          $pling = '';
    }     
    $vars .= ($vars == '')?'':', ';
    $vars .= $nodeName;
    if ( $nodeName == 'VareNr')
        $vareCount++;
    if (  $nodeName == 'VareNr' ||
          $nodeName == 'Beskrivelse' ||
          $nodeName == 'Antal' ) {
          $vars .= '_'.$vareCount;
    }     
    $values .= ($values == '')?'':', ';
    $values .= $plingf.$nodeName.'`='.$pling.$node->nodeValue.$pling;
  }
  echo '<br> insert into ordre_module ('.$vars.') ';
  echo '<br> values ('.$values.');';
  echo '<br><br>';
  echo '<br> mysql_query("INSERT INTO `ordre_module` SET `Dato`=\'2011-04-09\', `FirmaNavn`=\'Experten\', `ATTnavn`=\'exp\'") or die (mysql_error());';
  echo '<br><br>';
  echo 'mysql_query("INSERT INTO `ordre_module` SET '.$values.'") or die (mysql_error());';
 
 

?>
</p>
<h3>XML:</h3>
<textarea cols="100" rows="17"><?php readfile($directory); ?></textarea>
Avatar billede kodak Mester
09. april 2011 - 21:44 #20
okay jeg prøver.
Avatar billede kodak Mester
09. april 2011 - 22:02 #21
Så skal jeg bare have den til at tjekke for hver xml fil der er i mappen skal den sende comandoen.
Avatar billede tjens Nybegynder
09. april 2011 - 22:20 #22
Ja, du kan lave det, du har nu, til en function, og så kalde den for hver xml-fil i folderen.
PHP kan godt arbejde med filer i foldere. Der er mange eksempler på nettet.

Og print af SQL skal ændres til udførelse, og så skal flytning af den behandlede xml-fil tilføjes til afslutning.
Avatar billede kodak Mester
09. april 2011 - 22:39 #23
hvordan laver jeg den til en funktion?
Avatar billede tjens Nybegynder
09. april 2011 - 22:51 #24
Listning af filer, og kald af funktion pr. fil:


<h3>XML-files in dir:</h3>
<p><?php

function printFilePath( $f ) {
  echo $f.'<br>';
}

foreach ( glob('./*.xml') as $file ){
        printFilePath( $file );
}

?>
</p>
Avatar billede kodak Mester
09. april 2011 - 23:27 #25
Stadig blank
Avatar billede tjens Nybegynder
09. april 2011 - 23:54 #26
Du skal nok have aktiveret php fejlvisning, så du nemmere kan se hvilke fejl, der er på en side.

På mit webhotel har jeg denne linie i .htaccess-filen:
php_flag display_errors on


Men om det er det samme på din NAS ved jeg selvf. ikke.
Avatar billede kodak Mester
09. april 2011 - 23:55 #27
nej undskyld jeg mener jeg ikke forstår.
Avatar billede tjens Nybegynder
10. april 2011 - 00:08 #28
Prøv at køre scriptet i #24, hvor du lige ændrer til:
glob('./dokumenter/xml/*.xml')


Du kan se den køre her: http://tjens.dk/eksperten/936266/Test03.php
Dog med parameter './*.*' så den lister at filer i aktuelt bibliotek
Avatar billede kodak Mester
10. april 2011 - 01:08 #29
'glob' delen kender jeg godt, det er function printFilePath( $f ) og $f jeg ikke forstår.
Avatar billede tjens Nybegynder
10. april 2011 - 09:26 #30
#24 er bare en minimalistisk demo af hvordan en funktion virker.

$f er variabelnavnet intert i funktionen.
Værdien af $f er ændrer sig hver gang funktionen kaldes.
Den kaldes i loopet fra glob, så  $f bliver en kopi $file, det antal gange, du har filer, som glob finder.

Her er en fuld artikel om emnet: http://www.phpartikler.dk/artikler/begynder3.php
Avatar billede tjens Nybegynder
10. april 2011 - 10:47 #31
Flot #30: Stavefejl i understreget ord:

internt
Avatar billede kodak Mester
10. april 2011 - 12:49 #32
Virker ikke den kender ikke 'VareNr'
og det er nok fordi den den får oplyst 'VareNr_1' VareNr_2 o.s.v
Det sammen med 'Beskrivelse' skal være 'Beskrivelse_1' 'Beskrivelse_2' o.s.v
Avatar billede tjens Nybegynder
10. april 2011 - 14:12 #33
Hvad virker ikke?
Skriv noget mere i dine indlæg tak: Jeg er ikke tankelæser!

Hvis jeg gætter på, at det er udførelse af SQL du er nået til, vil jeg mene at min demo i #15 , tager højde for dine løbenumre på felterne:
Den første parantes er feltnavnene, og den anden er de tilhørende feltværdier.
Avatar billede kodak Mester
10. april 2011 - 16:08 #34
Ja det er udførslen af SQL'en den sider at VareNr ikke findes og det er jo fordi at alle VareNr i DB'en har et nr.

Men jeg kan ikke finde ud af at sætte 'mysql_query("' i forholdet.
Avatar billede tjens Nybegynder
10. april 2011 - 17:30 #35
#34 Så har du ikke brugt eksemplet i #15: Der har alle VareNr-felter et nummer efter navnet.

Du må arbejde lidt mere systematisk med små skridt ad gangen:

1.) Test om SQL fra #15 virker med din database, hvis du kører den manuelt.
Ret først din test XML-fil til, så de numeriske værdier ikke indeholder bogstaver:
insert into ordre_module (Dato, FirmaNavn, By, Tlf, Adresse, VareNr_1, Beskrivelse_1, Antal_1, VareNr_2, Beskrivelse_2, Antal_2, Total, OrdreNummer)
values ('DATO', 'FIRMA_NAVN', 'BY', 'TLF', 'ADRESSE', 'VARER_NR_1', 'VARER_BESKRIVELSE_1', 111, 'VARER_NR_2', 'VARER_BESKRIVELSE_2', 222, 333, 'ORDRE_NR');


2.) Lav om fra echo af SQL'en til opbygning af en string:
$stmt = 'insert into ordre_module ('.$vars.') values ('.$values.');';
echo '<br>'.$stmt;
og check at resultatet stadig kan køres manuelt i databasen.


3.) Lav kald af SQL i php:
...
mysql_query($stmt);
...
og test at databasen opdateres.


4.) Udvid den if, der blanker $pling, til at teste på alle dine numeriske feltnavne.
      Udvid den if, der sætter nummer til sidst i feltnavne, til at teste på alle dine varelinienavne.
Avatar billede kodak Mester
10. april 2011 - 19:38 #36
det er blevet til:

<?

   
   
    $directory = 'regnskab/xml/'; //Fra mappe
$destination = 'regnskab/DB/Faktura1_data.xml'; //Til mappe

function printFilePath( $f ) {
 
  $xmlDoc = new DOMDocument();
  $xmlDoc->load($f);
  $vareCount=0;
  $fields = Array();

  $vars = '';
  $values = '';
  $xmlLines = $xmlDoc->firstChild->childNodes;
  foreach ($xmlLines as $node) {
    if ($node->nodeType==3) continue;
    $pling = "'";
    $nodeName = $node->nodeName;
    if (  $nodeName == 'Total' ||
          $nodeName == 'Antal' ) {
          $pling = '';
    }     
    $vars .= ($vars == '')?'':', ';
    $vars .= $nodeName;
    if ( $nodeName == 'VareNr')
        $vareCount++;
    if (  $nodeName == 'VareNr' ||
          $nodeName == 'Beskrivelse' ||
          $nodeName == 'Antal' ) {
          $vars .= '_'.$vareCount;
    }     
    $values .= ($values == '')?'':', ';
    $values .= $pling.$node->nodeValue.$pling;
  }
  if ($values) {

include('config.php');




session_start();
    //A connection to MySQL is created
    mysql_connect($mysql['host'],$mysql['user'],$mysql['password']) or die (mysql_error());
    mysql_select_db($mysql['db']) or die (mysql_error());

  echo '<br> insert into ordre_module ('.$vars.') ';
  echo '<br> values ('.$values.');';
  mysql_query($stmt);
    exit;
  }
 
}
foreach ( glob('./'.$directory.'*.xml') as $file ){
        if (printFilePath( $file )) {
            printFilePath( $file );
        }

}


?>
Avatar billede tjens Nybegynder
10. april 2011 - 20:01 #37
Det er en rodebunke:
- Du har åbenbart ikke forstået function endnu. Læs tutoriallinket igen.
- Du har glemt 2.) fra #35

Har du testet punkt 1.?

<?
    session_start();
    include('config.php');
    mysql_connect($mysql['host'],$mysql['user'],$mysql['password']) or die (mysql_error());
    mysql_select_db($mysql['db']) or die (mysql_error());
    $directory = 'regnskab/xml/'; //Fra mappe
    $destination = 'regnskab/DB/Faktura1_data.xml'; //Til mappe

    foreach ( glob('./'.$directory.'*.xml') as $file ){
        CreateAndRunSQL( $file );
    }

    function CreateAndRunSQL( $f ) {
     
        $xmlDoc = new DOMDocument();
        $xmlDoc->load($f);
        $vareCount=0;
        $fields = Array();
        $vars = '';
        $values = '';
        $xmlLines = $xmlDoc->firstChild->childNodes;
        foreach ($xmlLines as $node) {
            if ($node->nodeType==3) continue;
            $pling = "'";
            $nodeName = $node->nodeName;
            if (  $nodeName == 'Total' ||
                  $nodeName == 'Antal' ) {
                  $pling = '';
            }     
            $vars .= ($vars == '')?'':', ';
            $vars .= $nodeName;
            if ( $nodeName == 'VareNr')
                $vareCount++;
            if (  $nodeName == 'VareNr' ||
                  $nodeName == 'Beskrivelse' ||
                  $nodeName == 'Antal' ) {
                  $vars .= '_'.$vareCount;
            }     
            $values .= ($values == '')?'':', ';
            $values .= $pling.$node->nodeValue.$pling;
        }
        $stmt = 'insert into ordre_module ('.$vars.') values ('.$values.');';
        echo '<br>'.$stmt;
        mysql_query($stmt);
        //Her mangler  kode der tester om SQL blev udført
        //Hvis den blev udført skal filen flyttes til arkivfolder
        //Hvis den ikke blev udført skal fejlmelding echo'es ud
    }
?>
Avatar billede kodak Mester
10. april 2011 - 20:26 #38
Den sender stadig ikke en skid og har smidt
) or die (mysql_error());
ind.
Avatar billede tjens Nybegynder
10. april 2011 - 22:25 #39
Har du udført punkt 1.) i #35?

Både en kort insert sql, og den som echo $stmt viser.
Avatar billede kodak Mester
11. april 2011 - 08:11 #40
Den udskriver den korrekt i echo efter hvad jeg kan se.
men der sker ikke en skid i phpMyAdmin
Avatar billede kodak Mester
11. april 2011 - 08:13 #41
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 'By, PostNr, Tlf, Fax, FirmaCvr, Adresse, VareNr_1, Beskrivelse_1, Antal_1, StkPr' at line 1
Avatar billede tjens Nybegynder
11. april 2011 - 09:57 #42
Det er nok fordi by er et reserveret ord i SQL.

Prøv at sætte de der backtics (eller hvad de nu hedder) rundt om alle feltnavne, som du allerede viser i SQL'en i selve spørgsmålet.
Avatar billede kodak Mester
11. april 2011 - 10:08 #43
Er det ikke $vareCount=0; der skal rettes til $vareCount=1; ?

fordi 'By, PostNr, Tlf, Fax, FirmaCvr, Adresse' findes ikke i databasen uden nr.
Avatar billede tjens Nybegynder
11. april 2011 - 10:21 #44
Den database du viser i #0 har kun løbenummer på vareliniefelter.
Hvis du arbejder med en anden tabel eller database nu, kan jeg ikke vide hvad du snakker om.
Avatar billede kodak Mester
11. april 2011 - 11:20 #45
Glem #43

jeg forstår ikke:
backtics (eller hvad de nu hedder)
Avatar billede kodak Mester
11. april 2011 - 11:22 #46
Så lige at StkPris, Pris ikke har fået nr.
Avatar billede tjens Nybegynder
11. april 2011 - 11:30 #47
Kig på din SQL i #0:
Feltnavnene er pakket ind i et tegn som ikke er anførselstegn eller apostrof. Måske hedder den backtick eller også ved jeg ikke hvad tegnet hedder.

Prøv at pakke alle dine feltnavne ind i samme tegn.


Jeg kan hjælpe med at lade PHP danne en SQL.
Men hvordan SQL'en helt præcist skal se ud, bedes du finde ud af først.
Har du ikke mulighed for at teste SQL'en uden om PHP inden vi går videre?
Avatar billede kodak Mester
11. april 2011 - 13:55 #48
Tror den kom her den har hvertfald uploadet:

<?
    session_start();
    include('config.php');

    mysql_connect($mysql['host'],$mysql['user'],$mysql['password']) or die (mysql_error());
    mysql_select_db($mysql['db']) or die (mysql_error());

    $directory = 'regnskab/xml/'; //Fra mappe
    $destination = 'regnskab/DB/Faktura1_data.xml'; //Til mappe

    foreach ( glob('./'.$directory.'*.xml') as $file ){
        CreateAndRunSQL( $file );
    }

    function CreateAndRunSQL( $f ) {
   
        $xmlDoc = new DOMDocument();
        $xmlDoc->load($f);
        $vareCount=0;
        $fields = Array();
        $vars = '';
        $values = '';
        $xmlLines = $xmlDoc->firstChild->childNodes;
        foreach ($xmlLines as $node) {
            if ($node->nodeType==3) continue;
            $pling = "'";
            $nodeName = $node->nodeName;
            if (  $nodeName == 'Total' ||
                  $nodeName == 'Antal' ) {
                  $pling = '';
            }   
            $vars .= ($vars == '')?'':', ';
            $vars .= '`'.$nodeName;
            if ( $nodeName == 'VareNr')
                $vareCount++;
            if (  $nodeName == 'VareNr' ||
                  $nodeName == 'Beskrivelse' ||
                  $nodeName == 'Antal' ||
                  $nodeName == 'StkPris' ||
                  $nodeName == 'Pris' ) {
                  $vars .= '_'.$vareCount;
            }   
            $values .= ($values == '')?'':', ';
            $values .= $pling.$node->nodeValue.$pling;
            $vars = $vars.'`';
        }
        $stmt = 'insert into ordre_module (`id` int(11) NOT NULL AUTO_INCREMENT,  '.$vars.') values ('.$values.');';
        echo '<br>'.$stmt;
        mysql_query($stmt) or die (mysql_error());
        //Her mangler  kode der tester om SQL blev udført
        //Hvis den blev udført skal filen flyttes til arkivfolder
        //Hvis den ikke blev udført skal fejlmelding echo'es ud
    }
?>
Avatar billede kodak Mester
11. april 2011 - 21:45 #49
Det Køre nu Takke for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester