3

我在我的 PHP 代码中使用了很多这样的函数;UID(), user_getProfileImage() ... etc. 我正在 Windows 上编写我所有的项目并且运行良好。在这里还可以,但是当我将项目放在服务器上时,会出现这样的错误;

Fatal error: Call to undefined function UID() in /var/www/vhosts/...

什么?是未定义的吗?!

我正在检查我所有的项目文件,并再次将所有文件通过 FTP 传输到服务器......同样的错误。

但是当我将名称更改UID()uid()(在lib.php和其他使用它的地方)时,它运行良好。

所以有什么问题?这个服务器是怎么回事?

本地 PHP 版本:5.3.10

服务器 PHP 信息:http://... 已删除

注意:我使用 Notepad++ 将所有 PHP 文件编码为“没有 BOM 的 UTF-8”(一如既往),有趣的是,其他项目运行良好,即使使用相同的功能并在同一台服务器上运行。

谢谢。

/##############################/

更新(和解决方案);

  1. 不要在任何函数名中使用“I”(大写“i”)字符或
  2. 像这样简单地使用 setlocale ;setlocale(LC_TIME, "tr_TR.UTF-8")// 我只需要语言环境时间配置并使用它
  3. 如果需要LC_ALL,不要忘记 set back LC_CTYPEin en_US,即:

    setlocale(LC_ALL, "tr_TR.UTF-8"); setlocale(LC_CTYPE, "en_US");

4

4 回答 4

3

这暗示着遭受“ I 问题”,当 PHP 使用土耳其语语言环境 ( tr_TR, tr_TR.utf8...) 时就会表现出来。这样做时,大小写字母“i”之间的不区分大小写检查将失败。

请参阅https://bugs.php.net/18556 —“将语言环境设置为 'tr_TR' 小写类名”


你有几个解决方案:

  • 用相同大小写的字母(或者,至少是字母“i”)定义和调用你的函数;高低不重要。
  • 使用不受此(错误)行为影响的语言环境。

后者是首选,主要是因为它通常是一个微小的更改修复所有问题的任务。

于 2012-05-23T21:37:58.900 回答
1

它实际上是已知的错误,但自 2002 年以来仍未修复!请参阅#18556

简而言之,PHP 使用内部tolower()函数,它是区域设置感知的,但在土耳其语中对 I 有一些特定的规则(不带点的 ı 是 I 的小写,带点的 İ 是 i 的大写)。因此,如果您的方法名称的类名称具有上 I(newInstanceArgs、Image 等),您就会受到影响。

目前唯一的解决方法似乎是设置LC_CTYPE为某些工作区域,例如。

setlocale(LC_ALL, 'tr_TR');
setlocale(LC_CTYPE, 'en_US');
于 2012-10-13T14:49:43.857 回答
0

为什么项目在 Windows 上正确运行(我想您已经设置了开发服务器 - LAMP)而不是在实时服务器上?

我想实时服务器是 linux 发行版上的 Apache,所以您应该做的另一项检查是您在脚本中“包含”的文件是确切的文件名(我是说这个,例如,如果您包含“Lib. php”,而文件名是“lib.php”在windows中不会引发任何错误,“lib.php”将正常包含,但在linux(即实时服务器)中包含“lib.php”不会工作,因为文件名区分大小写。

于 2012-05-23T18:35:46.457 回答
0

在 Linux 上,文件名区分大小写,因此我猜测您的 UID() 函数位于名称包含错误的文件或文件夹中。检查所有脚本中所有 require、require_once、include、include_once 语句的完整路径的字符大小写。

于 2012-05-23T19:21:50.950 回答