2011-10-25 15 views
0

にファイルへの書き込み、私は現在、このブロックがあります。文字列の配列を変更し、PHP

if ($type == "up") { 
    $lines_ = file('../indexIncomplete'); 
    $counter = 0; 
    foreach ($lines_ as $value) { 
     $postLen = strlen($post); 
     if (substr($value, 0, $postLen) === $post) { 
      break; 
     } 
     $counter++; 
    } 
    list($title, $location, $votes, $poster, $date) = explode("|", $lines_[$counter]); 
    $votes = $votes + 1; 
    $newValue = $title.'|'.$location.'|'.$votes.'|'.$poster.'|'.$date; 
    $lines_[$counter] = $newValue; 
    file_put_contents('../indexIncomplete', $lines_); 
} 

これは、それを呼び出して、フォームを含むHTMLページに含まれているが(このブロックの上、いくつかのロジックがありますそれは妥当性検査を行い、私はここで問題を絞りました)。

ファイルの内容を配列にプルしています。次に、配列の中のどれかが$post(先に宣言された文字列)に一致するかどうかを調べます。一致する場合、ループが壊れ、カウンターは一致するストリングを含む配列内の位置を指します。次に、文字列のさまざまな部分を(explode()を使用して)取得します。私は$valueをつかんでそれを増やし、新しい配列エントリを再構築します。

$lines_[$counter] = $newValue; 

私は戻って、ファイルに新しい配列を書く:私はちょうどこのライン上に構築された新しいものと古い配列エントリを交換してください。問題は、$newValue書き込まれているdoesntのである、それは次のようになりながら、$votes以外の変数他を拾うように見える:数は、投票の正しい数である

||1|| 

$title|$location|$votes|$poster|$date 

また、それは想定されている行には表示されません。代わりに、ファイルの末尾に追加されます。私は非常に混乱しています。それは一度に複数の書き込みによって破壊されていないので、私は、ファイルをロックするお勧めします、ますfile_put_contents以来

+0

'list($ title、...)'行の直前に 'print($ lines _ [$ counter])'を追加します。それには正しい情報が含まれていますか? – bos

+0

いいえ、それはしませんでした。私はそれを考え出したと信じています。私は '==='を使ってif文を比較することはできないようです。 '=='は動作します。 – n0pe

答えて

2

は、それが読まれたのと同じ場所に書き込みを行っているが、これはHTMLフォームです:

$file_put_contents('../indexIncomplete', $lines_, LOCK_EX); 

ものであればあなたの値があなたの期待通りであることを確認するためには、まだまだわかりにくい、var_dump(またはlog)$ postと$ lines _ [$ counter]を見てください。

0

私はあなたのforeach文の下のコードは、ファイル内のどの行もif文と一致しない場合でも常に実行されます。

この場合、$ counterは配列の最後の要素よりも1つ高い値に設定されます。これは、 "$ lines _ [$ counter]"を呼び出して "null"を返すときに存在しない配列キーにアクセスすることを意味します(E_NOTICEレベルの警告を出すが、PHPはjavaのような境界外のエラーを行いません)

カウンタの値は、配列のサイズよりも1長いため、ファイルの末尾に追加されます。

このコードをブレーク前にforeach内に移動することをお勧めします。

list($title, $location, $votes, $poster, $date) = explode("|", $lines_[$counter]); 
$votes = $votes + 1; 
$newValue = $title.'|'.$location.'|'.$votes.'|'.$poster.'|'.$date; 
$lines_[$counter] = $newValue;