- ベストアンサー
window.openerでセットした値でCGIの動作が変わってしまう
- webメーラーをphpで作成中ですが、住所録から選択したメールアドレスをTo欄にセットする際に、エラーが発生してしまいます。
- 手入力や親ウィンドウからの代入では問題なく動作しますが、子ウィンドウからの固定値の代入だけがエラーになります。
- 現在の環境はWindows Vistaのクライアント、IE 7 / Firefoxのブラウザ、Windows 2003のサーバー、PHP 5 / Smarty / PEARです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
連投失礼。 サーバへのpostにAjaxとか使ってるなら、Firefoxにfirebug入れてモニタリングするのもいいかもしれない? (私はProxomitron使ってるけど・・・Vistaで使えるかわからない)
その他の回答 (4)
- steel_gray
- ベストアンサー率66% (1052/1578)
送信データの確認方法ですが、 なるべく早い段階のデータを捕まえてOKの場合とNGの場合を比べたほうがいいような気がする。 ダンプとかじゃなく単純に送信formのmethodをpostからgetに変更してみれば、ブラウザが送信しているデータはURL欄で確認できますね。(multipartじゃなければ)
- zxcv0000
- ベストアンサー率56% (111/196)
form1.to では無く別のパラメーターを、Mail の To: に入れてるとか、JavaScriptとは無関係な所でミスってたりしませんか?
お礼
回答が遅くなり申し訳ありません。 メール送信時(サーバー側)のsendへの引渡しToをvar_dump調べてみたところ、手入力と子ウィンドウでセットしたToの値(メールアドレス)に文字コードや値に違いがなかったので、じゃあ、JSのほうかなと推測しました。
- askaaska
- ベストアンサー率35% (1455/4149)
> なにか見えない値がくっついて入ってしまうのでしょうか それを確認できるのはあなただけよ。 私の手元にはそのプログラムはないもの。 ちなみに >前後を[]で囲むとよりいいわ はphpでやった方がいいわ。 htmlに出さずにファイルに出力するようにするとなおよし。
お礼
>はphpでやった方がいいわ。 >htmlに出さずにファイルに出力するようにするとなおよし。 バイナリ出力でファイル書き出しをしてみました。 OK時、NG時ともに同じバイト数が出力されています。 テキストエディタでは同じ内容でしたが、ダンプ比較できるようなフリーのソフトを探して比較してみます。
- askaaska
- ベストアンサー率35% (1455/4149)
子ウィンドウから入力しようと 直接入力しようと それはクライアント側の処理よね。 サーバには一切関係ないわ。 となると、 単純に送信データか もしくは 子ウィンドウを表示する際に何かやっている としか思えないわ。 メールアドレスのドメイン部がおかしいんじゃないかしらと 勝手に想像。 とりあえず、 ・Toへの直接入力 ・子ウィンドウからメールアドレス固定でToへ代入 の2つで var_dumpじゃなく、 もっと直接的に受け取ったメールアドレスを出力して確認してみるのね。 前後を[]で囲むとよりいいわ。 たぶん余計な何かがついてたりするんじゃないかしら。
お礼
ご回答ありがとうございます。 >もっと直接的に受け取ったメールアドレスを出力して確認してみるのね。 >前後を[]で囲むとよりいいわ。 以下のJSを書いて試してみました。 子ウィンドウ: function emailSet(val) { var owner = window.opener; owner.add_to('test@example.com'); window.close(); } 親ウィンドウ: function add_to(val) { document.form1.to.value = "[" + val + "]"; } これで試してみましたが,間に[]と引数の間になにも入っていないようです。(見た目) 1つ試してみたことがありますので補足に投稿します。
補足
住所録からメールアドレスを選択して親ウィンドウにメールアドレスが入る。 ↓ Toのテキストボックスに入った値を削除して、手入力でメールアドレスを入力。 この手順でもNGになってしまいます。一度windows.openerでセットするとダメなようです。 なにか見えない値がくっついて入ってしまうのでしょうか。
お礼
ありがとうございます。現在、Ajaxは使用していません。 ただ単に子ウィンドウから window.opener.document.form1.to.value = 値; でセットしたtextboxの値を親ウインドウの決定ボタンを押したときにPOSTしているだけなんですが・・・ 取得した値をtrim()に通しているので、もしnullコードなどのコードが入っていればサーバー側では取れていると思います。
補足
全体お礼を書くところがないのでこちらから失礼します。 申し訳ありませんでした。大まかですが、原因が判明しました。 子ウィンドウを開いただけでNGとなってしまうようですので、javascriptは悪くないようです。 すべてのウィンドウのオープン時にセッションハイジャック対策用にセッションIDの再構築を行っているのですが、そのあたりが原因かなと推測できました。(send直前に値確認をして大丈夫なのになぜ?という問題は残りますが) 以降はphp側の問題(たぶんプログラムバグ)となりますので、こちらの質問はcloseさせていただきます。 皆様、ご助力いただき本当にありがとうございました。