ホームページ >バックエンド開発 >PHPチュートリアル >PHP 変数が突然消えるのはなぜですか?

PHP 変数が突然消えるのはなぜですか?

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

特に奇妙な問題が発生しました。フォームから渡されたデータを POST を使用して取得し、変数に代入したところ、最初にこの変数を取得したときは、echo で問題なく表示できました。しかし、関数の実行中に消えてしまいました。 ! !
当初は、変数変換プロセス中の誤った書き込みが原因であると考えていましたが、調べてみるとそうではなく、特に奇妙な点は次のとおりです:
strtotime 関数を使用する前は、これをエコー出力しても問題はありませんでした変数! strtotime($time); を直接エコーしても問題ありませんが、$time=strtotime($time); を実行してから再度エコーすると、空であることがわかりました。 ! !空の! ! !

PS: 以前、コントローラーのデータはフロントエンドページに正しく渡されましたが、印刷時にコントローラーで print_r($res) を実行した限り、表示されませんでした。この配列で、ページが の位置に対応していることが分かり、実際に表示できるようになりました! ! !
これは ECSHOP のバグですか?じゃあ何?神様、アドバイスをください!


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

コードを投稿して見てください。 。 。

この場合、POST 値は送信されませんでしたか?フォームを再送信して、もう一度お試しください。

コードを投稿して見てください。 。 。


<?php $partners = $_POST['partners'];$starttime = $_POST['starttime'];$endtime1 = $_POST['endtime'];$sort_order = $_POST['sort_order'];@$id = $_POST['id'];$act = $_GET['act'];$actarr = array('add','edit');if(!in_array($act,$actarr) || ($id == '')){	header('Location: partners.php?act=list');}if(!empty($partners) && !empty($starttime) && !empty($endtime1)){	if(!get_magic_quotes_gpc())	{		$partners = addslashes($partners);	}	$starttime = strtotime($starttime);	$endtime = strtotime($endtime1);	@ $db = new mysqli('localhost', 'root', 'root', 'zhubao');	$db->set_charset("utf8");	if(mysqli_connect_errno()){		echo 'Error: Could not connect to database. Please try again later.';		exit;	}	if($act == 'add'){		$sql = "insert into ecs_partners (partners, starttime, endtime, sort_order)".	" values('".$partners."', ".$starttime.", ".$endtime.", ".$sort_order.")";	}elseif($act =='edit'){		$sql = "update ecs_partners set partners='".$partners."', starttime=".$starttime.		", endtime=".$endtime.", sort_order=".$sort_order." where id=".$id;	}	$res = $db->query($sql);	if($res){		echo "插入成功, 3秒后跳?<br />";		echo "或<a href='partners.php?act=list'>???接直接跳?</a>";		//header("Location: partners.php?act=list");		header("Refresh:3; url=partners.php?act=list");	}else{		echo "插入??出?,?稍後重?.<br />";		echo "或<a href='partners.php?act=list'>??回到主?面</a>";	}	$db->close();}?>

コードを投稿して見てください。 。 。


はい、試してみました。前のステップ、つまり、このステップの後の $endtime=strtotime($endtime); の後に、値が実際には空であることがわかりました。何が原因なのかわかりません

コードを投稿して見てください。 。 。

言い忘れていましたが、時間はjsによって判断され処理されるので、直接渡しました

$endtime = strtotime($endtime1);
strtotime関数の場合: 成功した場合はタイムスタンプを返し、それ以外の場合はFALSEを返します
$を渡しますendtime1 具体的な値は何ですか? ? echo strtotime($endtime1) とは何ですか? ?

$endtime = strtotime($endtime1);
strtotime 関数の場合: 成功した場合はタイムスタンプを返し、それ以外の場合は FALSE を返します
渡した $endtime1 の具体的な値は何ですか? ? echo strtotime($endtime1) とは何ですか? ?


渡されるのは、フォーマットされた時刻文字列: 2015-09-05 です。エコーされるのは、通常どおり出力できる変換されたタイムスタンプです。
重要なのは、変数が代入ステートメントの後に出力されるとき、実際には空であるということです


$endtime = strtotime($endtime1); strtotime 関数の場合: 成功した場合はタイムスタンプを返し、それ以外の場合は FALSE を返します
$endtime1 渡される具体的な値は何ですか? ? echo strtotime($endtime1) とは何ですか? ?

渡されるのは、フォーマットされた時刻文字列: 2015-09-05 です。エコーされるのは、通常どおり出力できる変換されたタイムスタンプです。
重要なのは、変数が代入ステートメントの後に出力されるとき、実際には空であるということです

あなたのステートメントを使用してコンピューターでテストしましたが、結果は正常で、投稿者が指摘した問題はありません。 。 。本当に奇妙です - null は null を意味しますか? $endtime = strtotime($endtime1); strtotime 関数の場合: 成功した場合はタイムスタンプを返し、それ以外の場合は FALSE を返します 具体的な値は何ですか?渡した $endtime1 の値は何ですか? ? echo strtotime($endtime1) とは何ですか? ?

渡されるのは、フォーマットされた時刻文字列: 2015-09-05 です。エコーされるのは、通常どおり出力できる変換されたタイムスタンプです。

重要なのは、変数が代入ステートメントの後に出力されるとき、実際には空であるということです


あなたのステートメントを使用してコンピューターでテストしましたが、結果は正常で、投稿者が指摘した問題はありません。 。 。それは本当に奇妙です - empty は null を意味しますか


さて、もう一度試してみると、var_dump(strtotime($endtime)) が bool(false) になっていることがわかりました




$endtime = strtotime ($endtime1); strtotime 関数: 成功した場合はタイムスタンプが返され、それ以外の場合は FALSE が返されます 渡した $endtime1 の具体的な値は何ですか? ? echo strtotime($endtime1) とは何ですか? ?
渡されるのは、フォーマットされた時刻文字列: 2015-09-05 です。エコーされるのは、通常どおり出力できる変換されたタイムスタンプです。

重要なのは、変数が代入ステートメントの後に出力されるとき、実際には空であるということです

あなたのステートメントを使用してコンピューターでテストしましたが、結果は正常で、投稿者が指摘した問題はありません。 。 。本当に奇妙です - 空というのは null の意味ですか?
この種のことは奇妙すぎて、言葉で明確に表現することができません。他の生徒を探してみます


理解できません。 Aiteモデレーターが見ていきます…




$endtime = strtotime($endtime1);
strtotime 関数の場合: 成功した場合はタイムスタンプを返し、それ以外の場合は FALSE を返します
渡した $endtime1 の具体的な値は何ですか? ? echo strtotime($endtime1) とは何ですか? ?


渡されるのは、フォーマットされた時刻文字列: 2015-09-05 です。エコーされるのは、通常どおり出力できる変換されたタイムスタンプです。
重要なのは、変数が代入ステートメントの後に出力されるとき、実際には空であるということです
あなたのステートメントを使用してコンピューターでテストしましたが、結果は正常で、投稿者が指摘した問題はありません。 。 。本当に奇妙です - empty は null を意味しますか?現時点では dump は存在しないため、間違いなく false が出力されます。変数名を混同していませんか?

$endtime = strtotime($endtime1);

strtotime 関数の場合: 成功した場合はタイムスタンプを返し、それ以外の場合は FALSE を返します
渡した $endtime1 の具体的な値は何ですか? ? echo strtotime($endtime1) とは何ですか? ?


渡されるのは、フォーマットされた時刻文字列: 2015-09-05 です。エコーされるのは、通常どおり出力できる変換されたタイムスタンプです。
重要なのは、変数が代入ステートメントの後に出力されるとき、実際には空であるということです

あなたのステートメントを使用してコンピューターでテストしましたが、結果は正常で、投稿者が指摘した問題はありません。 。 。本当に奇妙です - 空は null を意味しますか?

数日間、文字列 var_dump(strtotime('2070-01-01')) を直接使用しましたが、出力は実際には false でした

$endtime = strtotime ($endtime1);
strtotime 関数の場合: 成功した場合はタイムスタンプが返され、それ以外の場合は FALSE が返されます

渡した $endtime1 の具体的な値は何ですか? ? echo strtotime($endtime1) とは何ですか? ?

渡されるのは、フォーマットされた時刻文字列: 2015-09-05 です。エコーされるのは、通常どおり出力できる変換されたタイムスタンプです。
重要なのは、変数が代入ステートメントの後に出力されるとき、実際には空であるということです

あなたのステートメントを使用してコンピューターでテストしましたが、結果は正常で、投稿者が指摘した問題はありません。 。 。本当に奇妙です - empty は null を意味しますか?現時点では dump は存在しないので、間違いなく false が出力されます。変数名を間違えていませんか?


申し訳ありません、また名前を変更しました。これはPHPのバージョンに関係しているのでしょうか? 2010-01-01 を変換して印刷すると、出力されたタイムスタンプは正常でしたが、40 を超えるタイムスタンプはすべて false、php5.6.11 でした

これは strtotime の適用範囲に問題があります マニュアルには次のように記載されています:
可能性がありますstrtotime では処理できないと推測されます。日付は 2069 年以降です これはあなたの子供や孫の問題です。心配する必要はありません

それで、それが起こったのです。 。 。 。 。 。


これは strtotime の適用範囲に関する質問です
マニュアルには次の内容が含まれています:

strtotime は 2069 年以降の日付を処理できないと推測できます
これはあなたの子供や孫の問題であり、心配する必要はありません

はい、クラスメイトのパソコンで確認しました

ということでした。 。 。 。 。 。

どういう意味ですか?



これは strtotime の適用範囲に関する質問です マニュアルには次の内容が含まれています:

strtotime は 2069 年以降の日付を処理できないと推測できます

これはあなたの子供や孫の問題です。心配する必要はありませんそれ はい、クラスメートのコンピュータを使用しています 確認しました

つまり、クラスメートは 2070 年以降のタイムスタンプを strtotime で出力できるということですか? ?






これは strtotime の適用範囲に関する質問です

マニュアルには次の内容が含まれています strtotime は 2069 年以降の日付を処理できないと推測できます

これはあなたの子供や孫の問題であり、あなたが行うことではありません心配する必要があります

わかりました、私はそれを使用しています 私のクラスメートのコンピュータがそれを確認しました

つまり、あなたのクラスメートは strtotime で 2070 年以降のタイムスタンプを出力できるということですか? ?

はい、2080 も可能です。また、自分で新しいファイルを作成し、strtotime を使用して直接 2070 を出力したので、PHP の問題である可能性があります。

返信を読んで、すごいと思いました〜




strtotimeの適用範囲についての質問です
マニュアルには次の内容が含まれています:

strtotimeは2069年以降の日付を処理できないと推測できます
これこれは子供や孫の問題ですから、心配する必要はありません

わかりました、クラスメートのコンピューターで確認しましたつまり、クラスメートは 2070 年以降のタイムスタンプを strtotime で出力できるということですか? ? はい、2080 も可能です。また、自分で新しいファイルを作成し、strtotime で 2070 を直接出力したので、PHP の問題である可能性があります。
バージョンまたは PHP の設定の問題である可能性があります。通常の状況では、クラスメートと同じように正常に印刷できるはずであり、変数が失われることはありません。 。これは、strtotimeの適用範囲に関する質問です



マニュアルには次のようなものが含まれています。 、心配する必要はありません
はいはい、クラスメートのコンピューターで確認しました

つまり、クラスメートは strtotime で 2070 年以降のタイムスタンプを出力できるということですか? ?
はい、2080 も可能です。また、自分で新しいファイルを作成し、strtotime で 2070 を直接出力したので、PHP の問題である可能性があります。
バージョンまたは PHP の設定の問題である可能性があります。通常の状況では、クラスメートと同じように正常に印刷できるはずであり、変数が失われることはありません。 。


おそらく、私が環境を構築したので、変更がほとんどなく、いくつかのモジュールが有効になっていないと思います。

追伸: php5.6.12 を使用したことがあるかどうかはわかりませんが、いくつかのコンピューターでこのバージョンを試してみたところ、phpinfo にはカール情報がなく、作成者名のみが表示されることがわかりました。 Unix Millennium Bug としても知られるこの脆弱性は、32 ビット システムで時刻を記録するために UNIX タイムスタンプ整数を使用するすべての PHP およびその他のプログラミング言語に影響します。整数変数を保存できる最大時間は、2038 年 1 月 19 日 03:14:07 です。この時間を超えると、整数値はオーバーフローします。 1970 年 1 月 1 日から 2038 年 1 月 19 日火曜日 03:14:07 UTC まで、2^31 ? 1 は 0x7FFFFFFF であることを見たことがあると思います。ビット システムでは、これは最大の符号付き整数を表します。これを秒数で表すと約68.1年に相当し、まさに1970年から2038年までの数字となります。
64 ビット システムは影響を受けますか?
理論的にはそうではありませんが、テストすることを強くお勧めします。 64 ビット システムで保存できる最も遠い日付は、現在の宇宙年齢の 21 倍である 292 億年です。

私のローカルシステムも64ビットシステムですが、この問題も存在することがわかりましたが、Apacheが32ビットであることを確認したため、64ビットシステムであるだけでなく、Apacheも64ビットである必要がありますそれを避けるため

then 32
PHP はバージョン 5.2 から DateTime クラスを導入しました (バージョン 5.1 で実験的に追加され、バージョン 5.3 でいくつかのメソッドが拡張されました)。
64 ビット Apache で問題を解決できるかどうかはわかりませんが、64 ビット Apache のダウンロードも確認していますが、まだ見つかりません。
ええと、64 ビット Apache があるはずですよね?笑

Y2K38 脆弱性

Y2K38 (Unix Millennium Bug としても知られる) この脆弱性は、すべての 32 ビット システムで時間を記録するために UNIX タイムスタンプ整数を使用する PHP およびその他のプログラミング言語に影響を与えます。整数変数を保存できる最大時間は、2038 年 1 月
19 日 03:14:07 です。この時間を超えると、整数値はオーバーフローします。 1970 年 1 月 1 日から 2038 年 1 月 19 日火曜日 03:14:07 UTC まで、2^31 ? 1 は
0x7FFFFFFF であることを見たことがあると思います。ビット システムでは、これは最大の符号付き整数を表します。これを秒数で表すと約68.1年に相当し、まさに1970年から2038年までの数字となります。

64 ビット システムは影響を受けますか?

理論的にはそうではありませんが、テストすることを強くお勧めします。 64 ビット システムで保存できる最も遠い日付は、現在の宇宙年齢の 21 倍である 292 億年です。

私のローカルシステムも64ビットシステムですが、私にもこの問題があることがわかりましたが、Apacheが32ビットであることを確認したため、64ビットシステムだけではなく、Apacheであれば回避できますこれも 64 ビットです


私はすべて 64 ビットです

echo strtotime('2038/01/19 11:14:08') と echo strtotime('2038/01/19 11:14: 07'); 07 は出力できますが、08 は出力できません。ただし、win64 ビット システムで解決できるかどうかはまだテストしていません。ただし、Linux 64 ビットでは問題ないと思います。

理論上は不可能のようですが、私の勝利は 64 ビットであり、ソフトウェアも 64 ビットです。あなたは彼に尋ねることができます。彼の php バージョンが最新かどうかを確認するには、問題はありません。私の php は 5.5.15 です

echo strtotime('2038/01/19 11:14:08'); を試してみます。 '2038/01/19 11:14:07' ); 07 は出力できるが、08 は出力できないというのは本当ですか? オーバーフローの問題は確かですが、Win64 ビット システムでは解決できますか?まだ成功しました!ただし、Linux 64 ビットでは問題ないと思います。


試してみました。思った通りです。08 は空白です


echo strtotime('2038/01/19 11:14:08') と echo strtotime('2038/01/19 11) を試してみます。 :14:07'); 07 は出力できるが、08 は出力できないというのは本当ですか? オーバーフローの問題は確かですが、Win64 ビット システムでは解決できませんか?ただし、Linux 64 ビットでは問題ないと思います。


試してみました、思った通りです、08は空白です
なお、win7 64bitを使用しています



echo strtotime('2038/01/19 11:14:08' ) を試してみます; および echo strtotime('2038/01/19 11:14:07'); 07 は出力できますが、08 は出力できません。ただし、Win64 ビット システムでは解決できますか?まだ成功しました!ただし、Linux 64 ビットでは問題ないと思います。


試してみましたが、ご想像の通り、08は真っ白です
なお、win7 64bitを使用しています

Windows環境では、PHP6以下のバージョンは64ビットをサポートしていないことが公式に確認されています。 by PHP Windows版のPHP5はテスト版で正式版がないため、この問題は公式サイトで検索できます。

簡単に言うと、Windows 環境では、PHP5 の intval は 2147483647 までしかサポートされません。つまり、システム、WebServer、および PHP がすべて 64 ビット バージョンであっても、サポートされるのは 32 ビットのみです。 32 ビット。インターネット上の一部の人々は、64 ビット PHP が依然として 32 ビット モードを使用していると言っています。解決できるかどうかを確認するために、php7 をダウンロードします。問題。

64 ビット Linux バージョンの php を使用する場合は問題ありません

64 ビット Linux バージョンの php を使用する場合は問題ありません

centos+ のビルドに失敗しました。ソースコードを使用した Nginx+php+mariadb サーバー。何度も試しましたが、私の強度は大幅に低下しました

の 64 ビット Linux バージョンを使用する場合は問題ありません。 centos+Nginx+php+mariadb サーバーをソースコードで構築するのに何度も失敗しましたが、私は強くなりました

たとえ生命力が重傷であっても、私たちは努力し続けなければなりません

環境の要件のため。会社の規模に関係なく、導入とトラブルシューティング、RD は運用と保守作業の少なくとも半分を引き受けることができる必要があります

そして、私はまだ PHP 運用環境を開発していない人が使用しているのを見たことがあります。ウィンドウズ

テストの結果、php7 はこの問題を解決できますが、php7 は正式にリリースされていません。他にバグがあるかどうかはわかりません。



php

の64ビットLinux版を使用すれば問題ありません
ソースコードを使用してcentos+Nginx+php+mariadbサーバーを構築するのに何度も失敗し、ひどく苦労しましたダメージを受けました

活力 たとえ重傷を負っても、努力し続けなければなりません
環境の導入とトラブルシューティングの要件のため、会社の大小に関わらず、RD は少なくとも半分を引き受けることができる必要があります
そして、Windows を使用した PHP 本番環境を見たことがありません

テストの結果、php7 はこの問題を解決できることがわかりましたが、php7 は正式にリリースされていません。他にバグがあるかどうかはわかりません。



ありがとうございました。後でクラスメイトの php バージョンを送ります

皆さん、ありがとうございます、ありがとう

ごめんなさい、私が間違っていました。私のクラスメイトは CentOS5.4、64 ビットを使用しています

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