zeer grote xml in database omzetten
Ik ben bezig om een xml met 9345 record om te zetten in een database. Hiervoor gebruik ik het volgende script":
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?
ini_set('display_errors', 'on');
ini_set('display_errors', '1');
require_once('connection.php');
$feed = simpleXML_load_file("http://p2000.bommel.net/cap2xml.php"); /* feed ophalen */
$mysqli->autocommit(FALSE); /* zorg dat er niet direct word opgeslagen, zodat het syteem sneller word */
foreach ($feed as $feed){
$capcode = $feed->capcode;
$disipline = $feed->discipline;
$korps = $feed->korps;
$description_load = $feed->omschrijving;
if(isset($feed->korps)){
if(empty($feed->korps) === FALSE){
$description = ''.$korps.' - '.$description_load.'';
}
else{
$description = $description_load;
}
}
else{
$description = $description_load;
}
$check1 = $mysqli->query ('
SELECT *
FROM capcodes
WHERE capcode = "'.$capcode.'" AND description = "'.$description.'"
');
if($check1 == false){
echo 'Verbinden met database is mislukt200<br />';
die();
}
if($check1->num_rows == 0){ /* als de beschrijving capcode disipline combinatie niet aanwezig is */
$check2 = $mysqli->query ('
SELECT *
FROM capcodes
WHERE capcode = '.$capcode.'
');
if($check2 == false){
echo 'Verbinden met databse is mislukt 201<br />';
die();
}
if($check2->num_rows == 0){ /* als de capcode nog niet betsaat, volledig opslaan */
$save = $mysqli->query('
INSERT INTO capcodes
(capcode, disipline, description)
VALUES
("'.$capcode.'", "'.$disipline.'" , "'.$description.'" )
');
if($save == false){ /* check of opslag mislukt is */
echo ' Opslaan in database is mislukt<br />';
die();
}
else{
echo ''.$capcode.' is toegevoegd<br />';
}
}
else{ /* als de capcode bestaat, updaten */
$save = $mysqli->query("
UPDATE capcodes
SET description = '".$description."' AND disipline = '".$disipline."'
WHERE capcode = '".$capcode."'
");
if($save == false){
echo 'Update in database is mislukt<br />';
die();
}
else{
echo ''.$capcode.' is geupdate<br />';
}
}
}
}
$mysqli->commit(); /* Voer alle db aanpassingen uit */
?>
ini_set('display_errors', 'on');
ini_set('display_errors', '1');
require_once('connection.php');
$feed = simpleXML_load_file("http://p2000.bommel.net/cap2xml.php"); /* feed ophalen */
$mysqli->autocommit(FALSE); /* zorg dat er niet direct word opgeslagen, zodat het syteem sneller word */
foreach ($feed as $feed){
$capcode = $feed->capcode;
$disipline = $feed->discipline;
$korps = $feed->korps;
$description_load = $feed->omschrijving;
if(isset($feed->korps)){
if(empty($feed->korps) === FALSE){
$description = ''.$korps.' - '.$description_load.'';
}
else{
$description = $description_load;
}
}
else{
$description = $description_load;
}
$check1 = $mysqli->query ('
SELECT *
FROM capcodes
WHERE capcode = "'.$capcode.'" AND description = "'.$description.'"
');
if($check1 == false){
echo 'Verbinden met database is mislukt200<br />';
die();
}
if($check1->num_rows == 0){ /* als de beschrijving capcode disipline combinatie niet aanwezig is */
$check2 = $mysqli->query ('
SELECT *
FROM capcodes
WHERE capcode = '.$capcode.'
');
if($check2 == false){
echo 'Verbinden met databse is mislukt 201<br />';
die();
}
if($check2->num_rows == 0){ /* als de capcode nog niet betsaat, volledig opslaan */
$save = $mysqli->query('
INSERT INTO capcodes
(capcode, disipline, description)
VALUES
("'.$capcode.'", "'.$disipline.'" , "'.$description.'" )
');
if($save == false){ /* check of opslag mislukt is */
echo ' Opslaan in database is mislukt<br />';
die();
}
else{
echo ''.$capcode.' is toegevoegd<br />';
}
}
else{ /* als de capcode bestaat, updaten */
$save = $mysqli->query("
UPDATE capcodes
SET description = '".$description."' AND disipline = '".$disipline."'
WHERE capcode = '".$capcode."'
");
if($save == false){
echo 'Update in database is mislukt<br />';
die();
}
else{
echo ''.$capcode.' is geupdate<br />';
}
}
}
}
$mysqli->commit(); /* Voer alle db aanpassingen uit */
?>
nu gaat dit een hele tijd goed, maar opgegeven moment word in de description 0 opgeslagen ipv de description. En daarnaast word opgegeven moment (later dan dat de description bug optreed) check 1 niet meer goed uitgevoerd en krijg ik daarop dan ook een FALSE terug.
Iemand enig idee waaraan dat kan liggen?
Toevoeging op 07/12/2012 16:52:42:
EDIT: probleem van de description is opgelost, code's zaten dubbel in de xml. probleem van de check nog niet.
Gewijzigd op 07/12/2012 16:51:31 door Matthijs Vos
Dan nog een tip, kijk eens naar INSERT INTO... ON DUPLICATE KEY UPDATE. Daarmee hoef je niet eerst te checken of een record al bestaat en aan de hand daarvan te inserten of te updaten, maar kan je elk record gewoon automatisch laten inserten/updaten. Scheelt je een hoop code en een hoop select queries.
Hij kapt er mee na de capcode '1500983'
Zit ongetwijfeld dan in het feit dat het record ervoor het eerste record is met als korps naam 's-Gravenzande. Zie die apostrofe? Aangezien je de input niet escaped ga je daar last van krijgen.