2011-10-25 86 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似乎比$votes拿起任何其他變量等,使它看起來像這樣:

||1|| 

當數票數正確的號碼。它應該看起來像這樣:

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

此外,它不會出現在它應該的行上。而是將其附加到文件的末尾。我很困惑。

+0

就在'list($ title,...)'行之前,添加'print($ lines _ [$ counter])''。它是否包含正確的信息? – bos

+0

不,它沒有。我相信我知道了。看來我不能用'==='在if語句中進行比較。 '=='雖然工作。 – n0pe

回答

2

因爲file_put_contents被寫入從中讀取同一個地方,這是一個HTML表單,我建議鎖定該文件,因此它不是由多個損壞寫道一次:

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

如果事情仍然看起來很奇怪,var_dump(或日誌)$ post以及$ lines _ [$ counter]以確保您的值是您期望的值

0

我認爲您遇到的問題是您的foreach語句下方的代碼將會即使文件中沒有行符合if語句,也總是執行。

在這種情況下,$ counter將被設置爲比數組中最後一個元素高一個的值。這意味着當你調用「$ lines _ [$ counter]」時將會訪問一個不存在的數組鍵,這將返回「null」(PHP不會像java一樣發生超出界限的錯誤,儘管它會給出E_NOTICE級別警告)

由於計數器的值比數組的大小長1,它將被追加到文件的末尾。

我建議你在休息之前把你的代碼移到你的foreach中。

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