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.
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.
stokkod, stokad, grupkod, birim, kdv, alış/satış fiyatı alanlarını aktarır.
musterikod, unvan, vergi dairesi/no, telefon, adres, ilgili kişi alanlarını aktarır.
Tüm INSERT/SELECT sorguları PDO Prepared Statements ile yürütülür.
Her HTML çıktısı htmlspecialchars() ile temizlenir.
XLS (BIFF7/BIFF8), XLSX ve CSV otomatik algılanır.
Typed properties, null-safe operatör, strict types, @ operatörü yok.
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.
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;
1. satır başlık satırıdır — script otomatik atlar. Veriler 2. satırdan başlamalıdır.
| Sütun | $Row Index | Alan | Örnek |
|---|---|---|---|
| A | $Row[0] | stokkod | STK001 |
| B | $Row[1] | stokad | Ahşap Masa |
| C | $Row[2] | grupkod | MOB |
| D | $Row[3] | ekgrupkod | MOB-AH |
| E | $Row[4] | birim | ADET |
| F | $Row[5] | kdvoran | 18 |
| G | $Row[6] | aciklama | 180x80 cm doğal ahşap |
| H | $Row[7] | alisfiyat | 1200.00 |
| I | $Row[8] | satisfiyat | 1850.00 |
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.
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;
1. satır başlık satırıdır — script otomatik atlar. Veriler 2. satırdan başlamalıdır.
| Sütun | $Row Index | Alan | Örnek |
|---|---|---|---|
| A | $Row[0] | musterikod | MUS001 |
| B | $Row[1] | musteriunvan | Ahmet Yılmaz Ltd. Şti. |
| C | $Row[2] | grupkod | KURUMSAL |
| D | $Row[3] | ekgrupkod | AYDIN |
| E | $Row[4] | ilgilikisi | Ayşe Kaya |
| F | $Row[5] | vd (Vergi Dairesi) | Efeler V.D. |
| G | $Row[6] | vn (Vergi No) | 1234567890 |
| H | $Row[7] | telno | 0532 123 45 67 |
| I | $Row[8] | adres | Cumhuriyet Mah. Atatürk Cad. No:5 Efeler/Aydın |
| J | $Row[9] | aciklama | Öncelikli müşteri |
GitHub'dan projeyi yerel ortamınıza indirin.
git clone https://github.com/DSOpenServer/VOpenScript_ExcelImport.git
cd VOpenScript_ExcelImport
Yukarıdaki iki SQL bloğunu (stok + musteri) phpMyAdmin'de çalıştırın.
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";
mkdir excelimport/uploads chmod 755 excelimport/uploads
http://localhost/VOpenScript_ExcelImport/excelimport/stokimport.php http://localhost/VOpenScript_ExcelImport/excelimport/musteriimport.php
Yeşil dosyalar PHP 8'e dönüştürülmüş versiyonlardır.
| Metod | URL | Açı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 |
| Parametre | Tip | Açıklama |
|---|---|---|
file |
FILE | Yüklenecek .xls veya .xlsx dosyası |
import |
STRING | Submit butonunun name değeri — form gönderildiğinde mevcut olur |
$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++; } }
$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] );
$dba->safeQuery( "INSERT INTO stok (stokkod,stokad,grupkod,ekgrupkod,birim,kdvoran,aciklama,alisfiyat,satisfiyat) VALUES (?,?,?,?,?,?,?,?,?)", [$stokkod,$stokad,$grupkod,$ekgrupkod, $birim,$kdvoran,$aciklama,$alisfiyat,$satisfiyat] );
$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>'; }
PDO tabanlı veritabanı sınıfı. Her iki script bu sınıfı kullanır.
| Metod | Parametreler | Döndürür | Açıklama |
|---|---|---|---|
connect() | — | PDO |
Bağlantı kurar, hata → die() |
safeQuery($sql, $p) | string, array | PDOStatement |
✅ Prepared statement — her zaman bunu kullanın |
query($sql) | string | PDOStatement |
Parametresiz sorgular için (kullanıcı girdisi olmayan) |
fetch_object($stmt) | PDOStatement | object|false |
Bir satırı nesne olarak döndürür |
num_rows($stmt) | PDOStatement | int |
Satır sayısı |
insert_id() | — | string |
Son INSERT'in otomatik artan ID'si |
Orijinal kodda SQL Injection ve XSS açıkları mevcuttu. Bu versiyon her ikisini de kapatmaktadır.
Tüm kullanıcı girdileri ? placeholder ile bağlanır, PDO otomatik kaçışlar.
Her HTML çıktısı htmlspecialchars($val, ENT_QUOTES, 'UTF-8') ile temizlenir.
MIME tipi whitelist kontrolü, basename() ile dizin geçişi engeli, işlem sonrası unlink() ile geçici dosya silme.
| Sorun | Eski (PHP 4/5) | Yeni (PHP 8) |
|---|---|---|
| Constructor | function OLERead() | public function __construct() |
| Hata bastırma | @$sonuc = fetch() | while ($row = fetch()) |
| Null erişim | $Row[0] → Warning | $Row[0] ?? '' |
| Erişim belirleyici | var $data | public string $data |
| Tip bildirimi | Yok | function read(string $f): bool |
Prodüksiyonda veritabanı şifresini kaynak kodda bırakmayın. .env dosyası kullanın ve .gitignore'a ekleyin.