【问题标题】:php script issue between Version 7 and version 8? [closed]版本 7 和版本 8 之间的 php 脚本问题? [关闭]
【发布时间】: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 解析、字符串操作、比较、循环、条件......检查并简化,以便您可以看到哪些事情实际上表现不同。用硬编码值替换在两个版本中运行相同的部分; 问题显示后删除部分;继续缩小范围。

标签: php php-7 php-7.4 php-8


【解决方案1】:

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

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

例如

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

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多