Insert XML into MYSQLI via PHP
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)
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
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;
}
?>
$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
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?
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
pkill -f naamscript.php
Dank voor de command, maar het leed is inmiddels geleden.
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)
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
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;
}
?>
$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