PNG  IHDR* pHYs+ IDATx]n#; cdLb Ǚ[at¤_:uP}>!Usă cag޿ ֵNu`ݼTâabO7uL&y^wFٝA"l[|ŲHLN밪4*sG3|Dv}?+y߉{OuOAt4Jj.u]Gz*҉sP'VQKbA1u\`& Af;HWj hsO;ogTu uj7S3/QzUr&wS`M$X_L7r2;aE+ώ%vikDA:dR+%KzƉo>eOth$z%: :{WwaQ:wz%4foɹE[9<]#ERINƻv溂E%P1i01 |Jvҗ&{b?9g=^wζXn/lK::90KwrюO\!ջ3uzuGv^;騢wq<Iatv09:tt~hEG`v;3@MNZD.1]L:{ծI3`L(÷ba")Y.iljCɄae#I"1 `3*Bdz>j<fU40⨬%O$3cGt]j%Fߠ_twJ;ABU8vP3uEԑwQ V:h%))LfraqX-ۿX]v-\9I gl8tzX ]ecm)-cgʒ#Uw=Wlێn(0hPP/ӨtQ“&J35 $=]r1{tLuǮ*i0_;NƝ8;-vݏr8+U-kruȕYr0RnC]*ެ(M:]gE;{]tg(#ZJ9y>utRDRMdr9㪩̞zֹb<ģ&wzJM"iI( .ꮅX)Qw:9,i좜\Ԛi7&N0:asϓc];=ΗOӣ APqz93 y $)A*kVHZwBƺnWNaby>XMN*45~ղM6Nvm;A=jֲ.~1}(9`KJ/V F9[=`~[;sRuk]rєT!)iQO)Y$V ی ۤmzWz5IM Zb )ˆC`6 rRa}qNmUfDsWuˤV{ Pݝ'=Kֳbg,UҘVz2ﴻnjNgBb{? ߮tcsͻQuxVCIY۠:(V뺕 ٥2;t`@Fo{Z9`;]wMzU~%UA蛚dI vGq\r82iu +St`cR.6U/M9IENDB` REDROOM
PHP 5.6.40
Preview: PHP_SORGULARI.md Size: 21.79 KB
/home/ankaservis/servis.ankaservis.com/muhasebe/docs/PHP_SORGULARI.md

# PHP Sorguları Dokümantasyonu

## Genel Bakış
Bu dokümantasyon, PHP dosyalarında kullanılan SQL sorgularını, parametrelerini ve önemli notları içerir.

---

## Sorgu Tipleri ve Kullanımları

### SELECT Sorguları

#### 1. Müşteri Bilgileri
```php
// Müşteri detay bilgisi
$sql = "SELECT * FROM musteriler WHERE ID='$musteri_id'";
$result = mysql_query($sql, $baglanti);

// Müşteri cari hareketleri
$sql = "SELECT * FROM carihareket WHERE cariid='$musteri_id' ORDER BY id DESC";
$result = mysql_query($sql, $baglanti);

// Tarih aralığına göre cari hareketler
$sql = "SELECT * FROM carihareket 
        WHERE sorgutarih BETWEEN '$tarih1' AND '$tarih2' 
        AND cariid='$musteri_id'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `Musteri.php`
- `cari_tarih_sorgu.php`
- `Musteri_borc.php`

**Önemli Notlar:**
- `sorgutarih` alanı tarih aralığı sorguları için kullanılır
- `tarih` alanı text formatında, `sorgutarih` date formatında
- **DİKKAT:** `carihareket` tablosunda müşteri ID için `cariid` kullanılır, `MID` değil!

---

#### 2. Servis Bilgileri
```php
// Servis detay bilgisi
$sql = "SELECT * FROM girisler WHERE GID='$servis_id'";
$result = mysql_query($sql, $baglanti);

// Teknisyene atanan servisler
$sql = "SELECT * FROM girisler 
        WHERE yeni_personel='$teknisyen_id' 
        AND sonlandir='0' 
        ORDER BY GID DESC";
$result = mysql_query($sql, $baglanti);

// JOIN ile servis bilgileri (optimize edilmiş)
$sql = "SELECT g.*, 
        m.ID as mID, m.Ad_Soyad, m.Tel, m.Adres,
        ma.id as marka_id, ma.marka,
        ut.id as tur_id, ut.turu,
        sd.id as durum_id, sd.servisdurum, sd.renk
        FROM girisler g
        LEFT JOIN musteriler m ON g.MID = m.ID
        LEFT JOIN marka ma ON g.marka = ma.id
        LEFT JOIN urunturu ut ON g.turu = ut.id
        LEFT JOIN servisDurumu sd ON g.Gdurum = sd.id
        WHERE g.yeni_personel='$teknisyen_id' AND g.sonlandir='0' 
        ORDER BY g.GID DESC";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `ServisDuzen.php`
- `index.php`
- `personelis.php`
- `gun.php`
- `markaListele.php`
- `turListele.php`

**Önemli Notlar:**
- **DİKKAT:** `yeni_personel` kullanılmalı, `personel` değil!
- **DİKKAT:** `girisler` tablosunda müşteri ID için `MID` kullanılır
- JOIN kullanarak N+1 query problemi çözülmüştür

---

#### 3. Stok Bilgileri
```php
// Stok kartı bilgisi
$sql = "SELECT * FROM stokkartlari WHERE id='$stok_id'";
$result = mysql_query($sql, $baglanti);

// Stok hareketleri
$sql = "SELECT * FROM stokfishareketi WHERE fisid='$fis_id'";
$result = mysql_query($sql, $baglanti);

// Stok fişleri
$sql = "SELECT * FROM stokfisleri ORDER BY id DESC LIMIT 1";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `stokhareket.php`
- `parcamodul.php`
- `stokkartlari.php`

---

#### 4. Parça Modül Bilgileri
```php
// Servis parçaları
$sql = "SELECT * FROM parcamodul WHERE girisid='$servis_id' ORDER BY id ASC";
$result = mysql_query($sql, $baglanti);

// Parça toplamı
$sql = "SELECT SUM(toplam) as toplam FROM parcamodul WHERE girisid='$servis_id'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `parcamodul.php`
- `ServisDuzen.php`

---

#### 5. Hatırlatmalar
```php
// Hatırlatmalar (servis tablosunda cariid kullanılır!)
$sql = "SELECT * FROM servis WHERE durum='0' AND kullanici='$kullanici_id'";
$result = mysql_query($sql, $baglanti);

// Hatırlatma detayı
$sql = "SELECT * FROM servis WHERE id='$hatirlatma_id'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `index.php`
- `sistem/hatirlatmalar.php`
- `hatirlatma_duzen.php`

**Önemli Notlar:**
- **DİKKAT:** `servis` tablosunda müşteri ID için `cariid` kullanılır, `MID` değil!

---

### INSERT Sorguları

#### 1. Servis Ekleme
```php
$sql = "INSERT INTO girisler SET 
        MID='$musteri_id',
        yeni_personel='$teknisyen_id',
        GTarih='$tarih',
        HSikayet='$sikayet',
        marka='$marka_id',
        turu='$tur_id',
        Gdurum='$durum_id',
        sonlandir='0'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `servisekle.php`
- `sistem/servisekle.php`

**Önemli Notlar:**
- `yeni_personel` kullanılmalı
- `sonlandir` varsayılan olarak `'0'` (aktif)

---

#### 2. Cari Hareket Ekleme
```php
$sql = "INSERT INTO carihareket SET 
        cariid='$musteri_id',
        tarih='$tarih',
        saat='$saat',
        tur='BORC',
        aciklama='$aciklama',
        borc='$tutar',
        sorgutarih='$tarih_db',
        servisid='$servis_id',
        islemiyapan='$kullanici_id'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `parcamodul.php`
- `Musteri.php`

**Önemli Notlar:**
- `sorgutarih` alanı date formatında olmalı (`Y-m-d`)
- `tarih` alanı text formatında olabilir (`d.m.Y`)
- **DİKKAT:** Müşteri ID için `cariid` kullanılır, `MID` değil!

---

#### 3. Stok Fişi ve Hareket Ekleme
```php
// 1. Önce fiş oluştur
$sql = "INSERT INTO stokfisleri SET 
        tarih='$tarih',
        saat='$saat',
        tur='1',
        cariid='$musteri_id',
        depo='$depo_id',
        sahip='$sahip_id'";
$result = mysql_query($sql, $baglanti);

// 2. Oluşturulan fiş ID'sini al
$sql = "SELECT id FROM stokfisleri ORDER BY id DESC LIMIT 1";
$result = mysql_query($sql, $baglanti);
$fis_row = mysql_fetch_array($result);
$fis_id = isset($fis_row['id']) ? $fis_row['id'] : "";

// 3. Stok hareketi ekle
$sql = "INSERT INTO stokfishareketi SET 
        fisid='$fis_id',
        urunkodu='$urunkodu',
        urunadi='$urunadi',
        adet='$adet',
        alisfiyati='$alisfiyat',
        satisfiyati='$satisfiyat',
        alistoplam='$alistoplam',
        satistoplam='$satistoplam',
        toplam='$toplam',
        tarih='$tarih',
        tur='1',
        depo='$depo_id',
        sahip='$sahip_id'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `parcamodul.php`
- `stokhareket.php`

**Önemli Notlar:**
- **DİKKAT:** `fisid` alanı zorunlu (NOT NULL)
- **DİKKAT:** `alisfiyati` kullanılmalı, `birimmaliyet` değil!
- **DİKKAT:** `stokfisleri` tablosunda müşteri ID için `cariid` kullanılır, `MID` değil!

---

#### 4. Parça Modül Ekleme
```php
// Normal parça ekleme (fisid ile)
$sql = "INSERT INTO parcamodul SET 
        parcaid='$parca_id',
        girisid='$servis_id',
        adet='$adet',
        toplam='$toplam',
        fiyat='$fiyat',
        fisid='$fis_id'";
$result = mysql_query($sql, $baglanti);

// Manuel ekleme (fisid='0')
$sql = "INSERT INTO parcamodul SET 
        parcaid='0',
        girisid='$servis_id',
        adet='$adet',
        toplam='$toplam',
        fiyat='$fiyat',
        aciklama='$aciklama',
        tarih='$tarih',
        fisid='0'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `parcamodul.php`

**Önemli Notlar:**
- **DİKKAT:** `fisid` alanı NOT NULL, manuel eklemeler için `'0'` kullanılmalı

---

### UPDATE Sorguları

#### 1. Servis Güncelleme
```php
// Servis durumu güncelleme
$sql = "UPDATE girisler SET 
        Gdurum='$durum_id',
        sonlandir='$sonlandir'
        WHERE GID='$servis_id'";
$result = mysql_query($sql, $baglanti);

// Onarım merkezi güncelleme (NULL kontrolü ile)
$onarimmerkeziid = isset($_POST["onarimmerkezi"]) && !empty($_POST["onarimmerkezi"]) 
    ? intval($_POST["onarimmerkezi"]) 
    : "NULL";

$sql = "UPDATE girisler SET 
        onarimmerkezi=" . ($onarimmerkeziid == "NULL" ? "NULL" : "'$onarimmerkeziid'") . "
        WHERE GID='$servis_id'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `ServisDuzen.php`

**Önemli Notlar:**
- NULL değerler için özel kontrol yapılmalı
- Boş string gönderilmemeli, NULL kullanılmalı

---

#### 2. Cari Hareket Güncelleme
```php
$sql = "UPDATE carihareket SET 
        cariid='$musteri_id',
        tarih='$tarih',
        saat='$saat',
        tur='BORC',
        aciklama='$aciklama',
        borc='$tutar',
        servisid='$servis_id',
        islemiyapan='$kullanici_id'
        WHERE servisid='$servis_id' AND tur!='TAHSILAT'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `parcamodul.php`

**Önemli Notlar:**
- **DİKKAT:** Müşteri ID için `cariid` kullanılır, `MID` değil!

---

#### 3. Stok Hareket Güncelleme
```php
// Önce alış fiyatını al (alisfiyati kullanılmalı!)
$sql = "SELECT id, alisfiyati FROM stokfishareketi WHERE fisid='$fis_id' LIMIT 1";
$result = mysql_query($sql, $baglanti);
$row = mysql_fetch_array($result);
$alisfiyat = isset($row["alisfiyati"]) ? floatval($row["alisfiyati"]) : 0;

// Güncelle
$sql = "UPDATE stokfishareketi SET 
        adet='$adet',
        alistoplam='$alistoplam',
        satistoplam='$satistoplam',
        toplam='$toplam',
        sahip='$sahip_id'
        WHERE fisid='$fis_id'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `parcamodul.php`

**Önemli Notlar:**
- **DİKKAT:** `alisfiyati` kullanılmalı, `birimmaliyet` değil!

---

### DELETE Sorguları

#### 1. Parça Modül Silme
```php
$sql = "DELETE FROM parcamodul WHERE id='$parca_id'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `parcamodul.php`

---

#### 2. Cari Hareket Silme
```php
$sql = "DELETE FROM carihareket WHERE servisid='$servis_id'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `parcamodul.php`

---

#### 3. Stok Fişi ve Hareketleri Silme
```php
// Önce hareketleri sil
$sql = "DELETE FROM stokfishareketi WHERE fisid='$fis_id'";
$result = mysql_query($sql, $baglanti);

// Sonra fişi sil
$sql = "DELETE FROM stokfisleri WHERE id='$fis_id'";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `parcamodul.php`

**Önemli Notlar:**
- Önce ilişkili kayıtlar silinmeli (stokfishareketi)
- Sonra ana kayıt silinmeli (stokfisleri)

---

### Aggregate Sorguları (SUM, COUNT, GROUP BY)

#### 1. Müşteri Borç/Alacak Toplamları
```php
// Kötü: Her müşteri için ayrı sorgu (N+1 problem)
while($musteri = mysql_fetch_array($result)) {
    $borc_sql = "SELECT SUM(borc) as borc FROM carihareket WHERE cariid='$id'";
    $alacak_sql = "SELECT SUM(alacak) as alacak FROM carihareket WHERE cariid='$id'";
}

// İyi: Tek sorguda tüm bakiyeler (optimize edilmiş)
$sql = "SELECT cariid, 
        SUM(COALESCE(borc, 0)) as borc, 
        SUM(COALESCE(alacak, 0)) as alacak 
        FROM carihareket 
        GROUP BY cariid";
$result = mysql_query($sql, $baglanti);
$bakiyeler = array();
while($row = mysql_fetch_array($result)) {
    $bakiyeler[$row['cariid']] = array(
        'borc' => floatval($row['borc'] ?? 0),
        'alacak' => floatval($row['alacak'] ?? 0)
    );
}
```

**Kullanıldığı Dosyalar:**
- `Musteri_borc.php` (optimize edilmiş versiyon)

**Önemli Notlar:**
- **DİKKAT:** `carihareket` tablosunda müşteri ID için `cariid` kullanılır, `MID` değil!

---

#### 2. Servis Durum Sayımları
```php
// Kötü: Her durum için ayrı sorgu
foreach($durumlar as $durum_id) {
    $sql = "SELECT COUNT(*) FROM girisler WHERE Gdurum='$durum_id' AND sonlandir='0'";
}

// İyi: Tek sorguda tüm sayımlar (optimize edilmiş)
$sql = "SELECT Gdurum, COUNT(*) as sayi 
        FROM girisler 
        WHERE sonlandir='0' 
        GROUP BY Gdurum";
$result = mysql_query($sql, $baglanti);
$sayimlar = array();
while($row = mysql_fetch_array($result)) {
    $sayimlar[$row['Gdurum']] = $row['sayi'];
}
```

**Kullanıldığı Dosyalar:**
- `blok/menu_grafik.php` (optimize edilmiş versiyon)

---

#### 3. Tarih Aralığı Sorguları
```php
// Son 30 günlük stok hareketleri
$bugun = date("Y-m-d");
$baslangic = date("Y-m-01"); // Ayın ilk günü
$sql = "SELECT tarih, SUM(CAST(toplam AS DECIMAL(10,2))) as toplam 
        FROM stokfishareketi 
        WHERE tarih >= '$baslangic' AND tarih <= '$bugun' 
        GROUP BY tarih 
        ORDER BY tarih DESC";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `kasa_rapor.php` (optimize edilmiş versiyon)
- `kasa_rapor_sorgu.php`

**Önemli Notlar:**
- CAST kullanarak doğru decimal hesaplama yapılmalı
- Varsayılan olarak bu ay (ayın ilk günü - bugün) gösterilir

---

#### 4. Servis Giriş/Çıkış Sayıları
```php
// Kötü: Her gün için ayrı sorgular
for($i = 0; $i < 30; $i++) {
    $tarih = date("Y-m-d", strtotime("-$i days"));
    $giris = mysql_query("SELECT COUNT(*) FROM girisler WHERE tur='1' AND tarih='$tarih'");
    $cikis = mysql_query("SELECT COUNT(*) FROM girisler WHERE tur='2' AND tarih='$tarih'");
}

// İyi: Tek sorguda tüm sayımlar (optimize edilmiş)
$sql = "SELECT tarih,
        SUM(CASE WHEN tur='1' THEN 1 ELSE 0 END) as giris,
        SUM(CASE WHEN tur='2' THEN 1 ELSE 0 END) as cikis,
        SUM(CASE WHEN sonlandir='1' THEN 1 ELSE 0 END) as tamamlanan,
        SUM(CASE WHEN Gdurum='5' THEN 1 ELSE 0 END) as saha_onarim
        FROM girisler 
        WHERE tarih >= '$baslangic' AND tarih <= '$bitis' 
        GROUP BY tarih 
        ORDER BY tarih DESC";
$result = mysql_query($sql, $baglanti);
```

**Kullanıldığı Dosyalar:**
- `kasa_rapor.php` (optimize edilmiş versiyon)
- `kasa_rapor_sorgu.php`

---

## Sorgu Parametreleri ve Güvenlik

### 1. mysql_Real_escape_string Kullanımı
```php
// Tüm kullanıcı girdileri temizlenmeli
$musteri_id = isset($_GET["GiT"]) ? mysql_Real_escape_string($_GET["GiT"]) : "";
$servis_id = isset($_GET["G"]) ? mysql_Real_escape_string($_GET["G"]) : "";
$aciklama = isset($_POST["aciklama"]) ? mysql_Real_escape_string($_POST["aciklama"]) : "";
```

**Önemli Notlar:**
- Tüm `$_GET`, `$_POST`, `$_REQUEST` değerleri temizlenmeli
- `isset()` kontrolü yapılmadan kullanılmamalı

---

### 2. Integer Değer Kontrolü
```php
// Integer alanlar için
$durum_id = isset($_POST["durum"]) && !empty($_POST["durum"]) 
    ? intval($_POST["durum"]) 
    : 0;

// NULL olabilen integer alanlar için
$onarimmerkeziid = isset($_POST["onarimmerkezi"]) && !empty($_POST["onarimmerkezi"]) 
    ? intval($_POST["onarimmerkezi"]) 
    : "NULL";

// SQL'de kullanımı
$sql = "UPDATE girisler SET 
        onarimmerkezi=" . ($onarimmerkeziid == "NULL" ? "NULL" : "'$onarimmerkeziid'") . "
        WHERE GID='$servis_id'";
```

---

### 3. Array Parametreleri
```php
// Array parametreleri için
$ekipmanid = isset($_POST["ekipmanid"]) && is_array($_POST["ekipmanid"]) 
    ? $_POST["ekipmanid"] 
    : array();

// Array'i string'e çevirme
$ekipmanid_str = implode(",", array_map('intval', $ekipmanid));
```

---

### 4. Tarih Formatı Dönüşümü
```php
// Ekrandan gelen tarih (dd.mm.yyyy)
$tarih_ekran = isset($_POST["tarih"]) ? $_POST["tarih"] : "";

// Veritabanına kaydetme (Y-m-d)
$tarih_db = !empty($tarih_ekran) ? date("Y-m-d", strtotime(str_replace('.', '-', $tarih_ekran))) : "";

// Ekranda gösterme (d.m.Y)
$tarih_ekran = date("d.m.Y", strtotime($tarih_db));
```

---

## Performance Optimizasyon Teknikleri

### 1. N+1 Query Problemi Çözümü

**Sorun:**
```php
// Her kayıt için ayrı sorgu
while($servis = mysql_fetch_array($result)) {
    $musteri = mysql_query("SELECT * FROM musteriler WHERE ID='$mid'");
    $marka = mysql_query("SELECT * FROM marka WHERE id='$markaid'");
    $turu = mysql_query("SELECT * FROM urunturu WHERE id='$turuid'");
}
```

**Çözüm:**
```php
// JOIN ile tek sorguda
$sql = "SELECT g.*, 
        m.Ad_Soyad, m.Tel,
        ma.marka,
        ut.turu,
        sd.servisdurum
        FROM girisler g
        LEFT JOIN musteriler m ON g.MID = m.ID
        LEFT JOIN marka ma ON g.marka = ma.id
        LEFT JOIN urunturu ut ON g.turu = ut.id
        LEFT JOIN servisDurumu sd ON g.Gdurum = sd.id
        WHERE g.sonlandir='0'";
$result = mysql_query($sql, $baglanti);
```

---

### 2. GROUP BY ile Toplam Hesaplama

**Sorun:**
```php
// Her müşteri için ayrı sorgu
while($musteri = mysql_fetch_array($result)) {
    $borc = mysql_query("SELECT SUM(borc) FROM carihareket WHERE cariid='$id'");
    $alacak = mysql_query("SELECT SUM(alacak) FROM carihareket WHERE cariid='$id'");
}
```

**Çözüm:**
```php
// Tek sorguda tüm toplamlar
$sql = "SELECT cariid, 
        SUM(COALESCE(borc, 0)) as borc, 
        SUM(COALESCE(alacak, 0)) as alacak 
        FROM carihareket 
        GROUP BY cariid";
$result = mysql_query($sql, $baglanti);
```

---

### 3. SUM(CASE WHEN ...) ile Çoklu Sayım

**Sorun:**
```php
// Her durum için ayrı sorgu
$giris = mysql_query("SELECT COUNT(*) FROM girisler WHERE tur='1' AND tarih='$tarih'");
$cikis = mysql_query("SELECT COUNT(*) FROM girisler WHERE tur='2' AND tarih='$tarih'");
$tamamlanan = mysql_query("SELECT COUNT(*) FROM girisler WHERE sonlandir='1' AND tarih='$tarih'");
```

**Çözüm:**
```php
// Tek sorguda tüm sayımlar
$sql = "SELECT tarih,
        SUM(CASE WHEN tur='1' THEN 1 ELSE 0 END) as giris,
        SUM(CASE WHEN tur='2' THEN 1 ELSE 0 END) as cikis,
        SUM(CASE WHEN sonlandir='1' THEN 1 ELSE 0 END) as tamamlanan
        FROM girisler 
        WHERE tarih >= '$baslangic' AND tarih <= '$bitis' 
        GROUP BY tarih";
$result = mysql_query($sql, $baglanti);
```

---

### 4. CAST ile Decimal Hesaplama
```php
// Toplam hesaplamalarında CAST kullanımı
$sql = "SELECT SUM(CAST(toplam AS DECIMAL(10,2))) as toplam FROM stokfishareketi WHERE ...";
```

**Önemli Notlar:**
- CAST kullanarak doğru decimal hesaplama yapılmalı
- PHP'de `floatval()` ile dönüşüm yapılmalı

---

## Hata Önleme Kontrolleri

### 1. Query Sonuç Kontrolü
```php
$result = mysql_query($sql, $baglanti);
if($result && mysql_num_rows($result) > 0) {
    while($row = mysql_fetch_array($result)) {
        $value = isset($row["field"]) ? $row["field"] : "";
    }
} else {
    // Sonuç yoksa varsayılan değer
    $value = "";
}
```

---

### 2. Null Kontrolleri
```php
// Array erişimlerinde
$value = isset($row["field"]) ? $row["field"] : "";

// number_format için
$tutar = isset($row["tutar"]) ? floatval($row["tutar"]) : 0;
echo number_format($tutar, 2, ',', '.');

// Integer değerler için
$id = isset($row["id"]) ? intval($row["id"]) : 0;
```

---

### 3. mysql_query $baglanti Parametresi
```php
// Her zaman $baglanti parametresi eklenmeli
$result = mysql_query($sql, $baglanti);

// Hata kontrolü
if(!$result) {
    die("Sorgu hatası: " . mysql_error());
}
```

---

## Önemli Sorgu Örnekleri

### 1. Servis Listesi (Optimize Edilmiş)
```php
$sql = "SELECT g.*, 
        m.ID as mID, m.Ad_Soyad, m.Tel, m.Adres,
        ma.id as marka_id, ma.marka,
        ut.id as tur_id, ut.turu,
        sd.id as durum_id, sd.servisdurum, sd.renk,
        p.adi as personel_adi
        FROM girisler g
        LEFT JOIN musteriler m ON g.MID = m.ID
        LEFT JOIN marka ma ON g.marka = ma.id
        LEFT JOIN urunturu ut ON g.turu = ut.id
        LEFT JOIN servisDurumu sd ON g.Gdurum = sd.id
        LEFT JOIN yonetici p ON g.yeni_personel = p.id
        WHERE g.sonlandir='0' 
        ORDER BY g.GID DESC";
$result = mysql_query($sql, $baglanti);
```

---

### 2. Müşteri Bakiyesi (Optimize Edilmiş)
```php
$sql = "SELECT cariid, 
        SUM(COALESCE(borc, 0)) as borc, 
        SUM(COALESCE(alacak, 0)) as alacak,
        (SUM(COALESCE(borc, 0)) - SUM(COALESCE(alacak, 0))) as bakiye
        FROM carihareket 
        WHERE cariid='$musteri_id'
        GROUP BY cariid";
$result = mysql_query($sql, $baglanti);
```

**Önemli Notlar:**
- **DİKKAT:** `carihareket` tablosunda müşteri ID için `cariid` kullanılır, `MID` değil!

---

### 3. Stok Toplamları (Optimize Edilmiş)
```php
$sql = "SELECT 
        SUM(CASE WHEN tur='1' THEN adet ELSE 0 END) as satis_adet,
        SUM(CASE WHEN tur='2' THEN adet ELSE 0 END) as alis_adet,
        SUM(CASE WHEN tur='1' THEN CAST(toplam AS DECIMAL(10,2)) ELSE 0 END) as satis_toplam,
        SUM(CASE WHEN tur='2' THEN CAST(toplam AS DECIMAL(10,2)) ELSE 0 END) as alis_toplam
        FROM stokfishareketi 
        WHERE urunkodu='$urunkodu'";
$result = mysql_query($sql, $baglanti);
```

---

## Best Practices

### 1. Her Zaman Yapılması Gerekenler
- ✅ `mysql_Real_escape_string()` ile girdi temizleme
- ✅ `isset()` kontrolü
- ✅ `mysql_query()` çağrılarında `$baglanti` parametresi
- ✅ Query sonuç kontrolü
- ✅ Null kontrolleri

### 2. Performance İçin
- ✅ JOIN kullanarak N+1 query problemlerinden kaçınma
- ✅ GROUP BY ile toplam hesaplama
- ✅ SUM(CASE WHEN ...) ile çoklu sayım
- ✅ Gereksiz döngülerden kaçınma
- ✅ CAST kullanarak doğru decimal hesaplama

### 3. Güvenlik İçin
- ✅ SQL Injection koruması (mysql_Real_escape_string)
- ✅ XSS koruması (htmlspecialchars)
- ✅ Input validation
- ✅ Error handling

### 4. MID vs cariid Kullanımı
- ✅ `girisler` tablosunda: `MID` kullanılır
- ✅ `carihareket` tablosunda: `cariid` kullanılır
- ✅ `stokfisleri` tablosunda: `cariid` kullanılır
- ✅ `servis` tablosunda: `cariid` kullanılır
- ✅ **DİKKAT:** Her tablo için doğru alan adı kullanılmalıdır!

---

## Son Güncelleme
**Tarih:** 2025-01-14
**Versiyon:** 2.0

**Son Değişiklikler:**
- MID vs cariid kullanım farkları dokümante edildi
- CAST kullanımı ile decimal hesaplama not edildi
- Varsayılan tarih aralığı (bu ay) not edildi
- number_format() null uyarıları düzeltmeleri not edildi

Directory Contents

Dirs: 0 × Files: 20

Name Size Perms Modified Actions
15.22 KB lrw-r--r-- 2025-11-14 06:05:02
Edit Download
4.52 KB lrw-r--r-- 2025-11-14 07:00:34
Edit Download
5.36 KB lrw-r--r-- 2025-11-14 07:59:50
Edit Download
13.95 KB lrw-r--r-- 2025-11-14 04:36:48
Edit Download
6.29 KB lrw-r--r-- 2025-11-14 07:11:42
Edit Download
3.86 KB lrw-r--r-- 2025-11-14 07:27:20
Edit Download
10.45 KB lrw-r--r-- 2025-11-14 06:05:02
Edit Download
4.43 KB lrw-r--r-- 2025-11-14 07:00:44
Edit Download
21.79 KB lrw-r--r-- 2025-11-14 04:35:56
Edit Download
3.60 KB lrw-r--r-- 2025-11-14 08:05:30
Edit Download
10.27 KB lrw-r--r-- 2025-11-14 07:27:10
Edit Download
13.51 KB lrw-r--r-- 2025-11-14 06:05:22
Edit Download
3.01 KB lrw-r--r-- 2025-11-14 08:02:42
Edit Download
4.75 KB lrw-r--r-- 2025-11-14 04:35:56
Edit Download
5.50 KB lrw-r--r-- 2025-11-14 06:05:02
Edit Download
9.77 KB lrw-r--r-- 2025-11-14 04:35:56
Edit Download
11.03 KB lrw-r--r-- 2025-11-14 04:36:48
Edit Download
6.94 KB lrw-r--r-- 2025-11-14 07:02:16
Edit Download
12.81 KB lrw-r--r-- 2025-11-14 04:35:56
Edit Download
23.86 KB lrw-r--r-- 2025-11-14 04:36:48
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).
© 2026 REDROOM — Secure File Manager. All rights reserved. Built with ❤️ & Red Dark UI