문제

특정 변수가있는 Prefs 파일을 작성하는 '제어판'이있는 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\"; ?>

먼저, 선호도를 배열에 저장하고 Serialize ()를 사용하는 것이 훨씬 안전합니다.

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

귀하의 질문에서, 당신은 또한 파일이 존재하는 경우, 그것이 끊어지지 않았다고 언급합니다. "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);
    }
}

문제가 힙이 있고 모든 것을 초기화하고 싶지 않다는 것인 경우, ISSET 호출을 Prefs 배열로 랩핑하는 get_preference 메소드를 가질 수 있습니다.

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

그러나 이것이 제기되는 모든 질문 외에도 현실은 앱을 사용하여 아마도 그럴 가능성이없는 이벤트에서 하다 Fopen으로 잘못 가십시오. 어쨌든 심각한 실패로 간주되어야하며,이 기능을 사용할 가능성이있는 소수의 사용자가 무언가 잘못되면 꽤 다소 연락 할 것입니다.

다른 팁

사용자 상태를 세션에 보관하는 것이 항상 좋습니다. 필요할 때만 해당 상태 만 지속됩니다.

Fopen ()의 잘린 기능 만 사용하지 않는 이유는 무엇입니까? 나는 "r+"대신 "w+"를 전달해야한다고 생각합니다. 그러면 파일이 존재하면 자르지 않으면 새 파일 만 만들지 않으면 잘립니다. 그래서 코드는 다음과 같습니다.

$file = "phpsettings.php";
$handle = fopen( $file, 'w+' );
$str = "<?php \$pref1 = \"$mypref\"; ?>";
fwrite ($handle, $str); 
fclose ($handle);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top