Insert XML into MYSQLI via PHP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Henri Meijer

Henri Meijer

26/01/2017 07:43:21
Quote Anchor link
Goedemorgen,

Ik ben nieuw op het forum en hoop dat ik geen post over het hoofd gezien heb die hier al antwoord op geeft. Het is een vraag m.b.t. PHP en MYSQLi. Mijn issue is als volgt: Ik wil een productfeed in PHPMyAdmin laden via PHP code. De code die ik hier nu voor geschreven heb is:


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
$url
='https://daisycon.io/datafeed/?filter_id=17940&settings_id=2510&demo';
$dom=new DOMDocument;
$dom->load( $url );

$xp=new DOMXPath( $dom );


$amountproducts=$dom->getElementsByTagName('product')->length;

$col=$dom->getElementsByTagName('product_info');


if( !empty( $col ) ){

    $dbhost =   "localhost";
    $dbuser =   "gebruikersnaam";
    $dbpwd  =   "wachtwoord";
    $dbname =   "databasenaam";

    $db =   new mysqli( $dbhost, $dbuser, $dbpwd, $dbname );

    $sql='insert into tabel_naam (brand, title, price) values (?,?,?);';
    $stmt=$db->prepare( $sql );

    if( $stmt ){
        
        $stmt->bind_param( 'sss', $brand, $title, $price );
                
        foreach( $col as $i => $product ){
            $brand = $xp->query( 'brand', $product )->item( 0 )->nodeValue;
            $price = floatval( $xp->query( 'price', $product )->item( 0 )->nodeValue );
            $title = $xp->query( 'title', $product )->item( 0 )->nodeValue;

            for( $i=0; $i = count($amountproducts); $i++ )$stmt->execute();
        }

        
        $stmt->free_result();
        $stmt->close();
    }

    $db=null;
}

?>


De structuur van de XML is te vinden op: https://daisycon.io/datafeed/?filter_id=17940&settings_id=2510&demo

Telkens als ik deze code uitvoer wordt er maar 1 rij geïmporteerd in mijn database, terwijl de code volgens anderen (StackOverflow) zou moeten werken voor alle rijden.

Ik heb al menig vraag hierover gesteld op StackOverflow, maar krijg niet de juiste response. Zie hier bijvoorbeeld: http://stackoverflow.com/questions/41739875/php-foreach-isnt-inserting?noredirect=1#comment70678670_41739875 waar RamRaider aangeeft dat deze code bij hem wel werkt.

Hopelijk kan iemand mij hier wel verder helpen.

Alvast bedankt en vriendelijke groet,

Henri
 
PHP hulp

PHP hulp

15/11/2024 22:50:32
 
Ivo P

Ivo P

26/01/2017 09:10:44
Quote Anchor link
ik mis even waarom op regel 35 die for() staat.

je loopt middels de foreach als over alle gevonden producten.

Waarom zou je dan nog een keer meermaals dezelfde query/ met dezelfde waarden uitvoeren?

Wat zit er überhaupt in $amountproducts? Ik krijg de indruk dat het een getal is, maar waarom dan nog count() op die var?
 
Adoptive Solution

Adoptive Solution

26/01/2017 09:21:09
Quote Anchor link
Ik heb dit aangepast

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
//for( $i=0; $i = count($amountproducts); $i++ ) {
   $stmt->execute();
//}


Kreeg nu 20 records i.p.v. 66.000 en counting.

Ik merk dat het script op hol is geslagen met die for lus.

Ook als ik de tabelnaam verander.

Enig idee hoe ik dat proces de nek omdraai?

PS Het is middels uit zichzelf gestopt
Gewijzigd op 26/01/2017 09:35:46 door Adoptive Solution
 
Ivo P

Ivo P

26/01/2017 09:31:35
Quote Anchor link
pkill -f naamscript.php
 
Adoptive Solution

Adoptive Solution

26/01/2017 09:36:58
Quote Anchor link
Dank voor de command, maar het leed is inmiddels geleden.
 
Henri Meijer

Henri Meijer

28/01/2017 15:26:45
Quote Anchor link
Ivo P op 26/01/2017 09:10:44:
ik mis even waarom op regel 35 die for() staat.


Hey Ivo P,

Ik heb deze toegevoegd omdat de code zonder deze for() maar 1 product importeerde, echter de toevoeging resulteerde in hetzelfde resultaat, m.a.w. er wordt maar 1 product geïmporteerd.

De code zag er voorheen zo uit en importeerde dus ook maar 1 product:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
$url
='https://daisycon.io/datafeed/?filter_id=17940&settings_id=2510';
$dom=new DOMDocument;
$dom->load( $url );

$xp=new DOMXPath( $dom );

$col=$dom->getElementsByTagName('product_info');

if( !empty( $col ) ){

    $dbhost =   "localhost";
    $dbuser =   "username";
    $dbpwd  =   "password";
    $dbname =   "dbname";

    $db =   new mysqli( $dbhost, $dbuser, $dbpwd, $dbname );

    $sql='insert into BBB (brand, title, price) values (?,?,?);';
    $stmt=$db->prepare( $sql );

    if( $stmt ){
        
        $stmt->bind_param( 'sss', $brand, $title, $price );
                
        foreach( $col as $i => $product ){
            $brand = $xp->query( 'brand', $product )->item( 0 )->nodeValue;
            $price = floatval( $xp->query( 'price', $product )->item( 0 )->nodeValue );
            $title = $xp->query( 'title', $product )->item( 0 )->nodeValue;
            
            $stmt->execute();
        }

        
        $stmt->free_result();
        $stmt->close();
    }

    $db=null;
}

?>




Adoptive Solution op 26/01/2017 09:21:09:
Ik merk dat het script op hol is geslagen met die for lus.


Dat merk ik ook (denk ik). Ik zie na het uitvoeren binnen de tabel een nieuwe rij verschijnen en als ik deze verwijder terwijl het script nog draait wordt er weer slechts 1 product toegevoegd.

Ik heb dus het idee dat het script maar blijft draaien op 1 regel en niet naar de volgende gaat. Klopt dit en hoe kan ik het script door de hele XML laten gaan?
Gewijzigd op 28/01/2017 15:27:41 door Henri Meijer
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.