使用更高版本的PHP时,代码会中断


Code breaks when using later version of PHP

我有下面的代码,当我从PHP v.2.17-->v.3.5升级时,它坏了,我不知道它是什么。有人知道可能出了什么问题吗?谢谢

<?php
setlocale(LC_ALL, 'en_US.UTF8');
$goto = $_POST['location'];
function toAscii($str, $replace=array(), $delimiter='-') {
    if( !empty($replace) ) {
        $str = str_replace((array)$replace, ' ', $str);
    }
    $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
    $clean = preg_replace("/[^a-zA-Z0-9'/_|+ -]/", '', $clean);
    $clean = strtolower(trim($clean, '-'));
    $clean = preg_replace("/['/_|+ -]+/", $delimiter, $clean);
    return $clean;
}
?>

没有任何错误,我查看了我的cms日志,没有任何异常。我做了一个简单的测试,结果如下:

<?php
$goto = $_POST['location']; 
function toAscii($str, $replace=array(), $delimiter='-') { 
  if( !empty($replace) ) { 
    $str = str_replace((array) $replace, ' ', $str); 
  } 
  $clean = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
  $clean = preg_replace("/[^a-zA-Z0-9'/_|+ -]/", '', $clean); 
  $clean = strtolower(trim($clean, '-')); 
  $clean = preg_replace("/['/_|+ -]+/", $delimiter, $clean); 
  return $clean; 
}
?> 

输出为:<?echo toAscii($goto);?>输出为:<?echo $goto;?>

当我输出原始表单数据时,它工作得很好,当我输出toAscii($goto)数据时,不会返回任何结果。

您没有在问题中添加错误消息,但由于代码只使用了一个非标准函数,即iconv,因此很可能您没有安装/启用iconv扩展。

要解决这个问题,请启用所需的扩展,代码应该可以像您从其他PHP配置中了解的那样工作。

如果扩展是可用的,并且从我的脑海中启用了(PHP 5.3应该是这样),那么你应该为你的问题添加更多信息,到底是什么破坏了。什么没有按预期工作?


要进行故障排除,请在代码上方的位置:

error_reporting(-1);
ini_set('display_errors', 1);

这样可以确保错误和警告直接可见。


为了继续解决问题,让我们在日常工作中小心处理。示例性地,我添加了对iconv的返回值的检查,同样的检查可以应用于任何类型的变量(测试变量是否包含预期值)或函数返回值:

function toAscii($str, $replace=array(), $delimiter='-') { 
  if( !empty($replace) ) { 
    # NOTE: no need to cast to array. It's either array or string, both work
    $str = str_replace($replace, ' ', $str);
  }
  # NOTE: inconv will return FALSE on error. Checking this now.
  $result = iconv('UTF-8', 'ASCII//TRANSLIT', $str);
  if (FALSE === $result) {
    throw new Exception(sprintf('Iconv failed on "%s".', $str));
  } else {
    $clean = $result;
  }
  $clean = preg_replace("/[^a-zA-Z0-9'/_|+ -]/", '', $clean);
  $clean = strtolower(trim($clean, '-')); 
  $clean = preg_replace("/['/_|+ -]+/", $delimiter, $clean); 
  return $clean; 
}