phpです。
$stm_num['1'] = $_GET['stm_num'];
echo $stm_num['1'];
でなぜか、
$_GET['stm_num'] = 70
のときに、
$stm_num['1'] = 7
となってしまいます。
多分わたしが良く分かってないせいだとおもうのですが、考えられる原因を教えてください。
とりあえず今回の原因のみ。
まず、$stm_num が代入の前に使用されているとおもいます。
この時点で、変数は配列ではなく通常の変数の属性を持ちます。
その後で、
$stm_num['1'] = $_GET['stm_num'];
とすると、変数の2文字目にGETで送信された、変数を格納しようとするので、先頭の1文字が入ります。
ここで1234を送った場合
$echo "{$stm_num}//{$stm_num[1]}";
とすれば、1134//1 が表示されることでしょう。(70 なら 77//7)
だとしたら、問題の対策としては変数の使い方を、見直す必要があります。
問題解決に至らない場合、やり取りが長くなる可能性もありますし、開封ポイントも浪費するので、コメントを有効にしていただければ、そちらで回答いたします。
これだけでは何とも言えませんが、
実は70が7O(ななオー)だとか。
ありがとうございます!
70であることは間違いありません。
ちなみに、その間のコードを書くと、
if ($_GET['stm_num'] == "") {
$stm_num['1'] = 1;
} else {
$stm_num['1'] = $_GET['stm_num'];
}
for ($count_f=1;$count_f<10;$count_f++) {
$count_w = 1;
$count_n = 1;
while(true) {
echo $stm_num['1'];
です。
20や30の時も 2 や 3 になるのでしょうか。
また、
$_GET['stm_num'] = 7 ; // 一桁
$_GET['stm_num'] = 700 ; // 三桁以上
の場合はいかがでしょう。
そうなりました。
もう書き手としては、早急にかいけつしてほしい問題です。
はてなに、証拠プリントスクリーンが導入されるのを、非常に楽しみにしているのですが。
あ、ちなみに、環境を言わねばと思いました。
ロリポップです。
下記で試してみましたが、まったく問題ありませんでした。
<html> <head> </head> <body> <form method="GET"> SUBMIT VALUE =
SET NEW VALUE
<input type="text" name="stm_num"> <input type="submit" value="OK"> </body> </html>
気になったのは変数を配列にするのは何か意味があるのでしょうか。
$stm_num = $_GET['stm_num'];
でよいと思うのですが。
また、この処理の前で、
extract($_GET);
などとしていませんか?
これは、GET を name で定義されてたものに展開するので、
$stm_num が定義されます。
このあと、$stm_num[1] は変数の一部をとってくることになるので期待しない動作になります。
うわー。
欲しい情報です。
再帰なんです。
この辺の、仕様の境界は、難しくなりがちですよね?
> extract($_GET);
してません。
ポイントは惜しみません。
満足いくまで出します。
限界5000ぐらいは出します。
教えてください。
先ほどプレ記法で、肝心な部分が消えてました。
スーパプレ記法で再掲載します。
<html> <head> <? if ( isset( $_GET['stm_num'] ) ) { $stm_num[1] = $_GET['stm_num']; } else { $stm_num[1] ="NO VALUE"; } ?> </head> <body> <form method="GET"> SUBMIT VALUE = <?=$stm_num[1]?><br><br> SET NEW VALUE<br> <input type="text" name="stm_num"> <input type="submit" value="OK"> </body> </html>
先ほどのはポイント不要です。
差し支えなかったら、プログラムの関連部分の全容を
掲載できませんか。
(すくなくとも While の終わりまで)
後ほど(8時以降)内容を検討して回答させていただきたいと思います。
ありがとうございます!
えーと、whileの終了まで行くと140行近くになります。
直後にSQL文になるので、そこへの入力チェック用にechoしているのですが、これがどうもおかしいことが分かったという感じです。
まず、処理のはじめの部分で以下の内容を追記して $_GET の内容を確認してみてはいかがでしょうか。
var_dump($_GET);
これでもともと正しく取得できていないのか、それとも処理の途中であやまって値を書き換えてしまったのか切り分けられるはずです。
前者の場合の対応方法はあまり思い浮かびませんが、後者であれば、それぞれの処理の前後で var_dump($_GET) や var_dump($stm_num) とすることで、どの時点で問題が発生したのか分かると思います。
また、GETで値を取得しているのであれば、以下のようにURLに値が表示されていませんか。
http://example.com/test.php?stm_num=70
(個人的にはstr_split()などを使ってどこかで値を書き換えてしまっている可能性が高いような気がしますが。)
また、可能な限り全ての情報を公開した方が解決は早いと思います。
ソースコードも1番目の回答へのコメントの内容では括弧が閉じられておらず、無限ループしそうな内容です。
もう少し処理が見通せるようにコード(できれば全部)を公開されてみてはいかがでしょうか。
参考になれば幸いです。
echo $stm_num['1'];
を、
echo $_GET['stm_num'];
とすれば、70が出力されます。
原因が、
$stm_num['1'] = $_GET['stm_num'];
にあるとまでは追っていると思ってはいるのですが・・・。
>また、可能な限り全ての情報を公開した方が解決は早いと思います。
ソースコードも1番目の回答へのコメントの内容では括弧が閉じられておらず、無限ループしそうな内容です。
もう少し処理が見通せるようにコード(できれば全部)を公開されてみてはいかがでしょうか。
ありがとうございます。
こういう場合、どうしたらよいのでしょうか・・・。
とりあえず今回の原因のみ。
まず、$stm_num が代入の前に使用されているとおもいます。
この時点で、変数は配列ではなく通常の変数の属性を持ちます。
その後で、
$stm_num['1'] = $_GET['stm_num'];
とすると、変数の2文字目にGETで送信された、変数を格納しようとするので、先頭の1文字が入ります。
ここで1234を送った場合
$echo "{$stm_num}//{$stm_num[1]}";
とすれば、1134//1 が表示されることでしょう。(70 なら 77//7)
だとしたら、問題の対策としては変数の使い方を、見直す必要があります。
問題解決に至らない場合、やり取りが長くなる可能性もありますし、開封ポイントも浪費するので、コメントを有効にしていただければ、そちらで回答いたします。
★この辺っぽい!! うわー、クリティカルかも!★
現在検討中です。
ポイントは惜しみませんので、ご安心ください。
変数名のつけ方が、非常にまずそうというのはなんとなく気付いておりました・・・。
★検証終了★
ビンゴでした。
みなさん、ご教授いただき、
ありがとうございました。
★この辺っぽい!! うわー、クリティカルかも!★
現在検討中です。
ポイントは惜しみませんので、ご安心ください。
変数名のつけ方が、非常にまずそうというのはなんとなく気付いておりました・・・。
★検証終了★
ビンゴでした。
みなさん、ご教授いただき、
ありがとうございました。