window.openerでセットした値でCGIの動作が変わってしまう

このQ&Aのポイント
  • webメーラーをphpで作成中ですが、住所録から選択したメールアドレスをTo欄にセットする際に、エラーが発生してしまいます。
  • 手入力や親ウィンドウからの代入では問題なく動作しますが、子ウィンドウからの固定値の代入だけがエラーになります。
  • 現在の環境はWindows Vistaのクライアント、IE 7 / Firefoxのブラウザ、Windows 2003のサーバー、PHP 5 / Smarty / PEARです。
回答を見る
  • ベストアンサー

window.openerでセットした値でCGIの動作が変わってしまいます。

webメーラーをphpで作成中ですが、住所録を子ウィンドウで一覧表示、対象となるメールアドレスをクリックすると親ウィンドウのTo欄にメールアドレスがセットされるようなjavascriptを組んでいます。 To欄に直接メールアドレスを入力してのメール送信はOKなのですが,住所録から選択したメールアドレスでは送信時にエラーとなってしまいます。 お知恵を拝借させてください。 いろいろ試した結果、JS側の問題かなと推測したのでこちらのカテゴリに投稿します。カテゴリ違いであればご指摘ください。 文字数制限もある為、必要な情報は随時出します。 PHP側でのsend時のエラー: Failed to connect to :25 [SMTP: Failed to connect socket: $addr cannot be empty (code: -1, response: )] 子ウィンドウのJS function emailSet(val) { window.opener.document.form1.to.value = val; window.close(); } 環境等: クライアント(WindowsVista) ブラウザ(IE7/Firefox) サーバー(Windows2003)PHP5/Smarty/PEAR 親、子ウィンドウ共にShift-JIS 現在まで調べたこと: 手入力したときも住所録からセットしたときもphpのvar_dumpで見た限りではまったく同じでした。 Toへの直接入力・・・OK 親ウィンドウにボタンを配置してjavascriptでToへメールアドレスを代入・・・OK 子ウィンドウからメールアドレス固定でToへ代入・・・NG

  • qscft
  • お礼率80% (4/5)

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.5

連投失礼。 サーバへのpostにAjaxとか使ってるなら、Firefoxにfirebug入れてモニタリングするのもいいかもしれない? (私はProxomitron使ってるけど・・・Vistaで使えるかわからない)

qscft
質問者

お礼

ありがとうございます。現在、Ajaxは使用していません。 ただ単に子ウィンドウから window.opener.document.form1.to.value = 値; でセットしたtextboxの値を親ウインドウの決定ボタンを押したときにPOSTしているだけなんですが・・・ 取得した値をtrim()に通しているので、もしnullコードなどのコードが入っていればサーバー側では取れていると思います。

qscft
質問者

補足

全体お礼を書くところがないのでこちらから失礼します。 申し訳ありませんでした。大まかですが、原因が判明しました。 子ウィンドウを開いただけでNGとなってしまうようですので、javascriptは悪くないようです。 すべてのウィンドウのオープン時にセッションハイジャック対策用にセッションIDの再構築を行っているのですが、そのあたりが原因かなと推測できました。(send直前に値確認をして大丈夫なのになぜ?という問題は残りますが) 以降はphp側の問題(たぶんプログラムバグ)となりますので、こちらの質問はcloseさせていただきます。 皆様、ご助力いただき本当にありがとうございました。

その他の回答 (4)

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.4

送信データの確認方法ですが、 なるべく早い段階のデータを捕まえてOKの場合とNGの場合を比べたほうがいいような気がする。 ダンプとかじゃなく単純に送信formのmethodをpostからgetに変更してみれば、ブラウザが送信しているデータはURL欄で確認できますね。(multipartじゃなければ)

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.3

form1.to では無く別のパラメーターを、Mail の To: に入れてるとか、JavaScriptとは無関係な所でミスってたりしませんか?

qscft
質問者

お礼

回答が遅くなり申し訳ありません。 メール送信時(サーバー側)のsendへの引渡しToをvar_dump調べてみたところ、手入力と子ウィンドウでセットしたToの値(メールアドレス)に文字コードや値に違いがなかったので、じゃあ、JSのほうかなと推測しました。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

> なにか見えない値がくっついて入ってしまうのでしょうか それを確認できるのはあなただけよ。 私の手元にはそのプログラムはないもの。 ちなみに >前後を[]で囲むとよりいいわ はphpでやった方がいいわ。 htmlに出さずにファイルに出力するようにするとなおよし。

qscft
質問者

お礼

>はphpでやった方がいいわ。 >htmlに出さずにファイルに出力するようにするとなおよし。 バイナリ出力でファイル書き出しをしてみました。 OK時、NG時ともに同じバイト数が出力されています。 テキストエディタでは同じ内容でしたが、ダンプ比較できるようなフリーのソフトを探して比較してみます。

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

子ウィンドウから入力しようと 直接入力しようと それはクライアント側の処理よね。 サーバには一切関係ないわ。 となると、 単純に送信データか もしくは 子ウィンドウを表示する際に何かやっている としか思えないわ。 メールアドレスのドメイン部がおかしいんじゃないかしらと 勝手に想像。 とりあえず、 ・Toへの直接入力 ・子ウィンドウからメールアドレス固定でToへ代入 の2つで var_dumpじゃなく、 もっと直接的に受け取ったメールアドレスを出力して確認してみるのね。 前後を[]で囲むとよりいいわ。 たぶん余計な何かがついてたりするんじゃないかしら。

qscft
質問者

お礼

ご回答ありがとうございます。 >もっと直接的に受け取ったメールアドレスを出力して確認してみるのね。 >前後を[]で囲むとよりいいわ。 以下の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つ試してみたことがありますので補足に投稿します。

qscft
質問者

補足

住所録からメールアドレスを選択して親ウィンドウにメールアドレスが入る。 ↓ Toのテキストボックスに入った値を削除して、手入力でメールアドレスを入力。 この手順でもNGになってしまいます。一度windows.openerでセットするとダメなようです。 なにか見えない値がくっついて入ってしまうのでしょうか。

関連するQ&A

  • IE8のwindow.opener.location.href動作について

    宜しくお願い致します。 IE8のjavascript「window.opener.location.href」の動作がIE7から変わった様で、思い通りの動作をしなくなりました。 1、WEBサーバ側の親ウィンドウからWinXPにインストールしたローカルサーバ側のPHPスクリプトへwindow.openで子ポップアップウィンドウを開きます。 2、ローカルサーバ側の子ポップアップウィンドウで特定のプログラムを走らせ、WEBサーバ側の親ウィンドウへローカルサーバ側の子ポップアップウィンドウからwindow.opener.location.hrefで、親ウィンドウの表示ページを切り替える。 という動作をしていたのですが、IE8にアップデートしたら、ローカルサーバ側の子ウィンドウからWEBサーバ側のURLを切り替えると、別ウィンドウで開いてしまい、親ウィンドウが2ページに分かれます。 さらに、元の親ウィンドウはURLが変更にならず、新しく開いたページのURLだけ変わっています。 この動作をIE7と同じ様に、子ウィンドウから元の親ウィンドウのURLを変更させるにはどうすればよいのでしょうか?

  • 子WINDOWの値を親WINDOWに反映したい

    いつもお世話になっております。 現在、ファイルのアップロード部分を作成しているのですが、 そこで、ファイルをアップロードをすると子WINDOWSが表示されて、新しいファイル名などを表示しているのですが、その新しく作成したファイル名を、親WINDOWSのテキストエリアに表示させたいのです。 イメージとしては、子WINDOWS上に「ファイル名を転送」のようなボタンを作成して、それをクリックしたら、子画面が閉じて、親WINDOWSのテキストエリアにファイル名が記載されるようにしたいです。 親から子WINDOWを開く際は、window.openerを使って開いているのですが、 どうしても子画面から、親画面に値を反映させる部分がわかりません。 大変お手数ですが、ご教授いただけないでしょうか。 以下部分部分ではありますが、ソースを表示します。 ★親WINDOW ■子WINDOWを開くjavasclipt部分 <script type="text/javascript"> function pop(obj) { wobj = window.open("", "pop","scrollbars=yes,width=480,height=360"); obj.target = "pop"; wobj.focus(); return true; } </script> ■子WINDOWを開くことになるファイルをアップロードする部分 <form action="./upload.php" method="POST" enctype="multipart/form-data" target="pop" accept-charset="utf-8" onsubmit="return pop(this)"> <input type="hidden" name="MAX_FILE_SIZE" value="10485760" /> <!--1024*1024*10 = 10MB--> <input type="file" name="my_file" /> <INPUT TYPE="hidden" NAME="shainid" VALUE="<%=sShainid%>"> <input type="submit" value="ファイルの転送開始する" /> </form> ■子WINDOWから、新ファイル名を記載したい部分 <form action = "touroku.asp" method="POST" onsubmit="return chkHissu(this)" name="form01"> <textarea name="tenpu" style="width:100%" rows=3 id="tenpu"></textarea> ★子WINDOW PHPの新しいファイル名の部分など echo 'アップロードは成功しました。<br /><br />'; echo 'ファイル名 : '.$safehtml_myfile_name.'<br />'; echo 'MIME型 : '.$safehtml_myfile_type.'<br />'; echo 'ファイルサイズ : '.number_format($myfile_size).' bytes<br />'; echo '新しいファイル名 : '.$new_file_name.'<br />'; ・$new_file_name.を親WINDOWのテキストエリア部分に渡して、反映したいです。 大変お手数ですが、ご教授宜しくお願いいたします。

  • プログラムがちゃんと動作しません。

    最近PHPの勉強をはじめました。 今お店の情報をデータベースに書き込むPHPを作成しています。 概要としては、form.phpからinputで入力された値をPOSTでform.htmlに送りそれぞれの項目の記入忘れがないかをチェックし、すべて記入されていれば確認のページへジャンプするというページを作成しています。 入力チェックをしたときに、記入忘れの項目を指摘し、ちゃんと入力するようにメッセージを表示するようにしたいのですが、何も表示されずに困っています。(記入忘れがあるときはすでに入力したものがフォームに入力されたままの状態になるようにしたいと重いinputにはvalueを設定しています) form.phpは以下のように記述されています。 form.php----------------------------------------------------------- <?php $error_message = array(); $listname = array( "tenmei" => "店名", "tenmei_y" => "店名のよみがな", "zipcode" => "郵便番号", "address" => "住所", "address_y" => "住所の読み仮名", "tel" => "電話番号" ); if (isset($_POST["regist"])) { foreach($_POST as $key => $val){ if (isset($val)) { $value[$key] = "$val"; } else { $i = $listname["$val"]; $error_message[] = "$iを入力して下さい"; } } } $tenmei = $value[tenmei]; $tenmei_y = $value[tenmei_y]; $zipcode = $value[zipcode]; $address = $value[address]; $address_y = $value[address_y]; $tel = $value[tel]; ?> <HTML> <BODY> <?php if (count($error_message)) { foreach ($error_message as $message) { print ($message<br>); } } print <<<eot <form method="POST" action="form.php"> 店名:<input type="text" name="tenmei" value="$tenmei"><br> 店名のよみがな:<input type="text" name="tenmei_y" value="$tenmei_y"><br> 郵便番号:<input type="text" name="zipcode" value="$zipcode"><br> 住所:<input type="text" name="address" value="$address"><br> 住所のよみがな:<input type="text" name="address_y" value="$address_y"><br> 電話番号:<input type="text" name="tel" value="$tel"><br> <input type="submit" name="regist" value="入力完了"> </form> eot; ?> ------------------------------------------------------------------- まだ、入力チェックすらできない状態なので、ちゃんと入力した場合に確認のページへジャンプする機能はまだつけていません。 情報が不足している部分がありましたら補足いたします。 文法が間違っている部分がたくさんあるかもしれませんが その部分を指摘していただけたら幸いです。 どうかご教授のほどよろしくおねがいします。

    • ベストアンサー
    • PHP
  • Window 7 インストール

    Window 7 インストール PC初心者です。 windows XP から windows 7 にアップデート?を試みました。 しかし正しくインストールされず、青いエラー画面になってしまいました。 現象を以下に乗せます。 1.windouw XP のデスクトップ画面から window 7(32bit、CDで) をインストール 2.問題なく進み再起動が自動でかかる 3.青い画面になり以下エラーメッセージが表示される STOP:c0000145 {Application Error) The application was unable to start correctly (0xc0000005). Click OK to close the application. 4.何を入力しても青い画面から動かない ネットで色々調べたのですが原因が判りません。 何が問題なのでしょうか?

  • window.open親から子ウィンドウ内の値

    下記アドレスのように開いたウインドウから親ウィンドウの値を操作する事はできるのですが、これの反対バージョンはできないでしょうか? http://ausdruck.flier.jp/test/window/oya.html ウィンドウをオープンボタンを押した時点で開いた子ウィンドウ内に値を渡す方法です。 いろんな方法を試してみたのですがなかなかうまくいかず困っています、どなたか御存知の方がいましたら御教授お願いします。

  • window.onloadの実行と抑止の分岐方法

    親ウィンドウと子ウィンドウの間でデータを共有したいと思い、下記のソースを作成しました。 親ウィンドウで任意の文言を入力し、子ウィンドウを開くをクリックすると、子ウィンドウに値が渡されます。 子ウィンドウで任意の文言を入力し、値をセットをクリックすると、親ウィンドウに値が渡されます。 しかし親ウィンドウから子ウィンドウで値を渡した後、任意の文言を入力し送信ボタンを押すと、index.phpで子ウィンドウの変更後の文言をテキスト欄の値をセットしたあと、 子ウィンドウのwindow.onloadが走って値を追加してしまいました(下記のソースは簡易的なもののため、子ウィンドウのテキスト欄には<input type="text">を使用しておりますが、 実際には<select multiple="multiple">を使用しているため、下記のような表示になります)。 1. 親ウィンドウから子ウィンドウにセットされたテキストの例 あああ 2. 子ウィンドウで変更した文言 いいい 3. 送信ボタンクリック 子ウィンドウのselectには下記が表示されます。 いいい あああ その為、子ウィンドウでsubmitした際は、window.onloadを抑止できれば良いと思ったのですが、具体的にどう記述すればよいかわかりませんでしたので、 アドバイスいただける方がいらっしゃいましたら、ご教示の程、よろしくお願いします。 また、window.onloadの抑止にこだわっているわけではありません。 上記の送信ボタンクリック時、子ウィンドウのselectの中が「いいい」と表示される方法があれば大丈夫です。 【親ウィンドウ(index.html)】 <script type="text/javascript"> <!-- function window_open() { window.open('sub.html', null, 'width = 640, height = 480, scrollbars = yes' ) }; //--> </script> </head> <body> <form action="index.php" method="post" name="form00" id="form00"> <a onclick="window_open()" href="javascript:void(0)">子ウィンドウを開く</a> <br /> <input type="text" name="text00" value="" /> </form> </body> 【子ウィンドウ(sub.html)】 <script type="text/javascript"> <!-- window.onload = function() { if(window.opener) { document.form01.text01.value = window.opener.document.form00.text00.value; } } function Set() { window.opener.document.form00.text00.value = document.form01.text01.value; window.close(); } //--> </script> </head> <body> <form action="index.php" method="post" name="form01" id="form01"> <input type="text" name="text01" /> <input type="button" onclick="Set()" value="値をセット" /> <input type="submit" value="再読込" /> </form> </body> 以上、よろしくお願いします。

  • Window Live メールのメッセージルール

    Window Live メールを使用していますがメッセージルールを適用させたいと思っています。 OutlookExpressでは、送信者のメールアドレスを入力しても振り分けられましたが、Window Live メールでは、送信者のメールアドレスを入力しても、表示されている送信者の名前でないと、適用されません。 設定画面は同じなので、仕様も同じかなと思っていましたが、これでは、なりすましメールも勝手に振り分けられてしまいます。 送信者のメールアドレスで振り分けする方法はないものでしょうか? また、どうしてもツールバーを表示できません。Altキーでも駄目です。 どなたか、よろしくお願いいたします。

  • phpでメール2重チェック機能をする方法

    現在メールフォームを作成してまして、 どうしてもメールの2重チェックがうまくいかずご質問させていただきました。 (ちなみにphp勉強中で初心者です) 現在php内で入力したものがjsのチェック機能と連動して、 入力エラーを表示させるようにしました。 メールアドレス部分は、 //メールアドレス入力チェック if(document.mailform.mail.value==""){ window.alert('メールアドレスを入力してください'); return false; // 送信を中止 } //メールアドレス入力チェック if(document.mailform.mail_fix.value==""){ window.alert('確認用メールアドレスを入力してください'); return false; // 送信を中止 } // PCメールアドレスチェック if(document.mailform.mail.value != "" ){ if (!document.mailform.mail.value.match(/^[A-Za-z0-9.-]+[\w-]+@[\w\.-]+\.\w{2,}$/)){ window.alert('メールアドレスをご確認ください'); document.mailform.mail.focus(); return false; // 送信を中止 } ここまで作成し、入力エラーまではでるようになりました。 ただ2重チェックがうまくいかず困っています。。。 ifelseというのでやるようなのですが、、、 わからなくなったので是非教えていただけますでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • フォームへ入力した値の取得について

    PHPを始めたばかりの初心者です。 Windows NT4.0 + apache 1.3.24 + php 4.20の環境で 以下のようなサンプルプログラムを作って実行したのですが、「送信」ボタンを押しても、入力した文字が表示されません。初歩的な質問ですいませんが、原因を御教授下さい。 <HTML> <body> <FORM ACTION="sample.php" METHOD="POST"> 文字の入力 <INPUT TYPE="text" NAME="val" VALUE=""><BR> <INPUT TYPE="submit" VALUE="送信"> </FORM> <BR> <?PHP print "入力文字は<B>" . $val . " </B>です。"; ?> </BODY> </HTML>

    • ベストアンサー
    • PHP
  • こんなCGIさがしています

    メールフォームがベースでこのような機能(すべて)があるものを探しています。CGI、PHP問いません。あまり複雑でなければデータベース利用もOKです。 また有償・無償も問いません(あまり高いのは・・・)。 1.PC、携帯両方から送信できる 2.メール受信のほかにCSV保存 3.自動返信メール 4.ログ保存機能(頻繁に利用してもらうので、住所や名前などをローカルやサーバーに保存して、毎回の入力の手間を軽減させたい) 1~3の機能があるものはあちこちにあるのですが、4の機能がなくて困っています。 IDとPWでログインして、必要事項のみメールフォームに入力、送信されるデータには会員の情報も自動的に添付される・・・などといったものでも構わないのですが。 どなたかご存じありませんか?

    • 締切済み
    • CGI

専門家に質問してみよう