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

时间:2011-06-23 16:29:55

标签: php forms character-encoding

当我从PHP v5.2.17升级时,我有以下代码中断 - > v5.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)数据时,它什么都不返回。

1 个答案:

答案 0 :(得分:2)

您尚未在问题中添加错误消息,但由于代码仅使用一个非标准功能,即iconv,因此您很可能未安装/启用iconv extension

要解决此问题,请启用所需的扩展,并且代码应该可以从其他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; 
}