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://...削除

注:私はすべてのPHPファイルを(いつものように)Notepad ++を使用して「BOMなしのUTF-8」でエンコードしています。興味深いことに、他のプロジェクトは同じ関数を使用して同じサーバーで実行してもうまく機能しています。

ありがとう。

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

更新(および解決策);

  1. 関数名に「I」(大文字の「i」)文字を使用しないでください。
  2. このようにsetlocaleを使用するだけです。setlocale(LC_TIME, "tr_TR.UTF-8")//ロケール時間の設定だけが必要で、これを使用しました
  3. 必要な場合は、に戻ることをLC_ALL忘れないでください。LC_CTYPEen_US

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

4

4 に答える 4

3

これは、PHPがトルコ語ロケール( 、…)を使用しているときに現れる「I問題」に苦しんでいることを示唆しています。その場合、大文字と小文字の「i」の間の大文字と小文字を区別しないチェックは失敗します。tr_TRtr_TR.utf8

https://bugs.php.net/18556 —「ロケールを「tr_TR」に設定するとクラス名が小文字になる」を参照してください。


いくつかの解決策があります。

  • 同じ大文字の文字(または、少なくとも文字「i」)を使用して関数を定義し、呼び出します。上または下は重要ではありません。
  • この(誤)動作の影響を受けないロケールを使用してください。

後者が推奨されます。これは主に、通常は1つの小さな変更ですべての問題を修正するタスクであるためです。

于 2012-05-23T21:37:58.900 に答える
1

これは実際には既知のバグですが、2002年以降はまだ修正されていません。#18556を参照してください。

要するに、PHPtolower()はロケールを認識する内部関数を使用しますが、トルコ語では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」を含める場合などです。ファイル名が「lib.php」の場合、「php」はウィンドウでエラーを発生せず、「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 に答える