我目前有这个块:
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 :(得分:2)
由于file_put_contents正在写入读取它的同一个地方,这是一个html表单,我建议锁定该文件,使其不会被多次写入一次性破坏:
$file_put_contents('../indexIncomplete', $lines_, LOCK_EX);
如果事情仍然看起来很糟糕,var_dump(或log)$ post以及$ lines _ [$ counter]以确保你的价值符合预期
答案 1 :(得分:0)
我认为您遇到的问题是,即使文件中的所有行都与if语句不匹配,foreach语句下面的代码也将始终执行。
在这种情况下,$ 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;