質問
私は、特定の変数と環境設定ファイルを書き込み、「コントロールパネル」を持っている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ファイルに生の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に2番目の引数として「W」を渡すことによって、長さがゼロにそれを切り捨てることができます - あなたはそれを手動で削除する必要はありません。これは、コールが)(触れることの必要性を否定、とにかくのmtimeを設定する必要があります。
ファイルに書き込まれた値が設定されている場合は何百もある場合を除き、、きっとそれぞれ好みは、デフォルトを持っているだろうか?あなたはこのような何かので、もし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);
}
}
問題は、ヒープがあるということです、そしてあなたがそれらをすべて初期化する必要はしたくない場合は、、あなただけのprefsアレイにISSET呼び出しをラップGET_PREFERENCEメソッドを持つことができます。
function get_preference($name, &$prefs) {
if (isset($pref[$name]))
return $pref[$name];
return null;
}
var_dump(get_preference('mypref1', $prefs));
質問のすべてを越えて、これはしかし提起、現実には、あなたのアプリで、何かがのないの関数fopenと間違って行くことは考えにくい場合に、それは、とにかく深刻な失敗と見なされるべきであることを何かがうまくいかない場合は、あなたがこの機能を利用して持っていそうだユーザーの一握りはかなりくそ迅速にご連絡しようとしている。
他のヒント
セッション中にユーザーの状態を保存し、必要な場合にのみ、その状態を永続化するために、常により良いです。
なぜ、fopen()での切り捨て機能を使わないのでしょうか?私の代わりに、それはあなただけの新しいファイルを作成しますれていない場合、あなたは...そして、ファイルが存在する場合、それは、切り捨てられます「+ W」合格する必要があります「R +」の信じています。だから、コードになります:
$file = "phpsettings.php";
$handle = fopen( $file, 'w+' );
$str = "<?php \$pref1 = \"$mypref\"; ?>";
fwrite ($handle, $str);
fclose ($handle);