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)
这是我的脚本,在 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)