سؤال

وأنا أكتب التطبيق PHP الذي يحتوي على "لوحة التحكم" الذي يكتب ملف بادئات مع بعض المتغيرات. على كل POST، إذا لم يكن الملف موجودا، يتم إنشاؤه. إذا كان لا وجود لها، فمن unlinked وtouched ملف جديد مع نفس اسم الملف والمتغيرات الجديدة. ثم يتم تضمين هذا الملف على صفحة أخرى مع محتوى يعرض على أساس المتغيرات في داخله.

$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); 

وهذا هو وسيلة آمنة للكتابة الأفضليات، قدمت هذا الملف سيتم الكتابة عدة مرات في اليوم الواحد؟ ما هو وسيلة جيدة لكلا تنبيه المستخدم من لوحة التحكم إذا لم يتم حفظ الملف بشكل صحيح، وفي هذه الحالة، ما من شأنه أن يكون خطة طوارئ جيدة لتجنب كسر صفحة هذا الملف بادئات يتم تضمين على أقل من تحديد مجموعة افتراضية من المتغيرات لملء إذا !(file_exists)؟

هل كانت مفيدة؟

المحلول

إذا قمت بتخزين إعداداتك في صفيف، يمكنك تسلسل () لهم والكتابة إلى ملف نصي، بدلا من كتابة فب الخام إلى ملف PHP وبما عليه.

إذا كنت لا التعقيم المدخلات للحصول على تلك التفضيلات، ويقول $ mypref1 يمثل اسم شخص ما، لا يوجد شيء يمنعهم من ملء هذا في حقل النموذج:

\"; echo \"PWNED

ووبك النتيجة سوف تصبح PHP

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

وهكذا أولا، تخزين تفضيلاتك في مجموعة واستخدام تسلسل () أكثر أمانا:

$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"

في سؤالك، كنت أذكر أيضا أنه إذا كان الملف موجود، فمن غير المرتبطة. يمكنك ببساطة اقتطاع إلى طول صفري عن طريق تمرير "ث"، كما الوسيطة الثانية إلى FOPEN - لا تحتاج لحذفه يدويا. وهذا ينبغي تعيين وقت أخر تعديل على أي حال، يلغي الحاجة إلى الدعوة للمس ().

وإذا كانت القيم يتم كتابتها إلى ملف والأفضليات، وبالتأكيد كل تفضيل يمكن أن يكون له الافتراضي، ما لم تكن هناك المئات؟ سوف array_merge تسمح لك بالكتابة على أساس لكل مفتاح، لذلك إذا كنت تفعل شيئا من هذا القبيل:

// 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);
    }
}

وإذا كانت المشكلة هي أن هناك أكوام، وكنت لا تريد أن يكون لالتهيئة لهم جميعا، هل يمكن أن يكون وسيلة get_preference الذي يلتف مجرد دعوة isset لمجموعة بادئات.

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

وراء كل سؤال من الأسئلة هذا يثير الرغم من ذلك، فإن الواقع هو أن مع التطبيق الخاص بك، في حال من غير المحتمل أن شيئا <م> لا الذهاب الخطأ مع الدالة fopen، فإنه ينبغي اعتبار بالفشل الذريع على أي حال، وعدد قليل من المستخدمين أنت من المحتمل أن يكون والاستفادة من هذه الميزة هي على وشك أن الاتصال بك جميلة سريعة الرتق إذا كان هناك شيء يذهب على نحو خاطئ.

نصائح أخرى

ومن الأفضل دائما لتخزين الدولة للمستخدمين في الدورة وتستمر فقط تلك الدولة عند الحاجة.

لماذا لا مجرد استخدام قدرات اقتطاع الدالة fopen ()؟ أعتقد بدلا من "ص +"، سوف تحتاج إلى تمرير "ث +" ... ثم إذا كان الملف موجودا، سيتم اقتطاع ذلك، إذا كان لا عليك فقط إنشاء ملف جديد. لذلك يصبح رمز:

$file = "phpsettings.php";
$handle = fopen( $file, 'w+' );
$str = "<?php \$pref1 = \"$mypref\"; ?>";
fwrite ($handle, $str); 
fclose ($handle);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top