アシアル株式会社主催 開発者向け、一歩先をいくためのテクニカルセミナー

<< データベースからひっぱってきた画像... 質問一覧 外部のテキストファイルを読み込んたい >>
  • キーワードが設定されていません

  • 0P
fsockopenを二回分送れない【再編集1回目】

初めまして。

参考サイトを元にコードを作成してみました。

http://mrank.tv/u/regist.php?id=touroku
http://mrank.tv/u/regist.php?id=touroku1

の二つに同時登録する処理です。

一つに登録する処理は成功したのですが、それを二つの処理を簡略化した上で同時に出来るように書いてみたのですが、一つしか登録出来ずに困っております。

下記のコードをどのようにすれば解消出来ますでしょうか??
書いてみたもののいまいちforeachの部分がよくわかりません。
初歩的な質問で申し訳ございません。
宜しくお願い申し上げます。

  1. <?php
  2. $host = "mrank.tv";
  3. $post = "u/submit.php";
  4. $array = array(touroku,touroku1);
  5. $sock = fsockopen("$host"80$errno$errstr30);
  6. if (!$sock) die("$errstr ($errno)\n");
  7. foreach ($array as &$data) {
  8. $data = "Pid=5555&Password=1111&Title=a&URL=http://goo999.com/&Comment=an&Email=testtestesttesttest@docomo.ne.jp&CF_AlertMail=1&id=$data";
  9. fputs($sock"POST /$post HTTP/1.0\r\n");
  10. fputs($sock"Host: $host\r\n");
  11. fputs($sock"Content-type: application/x-www-form-urlencoded\r\n");
  12. fputs($sock"Content-length: " . strlen($data) . "\r\n");
  13. fputs($sock"Accept: */*\r\n");
  14. fputs($sock"\r\n");
  15. fputs($sock"$data\r\n");
  16. fputs($sock"\r\n");
  17. $headers = "";
  18. while ($str = trim(fgets($sock4096)))
  19. $headers .= "$str\n";
  20. $body = "";
  21. while (!feof($sock))
  22. $body .= fgets($sock4096);
  23. }
  24. echo<<<EOM
  25. <html>
  26. <head>
  27. <meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
  28. <title>登録</title>
  29. </head>
  30. <body>
  31. 登録完了
  32. </body>
  33. </html>
  34. EOM;
  35. fclose($sock);
  36. ?>

ご回答ありがとうございます。
コードを修正させて頂きました。
繰り返しの部分を教えて頂けますと幸いです。
宜しくお願い申し上げます。
$data = "Pid=5555&Password=1111&Title=a&URL=http://goo999.com/&Comment=an&Email=testtestesttesttest@docomo.ne.jp&CF_AlertMail=1&id=$data";
でそれぞれの値を挿入する事までは、出来たのですが、肝心の同時送信が出来ないのが難点です。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。

Qfsockopenを二回分送れない【再編集1回目】 chiebukurophp4  [01月29日 22時14分] 
┣Re:同時に二つ以上のFORMへと内容送信 NurseAngel  [01月30日 04時11分] 
┃┗(削除済み)
┗Re:fsockopenを二回分送れない【再編集1回目】 shimix  [01月31日 18時21分] 
  ┗Re:Re:fsockopenを二回分送れない【再編集1回目】 chiebukurophp4  [01月31日 20時56分] 
    ┗Re:Re:Re:fsockopenを二回分送れない【再編集1回目】 shimix  [02月01日 02時50分] 
      ┗Re:Re:Re:Re:fsockopenを二回分送れない【再編集1回目】 chiebukurophp4  [02月05日 14時07分] 

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

Re:同時に二つ以上のFORMへと内容送信

やりたいことがいまいちよくわからないのだが。


・複数のURLに一気にフォームを送信したい

フォームだけでは不可能です。
AJAXを利用する必要があります。
prototype.jsなりjQueryなりでググってくれ。


・idを複数送信したい

<input name="id" value="sorairo1">
<input name="id" value="ori783">
と送った場合、PHP側で$_POST["id"]はどちらかひとつ(後者だったかな?)しか受け取れません。

両方とも受け取りたい場合は
<input name="id[]" value="sorairo1">
<input name="id[]" value="ori783">
とする必要があります。

この場合$_POST["id"]は配列になるので、受け取る側の修正も必要です。


・手っ取り早く

test.php内で2回file_get_contents()する。



#入力値をそのまま出力してはいけません。
#必ずhtmlspecialchars()しましょう。

(削除済み)

この意見は質問者によって削除されました。

Re:fsockopenを二回分送れない【再編集1回目】

#レスが付いたあとで、元質問を編集するのはやめてくださいね。流れが全然読めなくなっています。
#またこの(書き直された)コードだと、このスクリプトが何を受け取っているのかすらわかりません。

foraechで・・ということですが、このソースで「ひとつは出来ている」のでしょうか?もし「同時送信が出来ない」というだけで「ひとつはPOSTできている」のであれば、foreachの中にfsockopen/fcloseを入れて試すくらいじゃないかと思います。

QueryStringで渡す部分とPOSTのContentとして渡す部分の、どちらにも「$data」があるというのはちょっと不思議な気がしますが、書き直す前はどうなっていましたっけ?QueryStringだけでいいなら、POSTする必要はない(file_get_contentsでいい)と思いまし、POSTでも$dataを渡すなら、QueryStringに含めなくてもいいんじゃないかと思いますがどうだったでしょう。

またapplication/x-www-form-urlencodedなのにurlencodeしているようにも思えないし、応答の受信をheaderとbodyに分けたりする必要があるのかどうかも気になるので、元々の仕様はどうだったのか知りたいです(元質問を編集されなければよかったんですが・・)。

Re:Re:fsockopenを二回分送れない【再編集1回目】

わかりずらくて申し訳ございません。

自分でもよく理解していないのが現状です。

  1. <?php
  2. $host = "mrank.tv";
  3. $post = "u/submit.php";
  4. $array = array(touroku1,touroku);
  5. $sock = fsockopen("$host"80$errno$errstr30);
  6. if (!$sock) die("$errstr ($errno)\n");
  7. foreach ($array as &$data) {
  8. $data = "Pid=5555&Password=1111&Title=a&URL=http://goo999.com/&Comment=an&Email=testtesttest@docomo.ne.jp&CF_AlertMail=1&id=$data";
  9. }
ここまでは、問題無く、$dataにそれぞれのIDが挿入されているようです。
実際にechoにして試した結果、
Pid=5555&Password=1111&Title=a&URL=http://goo999.com/&Comment=an&Email=testtesttest@docomo.ne.jp&CF_AlertMail=1&id=tourokuPid=5555&Password=1111&Title=a&URL=http://goo999.com/&Comment=an&Email=testtesttest@docomo.ne.jp&CF_AlertMail=1&id=touroku1
のようにそれぞれの値が挿入された状態で繋がって表示されておりました。

しかし、この$dataをそれぞれ送信する事が出来ません。
Pid=5555&Password=1111&Title=a&URL=http://goo999.com/&Comment=an&Email=testtesttest@docomo.ne.jp&CF_AlertMail=1&id=touroku
http://mrank.tv/u/regist.php?id=tourokuへと送信して登録させる

そしてPid=5555&Password=1111&Title=a&URL=http://goo999.com/&Comment=an&Email=testtesttest@docomo.ne.jp&CF_AlertMail=1&id=touroku1を
http://mrank.tv/u/regist.php?id=touroku1へと送信して登録させる

事が出来れば成功なのですが、これだと最初のやつしか送信されないようです。
なのでこの部分を同時に処理出来るようにforやforeach等で修正して頂けませんでしょうか??

  1. fputs($sock, "POST /$post HTTP/1.0\r\n");
  2. fputs($sock, "Host: $host\r\n");
  3. fputs($sock, "Content-type: application/x-www-form-urlencoded\r\n");
  4. fputs($sock, "Content-length: " . strlen($data) . "\r\n");
  5. fputs($sock, "Accept: */*\r\n");
  6. fputs($sock, "\r\n");
  7. fputs($sock, "$data\r\n");
  8. fputs($sock, "\r\n");
  9. $headers = "";
  10. while ($str = trim(fgets($sock, 4096)))
  11. $headers .= "$str\n";
  12. $body = "";
  13. while (!feof($sock))
  14. $body .= fgets($sock, 4096);
  15. echo<<<EOM
  16. <html>
  17. <head>
  18. <meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
  19. <title>登録</title>
  20. </head>
  21. <body>
  22. 登録完了
  23. </body>
  24. </html>
  25. EOM;
  26. fclose($sock);
  27. ?>
同じactionなので繰り返し処理が出来るとは、思うのですが、いかがでしょうか??

おかしな点や無駄だと思われる点を修正して頂けると非常に有難いです。

ちなみに、テストして頂けるという事であれば、
$data = "Pid=5555&Password=1111&Title=a&URL=http://goo999.com/&Comment=an&Email=testtesttest@docomo.ne.jp&CF_AlertMail=1&id=$data";

のPidとURLをテスト毎に変更しないと、重複登録になり登録出来ませんのでご注意願います。
私は、数字を1ずつ上げてテストしております。
一応、テスト用のサイトとして開設しているので、架空のURL等で問題ございません。

恐れ入りますが今一度ご返信頂ければ幸いです。
宜しくお願い申し上げます。

Re:Re:Re:fsockopenを二回分送れない【再編集1回目】

仕様がわからないのでどうやればいいのか不明なのですが、下記のソースだと「IDが見つかりません」というエラー画面が返ってきます。POST自体は出来ていますので、あとはよしなに・・

  1. <html>
  2. <head>
  3. <meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
  4. <title>登録</title>
  5. </head>
  6. <body>
  7. <?php
  8. $host = "mrank.tv";
  9. $post = "u/submit.php";
  10. $array = array(touroku,touroku1);
  11. foreach ($array as $item) {
  12.   $sock = fsockopen("$host"80$errno$errstr30);
  13.   if (!$sock) die("$errstr ($errno)\n");
  14.   $data = 'guid=ON&Pid=5555&Password=1111&Title=a&URL=' .
  15.     urlencode('http://goo999.com/') . '&Comment=an&Email=' .
  16.     urlencode('testtestesttesttest@docomo.ne.jp') . '&CF_AlertMail=1&id=' . $item;
  17.   print 'PostData<br />' . $data . '<hr />' . PHP_EOL;
  18.   fputs($sock"POST /$post HTTP/1.0\r\n");
  19.   fputs($sock"Host: $host\r\n");
  20.   fputs($sock"Content-length: " . strlen($data) . "\r\n");
  21.   fputs($sock"\r\n");
  22.   fputs($sock"$data\r\n");
  23.   fputs($sock"\r\n");
  24.   $res = '';
  25.   while (!feof($sock)) {
  26.     $res .= fgets ($sock,1024);
  27.   }
  28.   print 'Response<br /> . nl2br(htmlspecialchars($res));
  29.   print '<hr />' . PHP_EOL;
  30.   fclose($sock);
  31. }
  32. ?>
  33. 登録完了
  34. </body>
  35. </html>

#「guid=ON」はPOSTデータに含めても問題ないハズですよね。



(追記)
ただし、guid=ONというデータをPOSTする意味があるのかどうかは不知です。携帯端末の代理処理をお考えなら、受け取ったhttpヘッダから抜き出してsocketで送らないといけませんが・・。

#仕様が「わからない」ということなので、如何とも(汗

Re:Re:Re:Re:fsockopenを二回分送れない【再編集1回目】

遅れました。
お答え頂きありがとうございました。

なんとか、自己解決に至りました。
ご協力頂き本当にありがとうございました。

また宜しくお願い申し上げます。
データベースからひっぱってきた画像... 質問一覧 外部のテキストファイルを読み込んたい