0

次のような情報を含むファイルがあります。

    IP=121.0.0.1 Status=On Name=Name  
    IP=121.0.0.1 Status=On Name=Name 
    IP=121.0.0.1 Status=On Name=Name  
    IP=121.0.0.1 Status=On Name=Name  
    IP=127.0.0.1 Status=On Name=Name 
    IP=121.0.0.1 Status=On Name=Name  
    IP=121.0.0.1 Status=On Name=Name 
    IP=121.0.0.1 Status=On Name=Name

このファイルの情報を更新するにはどうすればよいですか? たとえば、ローカルホスト IP でステータスをオフに設定し、名前をテストするなどして行を更新するにはどうすればよいでしょうか。私が試したのは、IP アドレス (この場合はローカルホスト - 127.0.0.1) で変更する行を見つけて、値を置き換えることです。 Status= を Offstr_replace()などに変更します。しかし、もう一度 On に戻そうとすると、別の行が上書きされたり、空の行が作成されたり、さらに情報が追加されたりします。

私が試したコード:

<?php
$file = fopen('user_info.wrd','r+');
while (!feof($file))
 {
  $str=fgets($file);
  if (strstr($str,$_SERVER['REMOTE_ADDR'])) 
    {
     $Status=substr($str,strpos($str,'Status=')+7);
     $Status=substr($Status,0,strpos($Status,' '));
     fseek($file,(ftell($file)-strlen($str)));
     $str=str_replace($Status,'Off',$str);
     echo $str;
     $str=trim($str);
     fwrite($file,$str);
     fclose($file);
     die;
    }
 }  
?>
4

1 に答える 1

1

私のバージョンの read_file および write_file 関数を次に示します (コードはテストされていませんが、動作するはずです)。

function read_file($filename) {
  $contents = file_get_contents($filename);
  $lines = explode((strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? "\r\n" : "\n"), $contents);
  $data = array();
  foreach($lines as $line) {
    $fields = explode(" ", $line);
    $ip_address = null;
    foreach($fields as $field) {
      $keyvaluepair = explode('=', $field);
      if ($keyvaluepair[0] === 'IP') {
        $ip_address = $keyvaluepair[1];
        $data[$ip_address] = array();
      } else {
        $data[$ip_address][$keyvaluepair[0]] = $keyvaluepair[1];
      }
    }
  }
  return $data;
}

function write_file($filename, $array) {
  $data = '';

  foreach($array as $ip_address => $flags) {
    $data .= "IP={$ip_address} Status={$flags['Status']} Name={$flags['Name']}";
    $data .= (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? "\r\n" : "\n");
  }

  file_put_contents($filename, $data);
}

使用法:

$data = read_file('filename');
$data['127.0.0.1']['Status'] = 'Off';
$data['127.0.0.1']['Name'] = 'My_Fancy_Name'; // note that spaces in the name are not allowed!
write_file('filename', $data);
于 2012-07-20T23:50:15.487 に答える