PHP Dosyaya Yazma

PHP ile dosyaya veri yazmayı öğrenin.

PHP'de bir dosyaya veri yazmak için birkaç farklı yöntem ve fonksiyon bulunmaktadır. En temel ve esnek yöntem `fopen()`, `fwrite()` ve `fclose()` fonksiyonlarını kullanmaktır. Daha hızlı ve basit işlemler için `file_put_contents()` gibi pratik fonksiyonlar da mevcuttur. İşlemi adım adım ve farklı senaryolarla açıklayalım: --- ### Temel Dosya Yazma İşlemi (`fopen`, `fwrite`, `fclose`) Bu yöntem, dosya üzerinde daha fazla kontrol sağlamak istediğinizde veya büyük dosyalarla çalışırken parça parça yazmak istediğinizde tercih edilir. **1. Dosyayı Açma (`fopen()`):** `fopen()` fonksiyonu bir dosyayı belirli bir modda açar ve bir dosya kaynağı (resource) döndürür. Bu kaynak, diğer dosya işlem fonksiyonları tarafından kullanılır. ```php $dosyaAdi = "ornek.txt"; $dosyaKaynagi = fopen($dosyaAdi, "mod"); ``` **`mod` parametresi için yaygın seçenekler:** * `"w"` (write): Dosyayı yazmak için açar. **Eğer dosya mevcutsa içeriğini siler (truncate eder).** Eğer dosya yoksa, oluşturur. * `"a"` (append): Dosyayı yazmak için açar. **Yazma işlemi dosyanın sonundan devam eder.** Eğer dosya yoksa, oluşturur. İçeriğini silmez. * `"x"` (exclusive create): Sadece yeni dosya oluşturmak için açar. Eğer dosya mevcutsa, `fopen()` başarısız olur ve `false` döndürür. * `"c"` (create if not exist): Dosyayı yazmak için açar. Eğer dosya yoksa oluşturur. **Eğer dosya mevcutsa, içeriğini silmez ve yazma işlemi dosyanın başından başlar.** * `"w+"`, `"a+"`, `"x+"`, `"c+"`: Bu modlar, dosyayı hem okuma hem de yazma için açar. Yukarıdaki temel modların okuma yeteneği eklenmiş halidir. **Önemli:** `fopen()` başarısız olursa (`false` döndürürse), bu genellikle dosya izinleri (permissions) veya yol sorunlarından kaynaklanır. Her zaman kontrol etmek iyi bir uygulamadır. **2. Veriyi Yazma (`fwrite()` veya `fputs()`):** `fwrite()` (veya `fputs()`, bunlar aynı fonksiyondur) fonksiyonu, `fopen()` ile açtığınız dosya kaynağına veri yazmak için kullanılır. ```php $yazilacakVeri = "Bu bir test verisidir.\n"; fwrite($dosyaKaynagi, $yazilacakVeri); ``` * `$dosyaKaynagi`: `fopen()`'dan dönen dosya kaynağı. * `$yazilacakVeri`: Dosyaya yazılacak string veri. `fwrite()` fonksiyonu yazılan bayt sayısını döndürür veya hata durumunda `false` döndürür. **3. Dosyayı Kapatma (`fclose()`):** Bir dosya işlemi tamamlandığında, `fclose()` ile dosyayı kapatmak hayati önem taşır. Bu, dosya kaynağını serbest bırakır ve yazılan verinin gerçekten diske kaydedilmesini sağlar. ```php fclose($dosyaKaynagi); ``` --- ### Örnek 1: Yeni Dosya Oluşturma veya Mevcut Dosyanın İçeriğini Silip Yazma (`w` modu) ```php <?php $dosyaAdi = "bilgi.txt"; $yazilacakVeri = "Merhaba Dünya!\n"; $yazilacakVeri .= "Bu, PHP ile dosyaya yazılan ilk metin.\n"; // Dosyayı yazma modunda aç ('w'). // Eğer dosya yoksa oluşturur, varsa içeriğini siler. $dosyaKaynagi = fopen($dosyaAdi, "w"); if ($dosyaKaynagi === false) { echo "Dosya açılamadı veya oluşturulamadı. İzinleri kontrol edin.\n"; } else { // Veriyi dosyaya yaz $yazilanBaytSayisi = fwrite($dosyaKaynagi, $yazilacakVeri); if ($yazilanBaytSayisi === false) { echo "Veri dosyaya yazılamadı.\n"; } else { echo "Dosyaya " . $yazilanBaytSayisi . " bayt veri başarıyla yazıldı.\n"; } // Dosyayı kapat fclose($dosyaKaynagi); } ?> ``` Bu kodu çalıştırdığınızda, aynı dizinde `bilgi.txt` adında bir dosya oluşacak ve içerisinde verdiğiniz metin bulunacaktır. Kodu tekrar çalıştırırsanız, `bilgi.txt`'nin içeriği baştan yazılacaktır. --- ### Örnek 2: Mevcut Dosyanın Sonuna Ekleme Yapma (`a` modu) ```php <?php $dosyaAdi = "log.txt"; $yazilacakVeri = "Log kaydı: " . date("Y-m-d H:i:s") . " - Bir olay gerçekleşti.\n"; // Dosyayı ekleme modunda aç ('a'). // Eğer dosya yoksa oluşturur, varsa içeriğini koruyarak sonuna ekler. $dosyaKaynagi = fopen($dosyaAdi, "a"); if ($dosyaKaynagi === false) { echo "Log dosyası açılamadı veya oluşturulamadı. İzinleri kontrol edin.\n"; } else { // Veriyi dosyaya yaz $yazilanBaytSayisi = fwrite($dosyaKaynagi, $yazilacakVeri); if ($yazilanBaytSayisi === false) { echo "Log dosyasına veri yazılamadı.\n"; } else { echo "Log dosyasına " . $yazilanBaytSayisi . " bayt veri başarıyla eklendi.\n"; } // Dosyayı kapat fclose($dosyaKaynagi); } ?> ``` Bu kodu her çalıştırdığınızda, `log.txt` dosyasına yeni bir zaman damgalı log kaydı eklenecektir. --- ### Daha Basit Yöntem: `file_put_contents()` Tek bir işlemde dosya yazma işlemini tamamlamak için `file_put_contents()` fonksiyonu çok pratik bir çözümdür. Dahili olarak `fopen()`, `fwrite()` ve `fclose()` işlemlerini yapar. ```php file_put_contents(dosya_yolu, veri, [bayraklar]); ``` **`bayraklar` (flags) parametresi için yaygın seçenekler:** * `FILE_APPEND`: Mevcut dosyanın sonuna veri ekler. (Bu, `a` moduna karşılık gelir.) * `LOCK_EX`: Dosyayı kilitler. Bu, aynı anda birden fazla işlemin dosyaya yazmaya çalışmasını önler ve veri bozulmasını engeller. (İşlem bitince otomatik açılır.) **Örnek 3: `file_put_contents()` ile Yazma (Mevcutsa Silip Yeni İçerik Yazma)** ```php <?php $dosyaAdi = "rapor.txt"; $raporIcerigi = "Günlük Rapor:\n"; $raporIcerigi .= "Bugün hava güneşliydi.\n"; $raporIcerigi .= "Tüm görevler başarıyla tamamlandı.\n"; // Dosyaya içeriği yazar. Eğer dosya varsa, içeriğini siler ve yeni içeriği yazar. $sonuc = file_put_contents($dosyaAdi, $raporIcerigi); if ($sonuc === false) { echo "Rapor dosyasına yazılırken bir hata oluştu.\n"; } else { echo "Rapor dosyasına başarıyla yazıldı (" . $sonuc . " bayt).\n"; } ?> ``` **Örnek 4: `file_put_contents()` ile Dosyanın Sonuna Ekleme (`FILE_APPEND` bayrağı ile)** ```php <?php $dosyaAdi = "aktivite.log"; $aktiviteMesaji = date("Y-m-d H:i:s") . " - Kullanıcı 'admin' giriş yaptı.\n"; // Dosyanın sonuna ekleme yapar. Dosya yoksa oluşturur. $sonuc = file_put_contents($dosyaAdi, $aktiviteMesaji, FILE_APPEND | LOCK_EX); if ($sonuc === false) { echo "Aktivite log dosyasına yazılırken bir hata oluştu.\n"; } else { echo "Aktivite log dosyasına mesaj başarıyla eklendi (" . $sonuc . " bayt).\n"; } ?> ``` `LOCK_EX` bayrağını kullanmak, özellikle çok kullanıcılı ortamlarda veya sık yazma işlemlerinde dosya bütünlüğünü korumak için iyi bir uygulamadır. --- ### Dikkat Edilmesi Gerekenler: 1. **Dosya İzinleri (Permissions):** PHP'nin çalıştığı web sunucusu kullanıcısının (genellikle `www-data` veya `apache`) dosyayı veya dizini yazma iznine sahip olması gerekir. Aksi takdirde `fopen()` veya `file_put_contents()` başarısız olur. Dizin için genellikle `chmod 775` veya `chmod 777` (daha az güvenli) gibi izinler vermek gerekebilir. 2. **Hata Kontrolü:** Her zaman dosya işlemlerinin başarı durumunu kontrol edin (`=== false` kontrolü). 3. **Dosya Yolu:** Dosya yolu göreceli (örneğin `ornek.txt`) veya mutlak (örneğin `/var/www/html/data/ornek.txt`) olabilir. Göreceli yollar, betiğin çalıştığı dizine göre çözümlenir. 4. **Kaynak Yönetimi:** `fopen()` ile açtığınız dosyaları her zaman `fclose()` ile kapatın. `file_put_contents()` bu işlemi otomatik olarak yapar. 5. **Güvenlik:** Kullanıcıdan gelen girdiyi doğrudan dosya adı olarak kullanmaktan kaçının. Bu, "dizin geçişi" (directory traversal) gibi güvenlik açıklarına yol açabilir. Dosya adlarını dikkatlice temizleyin veya kendi belirlediğiniz güvenli bir dizinde tutun. Bu bilgilerle PHP'de dosya yazma işlemlerini güvenli ve etkili bir şekilde gerçekleştirebilirsiniz.
Son Paylaşımlar
Kategoriler