Php fopen hatası için acil eylem planı

3 Cevap php

Ben bazı değişkenler ile bir prefs dosyayı yazıyor bir 'kontrol paneli' bir PHP uygulaması yazıyorum. Dosya mevcut değilse, her on POST, oluşturulur. Eğer var, o unlinked ve yeni bir dosya aynı dosya ve yeni değişkenler ile touched olduğunu. Bu dosya daha sonra içindeki değişkenlere dayalı içeriği görüntüler ile başka bir sayfada yer almaktadır.

$file = "phpsettings.php";

if (!file_exists($file)) {
   touch($file);
  $handle = fopen ($file, 'r+'); 
$str = "<?php \$pref1 = \"$mypref\"; ?>";

} else {

unlink($file);
   touch($file);
   $handle = fopen ($file, 'r+'); 
   $str = "<?php \$pref1 = \"$mypref\"; ?>";

}

fwrite ($handle, $str); 
fclose ($handle);

Bu dosyayı günde birçok kez üzerine olacak sağlanan, yazma tercihleri ​​güvenli bir yolu var mı? Dosyası doğru kaydedilmiş değildi eğer her ikisi de bu kontrol paneli kullanıcıyı uyararak iyi yolu nedir, ve bu durumda, ne sayfa bu prefs dosya kırma önlemek için iyi bir acil durum planı olurdu tanımlayan kısa dahil edilir Eğer doldurmak için değişkenler varsayılan kümesi !(file_exists)?

3 Cevap

Eğer bir dizi ayarlarınızı saklıyorsanız, siz) (bunları serialize ve yerine bir php dosyasına ham php yazma ve bunu içeren daha, bir metin dosyasına yazma.

Bu tercihleri ​​için giriş sanitasyon, ve birinin adını temsil $ mypref1 demek değilseniz, form alanında bu doldurarak onları durdurma şey yok:

\"; echo \"PWNED

ve çıkan PHP olacak

<?php \$pref1 = \"$mypref\"; echo \"PWNED\"; ?>

Bu yüzden öncelikle, bir dizi tercihlerinizi saklamak ve serialize () kullanarak çok daha güvenlidir:

$prefs = array('mypref1' => 'somethingorother');
$handle = fopen ($file, 'w'); 
fwrite($handle, serialize($prefs));
fclose($h);

// example code demonstrating unserialization
$prefs2 = unserialize(file_get_contents($file));
var_dump($prefs == $prefs2); // should output "(bool) true"

Sorunuza, ayrıca dosya yoksa, eğer bağlantısız olduğunu belirtin. Sadece fopen ikinci argüman olarak "w" geçerek sıfır uzunlukta bunu kesebilir - elle silmeniz gerekmez. Bu (dokunmak çağrısı için ihtiyaç) inkâr, yine mtime ayarlamanız gerekir.

Dosyaya yazılır değerleri tercihleri ​​ise yüzlerce olmadıkça, elbette her tercih, bir varsayılan olabilir? array_merge bir başına anahtar bazında üzerine yazmasına izin, bu yüzden böyle bir şey yaparsanız olacaktır:

// array of defaults
$prefs = array(
    'mypref1' => 'pants',
    'mypref2' => 'socks',
);
if (file_exists($file)) {
    // if this fails, an E_NOTICE is raised. are you checking your server error
    // logs regularly?
    if ($userprefs = unserialize(file_get_contents($file))) {
        $prefs = array_merge($prefs, $userprefs);
    }
}

Sorunu vardır yığınları, ve tüm bunları başlatmak zorunda istemiyorum ise, sadece prefs diziye bir isset çağrı sarar bir get_preference yöntemi olabilir.

function get_preference($name, &$prefs) {
    if (isset($pref[$name]))
        return $pref[$name];
    return null;
}
var_dump(get_preference('mypref1', $prefs));

Bu olsa yükseltir soruların tüm ötesinde, gerçeklik sizin uygulaması ile, bir şey does fopen ile yanlış gitmek olası durumunda, yine de ciddi bir başarısızlık olarak kabul edilmesi gerektiğini, ve avuç içinde Bu özelliği yararlanarak olması olasıdır kullanıcıların bir şey yanlış giderse hızlı oldukça lanetlemek sizinle irtibata olacak.

Bu oturumda kullanıcıların durumunu saklamak ve gerektiğinde yalnızca o durum devam etmek her zaman daha iyidir.

Neden sadece fopen () ve kesme yeteneklerini kullanmak değil mi? Yerine "r +", sen dosya varsa bu sadece yeni bir dosya oluşturun değilse, bu, fazlalıklar atılacak ... Sonra "w +" geçmesi gerekir inanıyorum. Yani kod olur:

$file = "phpsettings.php";
$handle = fopen( $file, 'w+' );
$str = "<?php \$pref1 = \"$mypref\"; ?>";
fwrite ($handle, $str); 
fclose ($handle);