Hoi,
Titel is wat vreemd, maar simpel gezegd. Ik heb een soort van vergelijkings site. Ik voeg zelf in een aparte tabel de producten toe. Dat doet er niet toe.
Ik krijg via partners RSS feeds, deze worden ingelezen door een scriptje. Alleen, ik wil graag dat alle records overkomen (wat ook gebeurt bij het invoeren. Bij het bijwerken is er wel wat fout gegaan.
xml.php
class.feedreader.php
Wt er fout gaat. Het product bij de partner word in onze tabel gezet. Deze tabel heeft een productstatus veld waarin staat of die word bijgewerkt, in de feed staat of niet in de feed.
Alleen, na het draaien van het xml.php script krijgen we veel te veel artikelen die op checken blijven staan. En k zou niet weten wat ik fout doe.
Titel is wat vreemd, maar simpel gezegd. Ik heb een soort van vergelijkings site. Ik voeg zelf in een aparte tabel de producten toe. Dat doet er niet toe.
Ik krijg via partners RSS feeds, deze worden ingelezen door een scriptje. Alleen, ik wil graag dat alle records overkomen (wat ook gebeurt bij het invoeren. Bij het bijwerken is er wel wat fout gegaan.
xml.php
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
| <?php echo 'Start'; // Verbinding maken met database /* require_once('../connections/kssql.php'); if (!function_exists("GetSQLValueString")) { function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") { $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); switch ($theType) { case "text": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "long": case "int": $theValue = ($theValue != "") ? intval($theValue) : "NULL"; break; case "double": $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL"; break; case "date": $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; break; case "defined": $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; break; } return $theValue; } } mysql_select_db($database_kssql, $kssql);*/ mysql_connect ('localhost','root','usbw'); mysql_select_db ('nick'); // Maximale tijd dat de pagina mag parsen uitstellen set_time_limit (1200); // Feedreader class starten include 'class.feedreader.php'; $rFeeds = mysql_query("SELECT XMLURL FROM shop") or die( 'rFeeds: '.mysql_error() ); if ( mysql_num_rows($rFeeds) == 0 ) { die ('Geen feeds gevonden in de database'); } while ( $aFeed = mysql_fetch_assoc($rFeeds) ) { try { $oFeed = new FeedReader($aFeed['XMLURL']); $aInsertValues = array(); // status veranderen mysql_query("UPDATE product_partner SET productstatus = 'checking' WHERE shopid = '".$oFeed -> get_shop_id()."'") or die( 'Update_productstatus: '.mysql_error() ); foreach ( $oFeed AS $aItem ) { $rCount = mysql_query("SELECT productid FROM product_partner WHERE productnaam = '".mysql_real_escape_string($aItem['name'])."' AND partnerid = '".mysql_real_escape_string($aItem['id'])."' AND shopid = '".mysql_real_escape_string($oFeed -> get_shop_id())."' LIMIT 1") or die( 'rCount: '.mysql_error() ); $iMatches = mysql_num_rows($rCount); if ( $iMatches == 0 ) { $aInsertValues[] = "( '".mysql_real_escape_string($aItem['url'])."', '".mysql_real_escape_string($aItem['id'])."', '".mysql_real_escape_string($aItem['name'])."', '".mysql_real_escape_string($aItem['description'])."', '".mysql_real_escape_string($aItem['price'])."', '".mysql_real_escape_string($aItem['image'])."', '".mysql_real_escape_string($aItem['category'])."', '".mysql_real_escape_string($aItem['category_sub'])."', '".mysql_real_escape_string($aItem['brand'])."', '".mysql_real_escape_string($oFeed -> get_shop_id())."' ),"; } else { $aData = mysql_fetch_assoc($rCount); mysql_query("UPDATE product_partner SET producturl = '".mysql_real_escape_string($aItem['url'])."', partnerid = '".mysql_real_escape_string($aItem['id'])."', productnaam = '".mysql_real_escape_string($aItem['name'])."', productdescription = '".mysql_real_escape_string($aItem['description'])."', productprijs = ".mysql_real_escape_string($aItem['price']).", productimageurl = '".mysql_real_escape_string($aItem['image'])."', productcategorie = '".mysql_real_escape_string($aItem['category'])."', productsubcategorie = '".mysql_real_escape_string($aItem['category_sub'])."', productmerk = '".mysql_real_escape_string($aItem['brand'])."', productstatus = 'in_feed', shopid = '".mysql_real_escape_string($oFeed -> get_shop_id())."' WHERE productid = ".$aData['productid']) or die( 'UpdateProducts: '.mysql_error() ); } // Resultaat opschonen mysql_free_result($rCount); } mysql_query("UPDATE product_partner SET product_status = 'not_in_feed' WHERE shopid = '".$oFeed -> get_shop_id()."' AND product_status = 'checking'"); $iValues = count($aInsertValues); $sValues = ''; $i = 0; while ( $i < $iValues ) { $sValues .= $aInsertValues[$i]; if ( (($i % 10 == 0) && $i != 0) || $i+1 == $iValues ) { if ( $i == $iValues ) { echo 'laatste'; } $sQuery = trim("INSERT INTO product_partner ( producturl, partnerid, productnaam, productdescription, productprijs, productimageurl, productcategorie, productsubcategorie, productmerk, shopid ) VALUES ".$sValues, ','); mysql_query($sQuery) or die('InsertValues: '.mysql_error()); $sValues = ''; } $i++; } echo '<p>'.$oFeed -> count_result().' producten gevonden in de RSS feed "'.$oFeed -> get_url().'".</p>'; } catch ( Exception $e ) { // Eventuele fouten opvangen echo '<p> <strong>Fout</strong><br /> '.$e -> getMessage().' </p>'; } $oFeed = null; } echo 'End'; ?> |
class.feedreader.php
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
| <?php /** * Met de feedreader class kun je makkelijk XML partnerfeeds inlezen. Deze class implementeert iterator, wat * er (simpel gezegd) voor zorgt dat je de class als array kunt gebruiken. */ class feedReader implements iterator { /** * Data array * @var array */ private $aData; /** * De url naar de feed * @var string */ private $sUrl; /** * Positie waar de iterator nu is * @var int */ private $iCurrent; /** * De gegevens waar je nu mee werkt * @var array */ private $aCurrent; /** * De shopid van de huidige shop van de feedreader * @var int */ private $iShop; /** * De constructor, die de url inleest en opslaat in de class * * @param string Url naar feed * @return bool|exception */ public function __construct ( $sUrl ) { $this -> sUrl = $sUrl; // Feed inladen en een exception gooien als er iets fout gaat if ( $rXml = @simplexml_load_file($this -> sUrl) ) { $this -> aData = array(); foreach ( $rXml -> product AS $aProduct ) { // Data array maken $aData = array( 'url' => urldecode($aProduct -> productURL), 'id' => strval($aProduct -> productID), 'name' => utf8_decode($aProduct -> productNAME), 'price' => floatval($aProduct -> productPRICE), 'brand' => utf8_decode($aProduct -> productMERK), 'image' => urldecode($aProduct -> imageURL), 'category' => utf8_decode($aProduct -> categorie), 'category_sub' => utf8_decode($aProduct -> categorieSUB), 'description' => utf8_decode($aProduct -> description), ); // Opslaan in de globale data array $this -> aData[] = $aData; } $this -> iShop = $this -> resolve_shop_id($sUrl); } else { // Foutje, dus een exception gooien throw new Exception ('Kan de feed (URL = "'.htmlentities($this -> sUrl, ENT_QUOTES).'") niet inlezen (bestaat de feed wel, of is de feed niet leesbaar?)'); } // True teruggeven als er niets fout is gegaan return true; } /** * Geef alle ingelezen producten terug * * @return array */ public function get_all () { return $this -> aData; } /** * Geef de url weer waar je nu mee werkt * * @return string */ public function get_url () { return $this -> sUrl; } /** * Tel alle producten in de rss feed * * @return int */ public function count_result () { return count ($this -> aData); } /** * Geef de shopId terug (die is ingelezen uit de url naar de feed in de constructor). * * @return int */ public function get_shop_id () { if ( isset($this -> iShop) ) { return $this -> iShop; } else { return false; } } /** * Verkrijg de shopId uit de url * * @param string De volledige URL naar de feed * @return int|exception */ private function resolve_shop_id ($sUrl) { // Parse de querystring parse_str ( parse_url( $sUrl, PHP_URL_QUERY ), $aQueryString ); // Kijk of er een ?adv= in de url staat if ( isset($aQueryString['adv']) ) { // Variabele opslaan return intval($aQueryString['adv']); } else { // Er ging iets fout, dus een exception gooien throw new Exception ('Kan de shopId niet uit de url krijgen!'); } } /** * Destructor, hiermee verwijder ik de variabelen die veel geheugen gebruiken */ public function __destruct () { $this -> aData = null; } /************************************************************************\ * ITERATOR FUNCTIES * * De iterator functies nodig die nog niet gemaakt zijn, die maak ik hier * \************************************************************************/ /** * Opnieuw beginnen (zie php.net/current) door de pointer terug te zetten naar 0 */ public function rewind () { $this -> iCurrent = 0; } /** * Het huidige gegeven terug geven * @return array */ public function current() { if( !is_array($this -> aCurrent)) { $this -> next(); } return $this -> aCurrent; } /** * Naar het volgende gegeven gaan */ public function next () { $this -> aCurrent = isset($this -> aData[$this -> iCurrent]) ? $this -> aData[$this -> iCurrent] : false; $this -> iCurrent++; } /** * De huidige pointer teruggeven * @return int */ public function key () { return $this -> iCurrent; } /** * Kijken of het gegeven wel een goed gegeven is (in dit geval, of die bestaat) * @return bool */ public function valid() { return $this -> current() !== false; } } ?> |
Wt er fout gaat. Het product bij de partner word in onze tabel gezet. Deze tabel heeft een productstatus veld waarin staat of die word bijgewerkt, in de feed staat of niet in de feed.
Alleen, na het draaien van het xml.php script krijgen we veel te veel artikelen die op checken blijven staan. En k zou niet weten wat ik fout doe.
[ Voor 0% gewijzigd door BlackWhizz op 16-02-2009 00:51 . Reden: Code tags ]