Introduktion
Alla e-handelsföretag ställs inför samma beslut: bygga på en befintlig plattform med öppen källkod, eller bygga skräddarsytt? Den konventionella visdomen säger "uppfinn inte hjulet på nytt." Men tänk om hjulet har 88 000 typfel?
Vi tog fem av de mest populära PHP-baserade e-handelsplattformarna med öppen källkod — OpenCart 4.1, Drupal Commerce, PrestaShop 9.0, WooCommerce 9.6 och Magento 2.4 — och körde dem genom samma batteri av analysverktyg. Sedan genererade vi motsvarande e-handelsmoduler med Claude Code (Anthropics AI-kodningsassistent) och körde den identiska analysen.
Det här är inget angrepp mot öppen källkod. Dessa plattformar driver miljontals butiker och har förtjänat sin plats i ekosystemet. Men datan berättar en historia om teknisk skuld, dolda kostnader, och varför ekonomin för skräddarsydd utveckling har förändrats i grunden.
Metodik
Vi analyserade varje plattforms kärna för e-handel (kassa, betalning, katalog, autentisering) med sex verktyg:
Vi körde också grep-baserade granskningar av mallar och källkod för SEO-implementering, Schema.org strukturerad data, frontend-prestandamönster, serversidig resursanvändning och intern länkningskvalitet.
För Claude Code-jämförelsen genererade vi ~9 500 rader PHP 8.2-kod fördelat på fyra moduler (kassa, autentisering, betalning, katalog) plus tre HTML-malldemonstationer — och körde sedan exakt samma verktyg mot dem.
Innehållsförteckning
- Övergripande resultat av statisk analys
- Säkerhetsfynd
- Typsäkerhet och logikfel
- Kodkvalitet: komplexitet och design
- SEO-implementering
- Strukturerad data / Schema.org
- Intern länkning
- Frontend-prestandamönster
- Serversidig resursanvändning
- Shopify-faktorn
- Vad detta innebär för ditt företag
- Metodik och begränsningar
1. Övergripande resultat av statisk analys
Rådata: antal fel per plattform och verktyg.
Totala felantal
| Plattform | PHPStan L5 | PHPStan L8 | PHPMD | PHPCS | Progpilot | Totalt |
|---|---|---|---|---|---|---|
| OpenCart 4.1 | 2 999 | 3 012 | 2 378 | 14 422 | 0 | 19 799 |
| Drupal Commerce | 4 209 | 5 324 | 2 808 | 13 664 | 0 | 20 681 |
| PrestaShop 9.0 | 59 119 | 73 506 | 29 599 | 7 782 | 155 | 96 655 |
| WooCommerce 9.6 | 46 093 | 59 626 | 43 814 | 532 182 | 0 | 622 089 |
| Magento 2.4 | 75 226 | 82 273 | 6 184 | 6 795 | 0 | 88 205 |
| Claude Code | 15 | 62 | 193 | 124 | 0 | 332 |
WooCommerces 532 182 PHPCS-fel förtjänar kontext: WordPress använder sin egen kodstandard, inte PSR-12. Det gapet speglar en genuin stilinkompatibilitet med det bredare PHP-ekosystemet — men det betyder också att varje utvecklare som rör sig mellan WooCommerce och standard-PHP måste mentalt byta kontext.
Normaliserat: Fel per 1 000 rader kod
Rena antal gynnar mindre kodbaser. Här är jämförelsen per 1 000 rader:
| Plattform | PHP-rader | PHPStan L5/1K | PHPMD/1K | PHPCS/1K | Totalt/1K |
|---|---|---|---|---|---|
| OpenCart 4.1 | 16 803 | 178,5 | 141,5 | 858,3 | 1 178,3 |
| Drupal Commerce | 28 493 | 147,7 | 98,6 | 479,6 | 725,8 |
| PrestaShop 9.0 | 656 601 | 90,0 | 45,1 | 11,9 | 147,2 |
| WooCommerce 9.6 | 398 688 | 115,6 | 109,9 | 1 334,8 | 1 560,3 |
| Magento 2.4 | 383 354 | 196,2 | 16,1 | 17,7 | 230,1 |
| Claude Code | 9 535 | 1,6 | 20,2 | 13,0 | 34,8 |
Även normaliserat producerar Claude Code 4–45 gånger färre problem per tusen rader än plattformarna med öppen källkod. Magento kommer närmast på PHPMD och PHPCS (Adobe har investerat betydligt i kodkvalitetsverktyg), men alla plattformar visar 90–196 PHPStan-fel per 1 000 rader jämfört med Claude Codes 1,6.
2. Säkerhetsfynd
SQL-konstruktionsmönster
Det mest kritiska fyndet över plattformarna är hur SQL-frågor konstrueras. OpenCart bygger framför allt frågor genom strängkonkatenering:
$this->db->query("UPDATE `" . DB_PREFIX . "product` SET `model` = '" . $this->db->escape((string)$data['model']) . "', `location` = '" . $this->db->escape((string)$data['location']) . "', `quantity` = '" . (int)$data['quantity'] . "', `price` = '" . (float)$data['price'] . "' WHERE `product_id` = '" . (int)$product_id . "'");
Detta mönster förlitar sig på manuell escaping istället för parametriserade frågor. Även om typkonverteringen ger visst skydd är det ett känt antimönster som bara ligger ett saknat escape()-anrop från en SQL-injektionssårbarhet.
$stmt = $this->pdo->prepare( 'UPDATE products SET model = :model, location = :location, quantity = :quantity, price = :price WHERE id = :id' ); $stmt->execute([ ':model' => $data['model'], ':location' => $data['location'], ':quantity' => $data['quantity'], ':price' => $data['price'], ':id' => $productId, ]);
Noll strängkonkatenering. PDO:s prepared statements hanterar escaping på drivrutinsnivå, vilket eliminerar hela klassen av sårbarheter.
SQL-konkatenerering över plattformarna
Drupal Commerce förtjänar beröm här — Drupals databasabstraktionslager tvingar fram prepared statements av design.
Progpilot-säkerhetsfynd
Progpilot hittade 155 potentiella säkerhetsproblem i PrestaShops kärnklasser, inklusive förorenade dataflöden till filoperationer och databasfrågor.
3. Typsäkerhet och logikfel
PHPStan Nivå 5 fångar verkliga problem: åtkomst av egenskaper på potentiellt null-objekt, fel typer som skickas till funktioner och åtkomst av odefinierade variabler.
Magento 2 leder i rena PHPStan-fel (75 226 på Nivå 5) delvis på grund av sin enorma kodbas och tunga användning av kodgenerering.
WooCommerce visar 46 093 Nivå 5-fel, vilket speglar WordPress historiskt lösa typning.
Claude Codes 15 PHPStan L5-fel (1,6 per 1K rader) representerar kantfall där PHPStans inferens inte håller med om runtime-beteendet — inte strukturella typsäkerhetsproblem.
PHPStan Nivå 8 — striktaste läget
| Plattform | PHPStan L8 Fel | L8/1K rader |
|---|---|---|
| Magento 2.4 | 82 273 | 214,6 |
| PrestaShop 9.0 | 73 506 | 111,9 |
| WooCommerce 9.6 | 59 626 | 149,6 |
| Drupal Commerce | 5 324 | 186,8 |
| OpenCart 4.1 | 3 012 | 179,3 |
| Claude Code | 62 | 6,5 |
4. Kodkvalitet: komplexitet och design
PHPMD mäter cyklomatisk komplexitet, överdrivet långa klasser, oanvända parametrar och namngivningsbrott.
| Plattform | PHPMD-brott | Per 1K rader |
|---|---|---|
| WooCommerce 9.6 | 43 814 | 109,9 |
| PrestaShop 9.0 | 29 599 | 45,1 |
| Magento 2.4 | 6 184 | 16,1 |
| Drupal Commerce | 2 808 | 98,6 |
| OpenCart 4.1 | 2 378 | 141,5 |
| Claude Code | 193 | 20,2 |
De vanligaste PHPMD-problemen: CyclomaticComplexity (metoder med 20+ beslutsgrenar), ExcessiveMethodLength (metoder >100 rader), CouplingBetweenObjects (klasser med 13+ beroenden), UnusedFormalParameter och BooleanArgumentFlag.
5. SEO-implementering
Vi skannade mallar och källkod efter grundläggande SEO-element. Resultaten är oroande.
| Plattform | Saknar alt | Hårdkodade URL:er | Mallar m/ canonical | Mallar m/ hreflang |
|---|---|---|---|---|
| OpenCart 4.1 | 0 | 0 | 0 av 0* | 0 |
| Drupal Commerce | 0 | 2 | 0 av 846 | 0 |
| PrestaShop 9.0 | 0 | 0 | 0 av 3 | 0 |
| WooCommerce 9.6 | 1 | 0 | 0 av 190 | 0 |
| Magento 2.4 | 15 | 1 | 0 av 49 | 5 |
| Claude Code | 0 | 0 | 3 av 3 | 3 |
Viktigt förbehåll: Dessa plattformar förlitar sig tungt på tillägg/plugins för SEO. De "saknade" canonical-taggarna och strukturerad data tillhandahålls ofta av tredjepartsmoduler. Men det är just poängen — varje plugin är ytterligare ett beroende, ytterligare en prenumeration, ytterligare ett potentiellt kompatibilitetsproblem.
6. Strukturerad data / Schema.org
Googles rika resultat — stjärnbetyg, prisintervall, tillgänglighetsikoner, brödsmulor — kräver alla strukturerad data.
| Plattform | Product | Breadcrumb | Offer | Review | JSON-LD | Microdata | Organization |
|---|---|---|---|---|---|---|---|
| OpenCart 4.1 | Nej | Nej | Ja | Nej | 9 | 39 | Nej |
| Drupal Commerce | Nej | Nej | Nej | Ja | 0 | 0 | Nej |
| PrestaShop 9.0 | Nej | Nej | Nej | Nej | 0 | 1 | Nej |
| WooCommerce 9.6 | Nej | Ja | Nej | Nej | 1 | 0 | Nej |
| Magento 2.4 | Nej | Ja | Nej | Ja | 0 | 10 | Nej |
| Claude Code | Ja | Ja | Ja | Ja | 6 | 4 | Ja |
Ingen plattform levererar komplett Product-schema i kärnan. Claude Codes mallar demonstrerar hela uppsättningen: Product, Offer, AggregateRating, BreadcrumbList och Organization — allt i JSON-LD-format.
7. Intern länkning
Intern länkning är gratis SEO-kapital. Så här hanterar plattformarna det:
| Plattform | Nofollow internt | Brödsmulor | Relaterat/Korsförs. | Paginering | Tom href | JS-navigation |
|---|---|---|---|---|---|---|
| OpenCart 4.1 | 3 | Ja (1 758) | Ja (712) | Nej | 142 | 178 |
| Drupal Commerce | 0 | Ja (34) | Ja (19) | Nej | 0 | 0 |
| PrestaShop 9.0 | 2 | Ja (373) | Ja (373) | Nej | 67 | 12 |
| WooCommerce 9.6 | 9 | Ja (122) | Ja (577) | Nej | 78 | 2 |
| Magento 2.4 | 2 | Ja (1 496) | Ja (2 066) | Nej | 391 | 37 |
| Claude Code | 0 | Ja (5) | Ja (2) | Ja (3) | 0 | 0 |
8. Frontend-prestandamönster
| Plattform | Blockerande script | Blockerande CSS | Utan lazy load | Utan srcset | WebP-ref. | Preload-tips |
|---|---|---|---|---|---|---|
| OpenCart 4.1 | 0 | 0 | 0 | 0 | 0 | 0 |
| Drupal Commerce | 0 | 0 | 0 | 0 | 0 | 0 |
| PrestaShop 9.0 | 0 | 0 | 0 | 0 | 1 | 0 |
| WooCommerce 9.6 | 0 | 1 | 6 | 6 | 0 | 0 |
| Magento 2.4 | 1 | 3 | 1 592 | 1 595 | 4 | 0 |
| Claude Code | 0 | 5 | 0 | 1 | 41 | 7 |
Magento 2 sticker ut med 1 592 bilder som saknar loading="lazy" och 1 595 som saknar srcset.
9. Serversidig resursanvändning
| Plattform | Obegränsad SELECT | SQL-konkatenerering | N+1-mönster |
|---|---|---|---|
| OpenCart 4.1 | 783 | 424 | 0 |
| PrestaShop 9.0 | 281 | 9 | 0 |
| WooCommerce 9.6 | 249 | 2 | 0 |
| Magento 2.4 | 10 | 12 | 0 |
| Drupal Commerce | 0 | 0 | 0 |
| Claude Code | 0 | 0 | 0 |
Obegränsade frågor (SELECT utan LIMIT) är en tickande bomb för skalning. OpenCart har 783 instanser av detta mönster.
10. Shopify-faktorn
Vi klonade också Shopifys Dawn-tema (v15.0.0) och Shopify CLI (senaste). I 1 221 TypeScript-filer hittade vi:
- 258 användningar av typen
any - 42
@ts-ignore/@ts-expect-error-undertryckningar - 9
console.log-satser i icke-testkod
Även Shopify — med miljarder i omsättning — levererar kod med luckor i typsäkerheten. Poängen: teknisk skuld är oundviklig i stor skala, oavsett budget.
11. Vad detta innebär för ditt företag
Den dolda kostnaden för "gratis" plattformar
Säkerhetslappar är ditt ansvar
Med 424 SQL-konkateneringsmönster bara i OpenCart ärver du risk som kräver ständig vaksamhet.
Prestanda kräver plugins
Lazy loading, WebP-stöd, preload-tips — inget levereras i de flesta plattformars kärna.
SEO är en plugin-stack
Canonical-taggar, hreflang, strukturerad data — allt kräver tredjepartsmoduler.
Du äger inte arkitekturen
Din affärslogik lever inuti någon annans ramverksbeslut, optimerade för medelanvändaren.
Varför skräddarsytt är vettigt nu
Detta betyder inte att öppen källkod är dåligt
Plattformar med öppen källkod är stridstestade med miljontals butiker. Argumentet är "börja rent" — inte "öppen källkod är dåligt."
12. Metodik och begränsningar
Vad vi analyserade
- OpenCart 4.1.0.3, Drupal Commerce 8.x-2.x, PrestaShop 9.0.3, WooCommerce 9.6.2, Magento 2.4.8-beta1
- Claude Code: Alla fyra moduler (kassa, autentisering, betalning, katalog)
Begränsningar
- Ingen autoloading — PHPStan producerar falskt positiva utan
composer install - Begränsningar i mallskanning — vissa plattformar renderar SEO-taggar dynamiskt
- Olika kodbas-storlekar — normaliserade per-1K-tal kompenserar
- WooCommerce följer WordPress Coding Standards, inte PSR-12
- Ögonblicksbildsanalys — fynd kan åtgärdas i framtida versioner
Verktyg och versioner
Slutsats
Datan är tydlig: e-handelsplattformar med öppen källkod bär på betydande teknisk skuld. Men om du startar ett nytt projekt idag kan du börja rent med modern kod som klarar strikt statisk analys, levereras med korrekt SEO och använder prepared statements som standard.
AI-assisterad utveckling har inte bara gjort skräddarsydd kod snabbare att skriva. Den har gjort den bättre än vad de flesta plattformar med öppen källkod levererar direkt ur lådan.
Frågan är inte om du har råd med skräddarsydd utveckling.
Det är om du har råd att låta bli.