Dokuz Sistem
Dokuz Sistem BİLİŞİM TEKNOLOJİLERİ
DSOpenServer
DSOpen DokuzSistem Open Server · Açık Kaynak
DSOpenServer / VOpenScript_ExcelImport v1.0.0 PHP 8.x MIT Lisans

VOpenScript
Excel Import Paketi

Dokuz Sistem Bilişim tarafından açık kaynak olarak yayınlanan bu paket; .xls / .xlsx formatındaki Excel dosyalarından Stok ve Müşteri verilerini MySQL'e güvenli şekilde aktarır. Tüm kod PHP 8 standartlarına taşınmış, SQL injection ve XSS korumaları eklenmiştir.

2 Script · Stok & Müşteri Aktarım
·
PDO Prepared Statements
·
XLS, XLSX, CSV desteği
·
📍 Aydın, Türkiye · Dokuz Sistem 2025
2019 yılında Aydın'da kurulan Dokuz Sistem; ERP sistemleri arası entegrasyon, veri taşıma ve büyük veri analizleri konusunda uzmanlaşmış bir yazılım firmasıdır. Bu paket, şirket içi kullanılan aktarım scriptlerinin toplulukla paylaşıldığı DSOpen açık kaynak girişimi kapsamında yayınlanmıştır. · dokuzsistem.com →
// 01 · GENEL BAKIŞ

Paket Hakkında

VOpenScript ExcelImport, Dokuz Sistem'in kurumsal ERP entegrasyon projelerinde kullandığı Excel aktarım modüllerinin PHP 8 uyumlu, güvenlik sıkılaştırılmış ve açık kaynak olarak yayınlanmış versiyonudur. Pakette iki ayrı script bulunur: Stok Aktarım ve Müşteri Aktarım.

📦

Stok Aktarım

stokkod, stokad, grupkod, birim, kdv, alış/satış fiyatı alanlarını aktarır.

👤

Müşteri Aktarım

musterikod, unvan, vergi dairesi/no, telefon, adres, ilgili kişi alanlarını aktarır.

🔒

SQL Injection Yok

Tüm INSERT/SELECT sorguları PDO Prepared Statements ile yürütülür.

🛡️

XSS Koruması

Her HTML çıktısı htmlspecialchars() ile temizlenir.

📊

Çoklu Format

XLS (BIFF7/BIFF8), XLSX ve CSV otomatik algılanır.

PHP 8 Native

Typed properties, null-safe operatör, strict types, @ operatörü yok.

// 02 · SCRİPTLER

Script Detayları

📦

stokimport.php

Excel'den stok verisi aktarımı · 9 sütun

Stok verilerini Excel dosyasından okuyarak stok tablosuna ekler. Mükerrer stokkod kontrolü yapılır, var olan kayıt atlanır ve kullanıcıya bildirilir.

Veritabanı Tablosu

SQL
CREATE TABLE stok (
  id         INT AUTO_INCREMENT PRIMARY KEY,
  stokkod    VARCHAR(50)   NOT NULL UNIQUE,
  stokad     VARCHAR(255)  NOT NULL,
  grupkod    VARCHAR(50)   DEFAULT '',
  ekgrupkod  VARCHAR(50)   DEFAULT '',
  birim      VARCHAR(20)   DEFAULT '',
  kdvoran    DECIMAL(5,2) DEFAULT 0,
  aciklama   TEXT,
  alisfiyat  DECIMAL(10,2) DEFAULT 0,
  satisfiyat DECIMAL(10,2) DEFAULT 0,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB CHARSET=utf8mb4;

Excel Sütun Düzeni

⚠️

1. satır başlık satırıdır — script otomatik atlar. Veriler 2. satırdan başlamalıdır.

Sütun$Row IndexAlanÖrnek
A$Row[0]stokkodSTK001
B$Row[1]stokadAhşap Masa
C$Row[2]grupkodMOB
D$Row[3]ekgrupkodMOB-AH
E$Row[4]birimADET
F$Row[5]kdvoran18
G$Row[6]aciklama180x80 cm doğal ahşap
H$Row[7]alisfiyat1200.00
I$Row[8]satisfiyat1850.00
👤

musteriimport.php

Excel'den müşteri verisi aktarımı · 11 sütun

Müşteri verilerini Excel dosyasından okuyarak musteri tablosuna ekler. Mükerrer musterikod kontrolü yapılır. Vergi numarası, adres ve iletişim bilgileri dahil tüm alanları destekler.

Veritabanı Tablosu

SQL
CREATE TABLE musteri (
  id            INT(11) NOT NULL AUTO_INCREMENT,
  musterikod    VARCHAR(50)  DEFAULT NULL,
  musteriunvan  VARCHAR(100) DEFAULT NULL,
  grupkod       VARCHAR(100) DEFAULT NULL,
  ekgrupkod     VARCHAR(100) DEFAULT NULL,
  ilgilikisi    VARCHAR(100) DEFAULT NULL,
  vd            VARCHAR(50)  DEFAULT NULL,  -- vergi dairesi
  vn            VARCHAR(11)  DEFAULT NULL,  -- vergi numarası
  telno         VARCHAR(20)  DEFAULT NULL,
  adres         VARCHAR(250) DEFAULT NULL,
  aciklama      VARCHAR(250) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB CHARSET=utf8 COLLATE=utf8_turkish_ci;

Excel Sütun Düzeni

⚠️

1. satır başlık satırıdır — script otomatik atlar. Veriler 2. satırdan başlamalıdır.

Sütun$Row IndexAlanÖrnek
A$Row[0]musterikodMUS001
B$Row[1]musteriunvanAhmet Yılmaz Ltd. Şti.
C$Row[2]grupkodKURUMSAL
D$Row[3]ekgrupkodAYDIN
E$Row[4]ilgilikisiAyşe Kaya
F$Row[5]vd (Vergi Dairesi)Efeler V.D.
G$Row[6]vn (Vergi No)1234567890
H$Row[7]telno0532 123 45 67
I$Row[8]adresCumhuriyet Mah. Atatürk Cad. No:5 Efeler/Aydın
J$Row[9]aciklamaÖncelikli müşteri
// 03 · KURULUM

Hızlı Kurulum

  1. Repoyu klonla

    GitHub'dan projeyi yerel ortamınıza indirin.

    terminal
    git clone https://github.com/DSOpenServer/VOpenScript_ExcelImport.git
    cd VOpenScript_ExcelImport
  2. Veritabanı tablolarını oluştur

    Yukarıdaki iki SQL bloğunu (stok + musteri) phpMyAdmin'de çalıştırın.

  3. Bağlantı bilgilerini güncelle

    classes/dbClass.php
    private string $host    = "localhost";
    private string $user    = "root";         // kullanıcı adı
    private string $pass    = "";            // şifre
    private string $db      = "veritabani";  // db adı
    private string $charset = "utf8mb4";
  4. uploads/ klasörünü oluştur (her iki script için)

    terminal
    mkdir excelimport/uploads
    chmod 755 excelimport/uploads
  5. Tarayıcıdan aç

    URL
    http://localhost/VOpenScript_ExcelImport/excelimport/stokimport.php
    http://localhost/VOpenScript_ExcelImport/excelimport/musteriimport.php
// 04 · DOSYA YAPISI

Klasör Yapısı

VOpenScript_ExcelImport/
├── index.php ← Bu dokümantasyon sayfası
├── classes_include.php ← Sınıf yükleyici
├── README.md
├── classes/
│ └── dbClass.php ← PDO veritabanı sınıfı
└── excelimport/
├── stokimport.php ← Stok aktarım (PHP 8)
├── musteriimport.php ← Müşteri aktarım (PHP 8)
├── stoklar.xlsx ← Örnek stok Excel şablonu
├── musteriler.xlsx ← Örnek müşteri Excel şablonu
├── uploads/ ← Geçici yükleme (chmod 755)
└── vendor/
├── SpreadsheetReader.php
├── SpreadsheetReader_XLS.php
├── SpreadsheetReader_XLSX.php
├── SpreadsheetReader_CSV.php
├── SpreadsheetReader_ODS.php
└── excel_reader2.php ← BIFF7/BIFF8 okuyucu
ℹ️

Yeşil dosyalar PHP 8'e dönüştürülmüş versiyonlardır.

// 05 · URL REFERANS

URL Referansı

MetodURLAçıklama
GET http://localhost/VOpenScript_ExcelImport/ Dokümantasyon (bu sayfa)
GET …/excelimport/stokimport.php Stok aktarım formu
POST …/excelimport/stokimport.php Excel'i işle → stok tablosuna yaz
GET …/excelimport/musteriimport.php Müşteri aktarım formu
POST …/excelimport/musteriimport.php Excel'i işle → musteri tablosuna yaz
GET …/excelimport/stoklar.xlsx Stok Excel şablonunu indir
GET …/excelimport/musteriler.xlsx Müşteri Excel şablonunu indir

POST Parametreleri (her iki script için aynı)

ParametreTipAçıklama
file FILE Yüklenecek .xls veya .xlsx dosyası
import STRING Submit butonunun name değeri — form gönderildiğinde mevcut olur
// 06 · KOD ÖRNEKLERİ

Kod Örnekleri

Excel Okuma Döngüsü (her iki script aynı yapıyı kullanır)

stokimport.php / musteriimport.php
$Reader     = new SpreadsheetReader($targetPath);
$sheetCount = count($Reader->sheets());

for ($i = 0; $i < $sheetCount; $i++) {
    $Reader->ChangeSheet($i);
    $satir = 0;

    foreach ($Reader as $Row) {
        if ($satir === 0) { $satir++; continue; } // başlık atla

        $alan = trim((string)($Row[N] ?? '')); // PHP 8 null-safe okuma
        $satir++;
    }
}

Prepared Statement — Müşteri INSERT

musteriimport.php
        $dba->safeQuery(
            "INSERT INTO musteri
             (musterikod,musteriunvan,grupkod,ekgrupkod,ilgilikisi,vd,vn,telno,adres,aciklama)
             VALUES (?,?,?,?,?,?,?,?,?,?)",
            [$musterikod,$musteriunvan,$grupkod,$ekgrupkod,
             $ilgilikisi,$vd,$vn,$telno,$adres,$aciklama]
        );

Prepared Statement — Stok INSERT

stokimport.php
        $dba->safeQuery(
            "INSERT INTO stok
             (stokkod,stokad,grupkod,ekgrupkod,birim,kdvoran,aciklama,alisfiyat,satisfiyat)
             VALUES (?,?,?,?,?,?,?,?,?)",
            [$stokkod,$stokad,$grupkod,$ekgrupkod,
             $birim,$kdvoran,$aciklama,$alisfiyat,$satisfiyat]
        );

Mükerrer Kontrol — Müşteri

musteriimport.php
$stmt  = $dba->safeQuery(
    "SELECT COUNT(id) AS sayi FROM musteri WHERE musterikod = ?", [$musterikod]
);
$sonuc = $dba->fetch_object($stmt);

if ((int)$sonuc->sayi > 0) {
    $message .= htmlspecialchars($musterikod, ENT_QUOTES, 'UTF-8')
        . ' kodlu müşteri zaten var, atlandı.<br>';
}
// 07 · DBCLASS

dbClass API Referansı

PDO tabanlı veritabanı sınıfı. Her iki script bu sınıfı kullanır.

MetodParametrelerDöndürürAçıklama
connect()PDO Bağlantı kurar, hata → die()
safeQuery($sql, $p)string, arrayPDOStatement ✅ Prepared statement — her zaman bunu kullanın
query($sql)stringPDOStatement Parametresiz sorgular için (kullanıcı girdisi olmayan)
fetch_object($stmt)PDOStatementobject|false Bir satırı nesne olarak döndürür
num_rows($stmt)PDOStatementint Satır sayısı
insert_id()string Son INSERT'in otomatik artan ID'si
// 08 · GÜVENLİK

Güvenlik Notları

🚨

Orijinal kodda SQL Injection ve XSS açıkları mevcuttu. Bu versiyon her ikisini de kapatmaktadır.

SQL Injection Koruması

Tüm kullanıcı girdileri ? placeholder ile bağlanır, PDO otomatik kaçışlar.

XSS Koruması

Her HTML çıktısı htmlspecialchars($val, ENT_QUOTES, 'UTF-8') ile temizlenir.

Dosya Yükleme Güvenliği

MIME tipi whitelist kontrolü, basename() ile dizin geçişi engeli, işlem sonrası unlink() ile geçici dosya silme.

PHP 8 Geliştirmeleri

SorunEski (PHP 4/5)Yeni (PHP 8)
Constructorfunction OLERead()public function __construct()
Hata bastırma@$sonuc = fetch()while ($row = fetch())
Null erişim$Row[0] → Warning$Row[0] ?? ''
Erişim belirleyicivar $datapublic string $data
Tip bildirimiYokfunction read(string $f): bool
⚠️

Prodüksiyonda veritabanı şifresini kaynak kodda bırakmayın. .env dosyası kullanın ve .gitignore'a ekleyin.