ホームページ  >  記事  >  バックエンド開発  >  win7x64とcentosでintvalの最大値の範囲が異なる問題

win7x64とcentosでintvalの最大値の範囲が異なる問題

WBOY
WBOYオリジナル
2016-06-23 13:34:04972ブラウズ

私は開発に win7x64 を使用しており、Web サーバーは php5.5 の組み込み Web サーバーを使用しています。
昨日、同じコードが win7 と centos で異なる結果になることに気づきました。
var_dump(intval(') 21474836470')) ;
Win7 での出力: int 2147483647
Centos での出力: int 30000000000

マニュアルには次のように記載されています:
最大値はオペレーティング システムによって異なります。 32 ビット システムでの符号付き整数の最大範囲は、-2147483648 ~ 2147483647 です。
64 ビット システムでは、符号付き整数値の最大は 9223372036854775807 です。

しかし、私のシステムは win7x64 です。ダウンロードした php は検証済みで、64 ビット バージョンです。
intval が 32 ビットであるように見えるのはなぜですか? ? ?
Windows の下の phpinfo を見ると、それが 64 ビットであることもわかります:
PHP バージョン 5.5.14
システム Windows NT 7D494368868AFA1 6.1 ビルド 7601 (Windows 7 Ultimate Edition Service Pack 1) AMD64
ビルド日 2014 年 6 月 25 日 12: 37:32
コンパイラー MSVC11 (Visual C++ 2012)
アーキテクチャ x64


ディスカッションへの返信 (解決策)

これは、オペレーティング システムのバージョンだけでなく、PHP のバージョンにも依存します。 公式の PHP バージョンは次のとおりです。すべて 32 ビット

64 ビット バージョンは php5.5 以降のみ、その他は 32 ビットです

php5.5 以降のみ 64 ビット バージョンがあり、その他は 32 ビットです



私の php は64 ビット バージョン 5.5、
別の添付ファイルは、exe が 32 ビット プログラムか 64 ビット プログラムかを判断する方法です。 UE を使用して exe を開きます。行 00000100h の近くに、次の値があります。
"PE. .L" (16 進コード: 504500004C) = 32 ビット
または
"PE ..d?" (16 進コード: 504500006486) = 64 ビット

誰か知っていますか? ? ?
皆さんは Win または Linux のみで開発していますか?

開発に64ビット版を使用する必要があるかどうかは、動作環境によって異なります。
そうしないと、64 ビット サーバーが見つからないため、プロジェクトは中止されます
さらに、64 ビット システムは、真のシステムと偽のシステムに分けられます。64 ビット アーキテクチャを備えた 64 ビット システムと、32 ビット アーキテクチャを備えた 64 ビット システムです。ビット アーキテクチャ (32 ビット システムでは 32 ビット、および準 32 ビットと呼ばれます)

さらに、発生した問題はバグである可能性があります (バグ Web サイトで確認できます)。現在は 5.6.9 である可能性があります。それは修正されましたか?

開発に 64 ビット版を使用する必要があるかどうかは、動作環境によって異なります。
そうしないと、64 ビット サーバーが見つからないため、プロジェクトは中止されます
さらに、64 ビット システムは、真のシステムと偽のシステムに分けられます。64 ビット アーキテクチャを備えた 64 ビット システムと、32 ビット アーキテクチャを備えた 64 ビット システムです。ビット アーキテクチャ (32 ビット システムでは 32 ビット、および準 32 ビットと呼ばれます)

さらに、発生した問題はバグである可能性があります (バグ Web サイトで確認できます)。現在は 5.6.9 である可能性があります。それは修正されましたか?



https://bugs.php.net/ を検索しましたが、関連するバグ情報は見つかりませんでした。
さらに、同じ最大番号 2147483647 もサポートしています。

参照 今後、この不整合な環境の問題を回避するために、開発のために Centos に移行するように最善を尽くす必要があります

また、私が尋ねた質問には間違いがありますが、問題は編集できないはずです。 :
var_dump(intval('30000000000' ; .php.net/bug.php?id=69704

実際、64 ビット整数がサポートされている場合でも、依然として危険が潜んでいます。演算結果が 64 を超えた場合はどうなりますか-ビット整数?

PHP は、マシンの影響を受けない高精度の数値演算関数ライブラリを提供しており、数億桁 (数億ではなく 10 桁のみ) の数値も計算できます


実際、たとえそれができたとしても。は 64 ビット整数をサポートしていますが、演算結果が 64 ビット整数を超えた場合は、まだ危険が潜んでいます。

PHP は、マシンの影響を受けない高精度の数値計算関数ライブラリを提供しており、数億桁 (数億ではなく 10 桁のみ) の数値も計算できます


現在のビジネス シナリオは、ユーザー テーブルの自動インクリメント ID が 32 ビットの有効な値の範囲を超えており、開発中にエラーが発生しましたが、オンラインは正常です

64 ビットの有効な値の範囲は、少なくとも 10 年先になると推定されており、その日に会えるかどうかさえわかりませんが、笑

自動インクリメント ID の場合、MySQL は 64 ビット整数である BIGINT 自体を提供します。
自動インクリメント ID は単なる識別子であり、数学的には関与しません。

自動インクリメント ID の場合、MySQL は 64 ビット整数である BIGINT 自体を提供します。これは PHP で文字列として処理できます。はい、以前の処理では文字列を intval で変換し、それが数値であるかどうかを判断します。は数値であり、SQL クエリに参加します

あなたが作成した SQL コマンドでは、数値が引用符で囲まれていませんか?
aaa=123 と aaa='123' は同じですが、後者の方が前者よりはるかに安全です


作成する SQL 命令内の数字は引用符で囲む必要はありませんか? aaa=123 と aaa='123' は同じですが、後者の方が前者よりもはるかに安全です


さて、私の SQL は結合されておらず、where id=? と同様のパラメーター受け渡しスキームであり、結果としてSQL 引用符で囲みます

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。