【解決に200ポイント】


phpです。

$stm_num['1'] = $_GET['stm_num'];
echo $stm_num['1'];

でなぜか、
$_GET['stm_num'] = 70
のときに、
$stm_num['1'] = 7

となってしまいます。
多分わたしが良く分かってないせいだとおもうのですが、考えられる原因を教えてください。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2007/02/18 12:14:50
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.6

回答回数1314ベストアンサー獲得回数393

ポイント200pt

とりあえず今回の原因のみ。


まず、$stm_num が代入の前に使用されているとおもいます。

この時点で、変数は配列ではなく通常の変数の属性を持ちます。


その後で、

$stm_num['1'] = $_GET['stm_num'];

とすると、変数の2文字目にGETで送信された、変数を格納しようとするので、先頭の1文字が入ります。


ここで1234を送った場合

$echo "{$stm_num}//{$stm_num[1]}";

とすれば、1134//1 が表示されることでしょう。(70 なら 77//7)

だとしたら、問題の対策としては変数の使い方を、見直す必要があります。


問題解決に至らない場合、やり取りが長くなる可能性もありますし、開封ポイントも浪費するので、コメントを有効にしていただければ、そちらで回答いたします。

id:sharia

★この辺っぽい!! うわー、クリティカルかも!★

現在検討中です。

ポイントは惜しみませんので、ご安心ください。

変数名のつけ方が、非常にまずそうというのはなんとなく気付いておりました・・・。

★検証終了★

ビンゴでした。

みなさん、ご教授いただき、

ありがとうございました。

2007/02/18 12:13:39

その他の回答5件)

id:GEN111 No.1

回答回数472ベストアンサー獲得回数58

ポイント19pt

これだけでは何とも言えませんが、

実は70が7O(ななオー)だとか。

id:sharia

ありがとうございます!

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'];

です。

2007/02/17 17:19:28
id:GEN111 No.2

回答回数472ベストアンサー獲得回数58

ポイント19pt

20や30の時も 2 や 3 になるのでしょうか。

また、

$_GET['stm_num'] = 7 ; // 一桁

$_GET['stm_num'] = 700 ; // 三桁以上

の場合はいかがでしょう。

id:sharia

そうなりました。

もう書き手としては、早急にかいけつしてほしい問題です。

はてなに、証拠プリントスクリーンが導入されるのを、非常に楽しみにしているのですが。

あ、ちなみに、環境を言わねばと思いました。

ロリポップです。

2007/02/17 17:44:35
id:Mook No.3

回答回数1314ベストアンサー獲得回数393

ポイント18pt

下記で試してみましたが、まったく問題ありませんでした。

<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] は変数の一部をとってくることになるので期待しない動作になります。

id:sharia

うわー。

欲しい情報です。

再帰なんです。

この辺の、仕様の境界は、難しくなりがちですよね?

> extract($_GET);

してません。

ポイントは惜しみません。

満足いくまで出します。

限界5000ぐらいは出します。

教えてください。

2007/02/17 18:20:43
id:Mook No.4

回答回数1314ベストアンサー獲得回数393

ポイント18pt

先ほどプレ記法で、肝心な部分が消えてました。

スーパプレ記法で再掲載します。

<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時以降)内容を検討して回答させていただきたいと思います。

id:sharia

ありがとうございます!

えーと、whileの終了まで行くと140行近くになります。

直後にSQL文になるので、そこへの入力チェック用にechoしているのですが、これがどうもおかしいことが分かったという感じです。

2007/02/17 23:53:36
id:bonlife No.5

回答回数421ベストアンサー獲得回数75

ポイント18pt

まず、処理のはじめの部分で以下の内容を追記して $_GET の内容を確認してみてはいかがでしょうか。

var_dump($_GET);

これでもともと正しく取得できていないのか、それとも処理の途中であやまって値を書き換えてしまったのか切り分けられるはずです。

前者の場合の対応方法はあまり思い浮かびませんが、後者であれば、それぞれの処理の前後で var_dump($_GET) や var_dump($stm_num) とすることで、どの時点で問題が発生したのか分かると思います。

また、GETで値を取得しているのであれば、以下のようにURLに値が表示されていませんか。

http://example.com/test.php?stm_num=70

(個人的にはstr_split()などを使ってどこかで値を書き換えてしまっている可能性が高いような気がしますが。)

また、可能な限り全ての情報を公開した方が解決は早いと思います。

ソースコードも1番目の回答へのコメントの内容では括弧が閉じられておらず、無限ループしそうな内容です。

もう少し処理が見通せるようにコード(できれば全部)を公開されてみてはいかがでしょうか。

参考になれば幸いです。

id:sharia

echo $stm_num['1'];

を、

echo $_GET['stm_num'];

とすれば、70が出力されます。

原因が、

$stm_num['1'] = $_GET['stm_num'];

にあるとまでは追っていると思ってはいるのですが・・・。

>また、可能な限り全ての情報を公開した方が解決は早いと思います。

ソースコードも1番目の回答へのコメントの内容では括弧が閉じられておらず、無限ループしそうな内容です。

もう少し処理が見通せるようにコード(できれば全部)を公開されてみてはいかがでしょうか。

ありがとうございます。

こういう場合、どうしたらよいのでしょうか・・・。

2007/02/18 00:03:27
id:Mook No.6

回答回数1314ベストアンサー獲得回数393ここでベストアンサー

ポイント200pt

とりあえず今回の原因のみ。


まず、$stm_num が代入の前に使用されているとおもいます。

この時点で、変数は配列ではなく通常の変数の属性を持ちます。


その後で、

$stm_num['1'] = $_GET['stm_num'];

とすると、変数の2文字目にGETで送信された、変数を格納しようとするので、先頭の1文字が入ります。


ここで1234を送った場合

$echo "{$stm_num}//{$stm_num[1]}";

とすれば、1134//1 が表示されることでしょう。(70 なら 77//7)

だとしたら、問題の対策としては変数の使い方を、見直す必要があります。


問題解決に至らない場合、やり取りが長くなる可能性もありますし、開封ポイントも浪費するので、コメントを有効にしていただければ、そちらで回答いたします。

id:sharia

★この辺っぽい!! うわー、クリティカルかも!★

現在検討中です。

ポイントは惜しみませんので、ご安心ください。

変数名のつけ方が、非常にまずそうというのはなんとなく気付いておりました・・・。

★検証終了★

ビンゴでした。

みなさん、ご教授いただき、

ありがとうございました。

2007/02/18 12:13:39
  • id:bonlife
    すでに解決なさっているので蛇足かもしれませんが、ご確認いただけると幸いです。

    http://jp.php.net/manual/ja/language.types.string.php
    -----
    文字列への文字単位のアクセスと修正
    $str[42] のように、 角括弧を使用してゼロから始まるオフセットを指定すると、 文字列内の任意の文字にアクセスし、修正することが可能です。 つまり、文字列を文字の配列として考えるわけです。 波括弧の後に任意の文字をゼロから始まるオフセットで指定することにより、 文字列内の文字にアクセス/修正することが可能です。
    -----

    上記の説明にありますように、文字列と配列の扱いが似ている部分があります。
    質問だけを見た判断ですが、shariaさんは文字列と配列を混同しているように見受けられます。
    配列として変数を使う場合、あらかじめ $stm_num = array(); と宣言すべきです。

    また、var_dump()やprint_r()を使い、変数の内容を確認する習慣をつけておくと、今後自力で問題を解決できるようになると思います。
  • id:Mook
    多くのポイントありがとうございました。
    イルカ賞も 回答の励みになります。

    さて今回の件は、PHPが文字列への添字を配列への添字と同じ構文を使用してサポートしていることによります。

    型の明示的な指定がないのは、PHPを始める初心者に優しい反面、今回のような問題を生じます。
    http://search.net-newbie.com/php/language.types.type-juggling.html
    など御一読いただくと、今後の参考になるかと思います。

    P.S
    回答へのコメントを使った状況の報告は、問題に取組んでいる様子がわかり、なかなか良かったです。面白い使用方法ですね。
    よく回答した後、結果がわかるまでどうなったっか時間がかかり、やきもきすることもありますが、迅速な反応も好ましかったです。
  • id:sharia
    bonlifeさん

    >質問だけを見た判断ですが、shariaさんは文字列と配列を混同しているように見受けられます。
    >配列として変数を使う場合、あらかじめ $stm_num = array(); と宣言すべきです。

    >また、var_dump()やprint_r()を使い、変数の内容を確認する習慣をつけておくと、今後自力で問題を解決できるようになると思います。

    ありがとうございます。
    プログラマというわけではなかったので、基礎をあんまり勉強していないのです・・・。
    今、覚えなおしているところです・・・。
  • id:sharia
    Mookさん

    >多くのポイントありがとうございました。
    >イルカ賞も 回答の励みになります。

     いえいえ、とんでもありません・・・。
     ずっと、原因が分からなく、困っていたのです。

    >さて今回の件は、PHPが文字列への添字を配列への添字と同じ構文を使用してサポートしていることによります。

     これ、やばいですね・・・。こんがらがります。

    >回答へのコメントを使った状況の報告は、問題に取組んでいる様子がわかり、なかなか良かったです。面白い使用方法ですね。
    >よく回答した後、結果がわかるまでどうなったっか時間がかかり、やきもきすることもありますが、迅速な反応も好ましかったです。

     いえ、ありがとうございます。
     質問をする方の参考になれば幸いです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません