【发布时间】:2021-09-20 09:36:54
【问题描述】:
这是我的脚本,它在 php 8.0 上完美运行,但在 php 7.4 上却出现故障。
$fileName = 'Usecase.csv';
$tempName = 'temp.csv';
$inFile = fopen($fileName, 'r');
$outFile = fopen($tempName,'w');
while (($line = fgetcsv($inFile)) !== FALSE)
{
if(($line[0] == "$fin") )
{
$line = explode (",", "$tempstr10");
$asd=$asd+1;
}
fputcsv($outFile, $line );
}
fclose($inFile);
fclose($outFile);
unlink($fileName);
rename($tempName, $fileName);
if( $asd==0 && filesize("Usecase.csv")>0)
{ file_put_contents("Usecase.csv", "$tempstr10\r\n",FILE_APPEND | LOCK_EX); }
if( $asd==0 && filesize("Usecase.csv")==0)
{ file_put_contents("Usecase.csv", "$tempstr10\r\n",FILE_APPEND | LOCK_EX); }
我尝试打印错误(如果有),但没有打印任何内容。
1:那么跟踪此类问题的最佳做法是什么? 2:根据我有限的知识,这个脚本使用了php7和php8都支持的简单函数,为什么会出现这个问题?
谢谢
更新: 这部分代码读取一个 csv 文件,如果 csv 文件包含某个字符串,那么它将替换找到该字符串的整行。
$fileName = 'Usecase.csv';
$tempName = 'temp.csv';
$inFile = fopen($fileName, 'r');
$outFile = fopen($tempName,'w');
while (($line = fgetcsv($inFile)) !== FALSE)
{
if(($line[0] == "$fin") )
{
$line = explode (",", "$tempstr10");
$asd=$asd+1;
}
fputcsv($outFile, $line );
}
fclose($inFile);
fclose($outFile);
unlink($fileName);
rename($tempName, $fileName);
技术上$line[0] == "$fin" 检查 $fin 的值是否与 $line[0] 匹配,如果是,则将整个 $line 替换为 $tempstr10
如果字符串匹配,那么它将增加 $asd 的值,并且代码的下一部分不会被执行
否则将根据 if 语句执行:
if( $asd==0 && filesize("Usecase.csv")>0)
{ file_put_contents("Usecase.csv", "$tempstr10\r\n",FILE_APPEND | LOCK_EX); }
if( $asd==0 && filesize("Usecase.csv")==0)
{ file_put_contents("Usecase.csv", "$tempstr10\r\n",FILE_APPEND | LOCK_EX); }
问题: 在 php8 中,当 csv 文件中已经存在字符串时,它将用新字符串替换整行(包含该字符串的行) 但在 php7 中它不会替换它,只是用新值添加新行
【问题讨论】:
-
“故障”的定义是什么? PHP7 和 PHP8 的执行结果有多大不同?也许来自 php.ini 的设置(通常取决于版本,例如驻留在您的 php 安装的特定文件夹中)导致了问题。
-
您究竟做了什么来尝试显示错误? “故障”具体是什么意思?您希望代码做什么,而它到底做了什么?
-
@mynd 我在 OP 中添加了更新以解释“故障”
-
@ADyson 我尝试在代码的多个点打印_r 最后一个错误,但没有任何显示,我还更新了 OP 以解释“故障”
-
“跟踪此类问题的最佳做法是什么?”的答案总是将问题分解。虽然只有几行长,但这段代码包含很多不同的东西:从文件中读取数据、将数据写入文件、重命名和删除文件、CSV 解析、字符串操作、比较、循环、条件......检查并简化,以便您可以看到哪些事情实际上表现不同。用硬编码值替换在两个版本中运行相同的部分; 在问题显示后删除部分;继续缩小范围。