Ik heb een database met geïmporteerde projecten die dagelijks door middel van XML feeds geüpdatet worden. Nu is het niet moeilijk om te checken of een XML item nog niet in de database staat om die te importeren door een simpele SELECT query.
Maar die XML feeds verwijderd ook wel eens producten, hoe kan ik nu achterhalen welke SQL rows overbodig zijn omdat dat product niet meer in de XML staan?
PHP Code:
//file wordt hierboven gegenereerd en alles wordt netjes uitgelezen hieronder.
$xml = new SimpleXMLElement($xml);
foreach ($xml->item as $record) {
//artikelnummer
$artikelnummer = $record->artikelnummer;
//nu heb ik de artikelnummers die momenteel in de feed staan. Hoe ga ik nu een sql query maken die gaat kijken welke database rows verwijderd moeten worden omdat het artikelnummer niet meer bestaat in de XML feed?
}
- Delete SQL als item XML niet meer bestaat
-
21-03-2013, 19:28 #1
- Berichten
- 1.245
- Lid sinds
- 18 Jaar
Delete SQL als item XML niet meer bestaat
-
In de schijnwerper
Te Koop: 3 Geweldige Websites - Winprijzen.be, Wedstrijden.be & Prijzen.be als pakketWebsite te koopLinkbuilding laten doen - Sinds 1998 | NUMMER 1 voorbeeldenOverige dealsIk doe sterke domeinnamen voor Nederlandse Affiliates, Publishers & Endusers weg.Domein te koop[BELANGRIJK] Festinger Vault - Download 25.000 thema's en pluginsPromotie -
21-03-2013, 19:36 #2
- Berichten
- 796
- Lid sinds
- 16 Jaar
Re: Delete SQL als item XML niet meer bestaat
Hoe vaak wordt deze feed geupdate?
Ik zat te denken om een apart php-bestand te maken welke de artikelnummers vergelijkt.
Indien artikelnummer voorkomt in zowel database als XML-feed-> doe niets.
Indien artikelnummer voorkomt in database, maar niet in XML -> Delete query uitvoeren.
Dit scriptje kan je dan met een cronjob om de x-aantal uren/dagen laten uitvoeren.
-
21-03-2013, 19:40 #3
- Berichten
- 1.245
- Lid sinds
- 18 Jaar
Re: Delete SQL als item XML niet meer bestaat
Daar zat ik ook aan te denken. De XML wordt elke nacht geüpdatet om te kijken of er nieuwe producten zijn en die worden geïmporteerd. Ik kan eerst nieuwe producten importeren (indien die er zijn) en vervolgens de verwijderde producten uit de XML DELETE van de database.
Er moet dus een php script bij komen die kijkt als producten niet meer bestaan in de XML dat ze ook uit de database verwijderd worden. Ik blijf steken op het punt om een artikelnummer die wel in de database voorkomt maar niet meer in de XML te verwijderen uit de database. Hoe maak ik die controle?
Zou het zoiets moeten zijn?
PHP Code://alle producten van de database ophalen
$select_product = mysql_query("SELECT model FROM ".$product."")or die (mysql_error());
while($product = mysql_fetch_assoc($select_product))
{
$xml = new SimpleXMLElement($xml);
foreach ($xml->item as $record) {
$artikelnummer = $record->artikelnummer;
if($product['model'] != $record->artikelnummer)
{
//DELETE SQL
}
}
}
Laatst aangepast door Sjoerd van Mook : 21-03-2013 om 19:48
-
21-03-2013, 19:53 #4
- Berichten
- 39
- Lid sinds
- 13 Jaar
Re: Delete SQL als item XML niet meer bestaat
Dat lijkt me een nogal zwaar stukje code, gezien per database regel de gehele xml wordt doorgegaan.
Wat ik aanraad is om de gehele xml eenmaal door te gaan en daarbij alle artikelnummers in een array te zetten.
Daarna door alle pagina's in de database gaan en doormiddel van in_array() checken of het artikelnummer voorkomt in de gemaakte array, zo niet, dan verwijder je de gevonden regel.
PHP Code://alle producten van de database ophalen
$xml = new SimpleXMLElement($xml);
$nrs = array();
foreach ($xml->item as $record) {
$nrs[] = $record->artikelnummer;
}
$select_product = mysql_query("SELECT model FROM ".$product."")or die (mysql_error());
while($product = mysql_fetch_assoc($select_product))
{
if(!in_array($product['model'], $nrs))
{
//DELETE SQL
}
}
}
-
21-03-2013, 19:55 #5
- Berichten
- 1.245
- Lid sinds
- 18 Jaar
Re: Delete SQL als item XML niet meer bestaat
Thanx Thomas, daar was ik naar op zoek!
-
21-03-2013, 22:03 #6
- Berichten
- 153
- Lid sinds
- 14 Jaar
Re: Delete SQL als item XML niet meer bestaat
Volgens mij kan het beter zo:
- Op elk product een extra veld 'toRemove maken' (Wanneer je een standaardtabel van een CMS o.i.d. gebruikt, gewoon een nieuwe tabel maken en join-en)
- Bij het begin van je import elk veld toRemove op 1 zetten
- Wanneer je een product update, toRemove naar 0 zetten
- Aan het einde van je run alles met een toRemove van 1 verwijderen.
Waarom?
- Sneller. De update van elke rij moet je toch al doen, en de andere twee acties zijn batches over de hele tabel ineens.
- Dit zou je gemakkelijk kunnen uitbreiden naar het importeren van meerdere feeds
- Geheugengebruik is niet meer lineair t.o.v. de grote van de feed. Alles waarvan het geheugengebruik schaalt met het aantal keer dat een loop doorlopen wordt is een potentieel probleem. Geheugengebruik per script is vaak erg beperkt op een shared hosting en zelfs op een andere server wil je gewoon niet dat je script "ineens" stuk gaat wanneer je feed groter wordt dan X.
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic