php 版本 7 和版本 8 之间的脚本问题?

php script issue between Version 7 and version 8?

这是我的脚本,在 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] 匹配,如果匹配则用 $tempstr10 替换整个 $line 如果字符串匹配则它将增加 $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 中它并没有替换它只是添加了具有新值的新行

不确定这是不是问题的根源,但要注意:在php中,从版本8开始,数字与字符串比较的规则不同。参见 https://www.php.net/releases/8.0/en.php#saner-string-to-number-comparisons

考虑使用“严格”相等性检查(=== 而不是 ==)以避免隐式类型转换,并在比较之前显式转换类型。

例如

if((string) $line[0] === (string) $fin)