fsockopenを二回分送れない【再編集1回目】 - PHPプロ!Q&A掲示板

2491

  • 0P

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

質問日時 / 2010年1月29日 22:14 (最終編集:1月30日 17:00)    回答数 / 5件

Questioner:  chiebukurophp4  このエントリーをはてなブックマークに追加 

キーワード / キーワードが設定されていません

初めまして。

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

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";
でそれぞれの値を挿入する事までは、出来たのですが、肝心の同時送信が出来ないのが難点です。

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



ツリー一覧

┣A01NurseAngelやりたいことがいまいちよくわからないのだが。
┃┗A01-1chiebukurophp4この意見は質問者によって削除されました。
┗A02shimix#レスが付いたあとで、元質問を編集するのはやめてく
 ┗A02-1chiebukurophp4わかりずらくて申し訳ございません。 自分でもよく
  ┗A02-1-1shimix仕様がわからないのでどうやればいいのか不明なのです
   ┗A02-1-1-1chiebukurophp4遅れました。 お答え頂きありがとうございました。

回答一覧

並び替え:

A01
answererNurseAngel [1月30日 04:11] (最終編集:1月30日 04:14)

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


・複数の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()しましょう。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerchiebukurophp4 [1月30日 12:31] (最終編集:1月30日 16:09)

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

ツリーへ TOPへ

A02
answerershimix [1月31日 18:21]

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

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に分けたりする必要があるのかどうかも気になるので、元々の仕様はどうだったのか知りたいです(元質問を編集されなければよかったんですが・・)。

この意見に回答する

ツリーへ TOPへ

A02-1
replyerchiebukurophp4 [1月31日 20:56] (最終編集:1月31日 21:01)

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

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

  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等で問題ございません。

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

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyershimix [2月1日 02:50] (最終編集:2月1日 20:57)

仕様がわからないのでどうやればいいのか不明なのですが、下記のソースだと「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で送らないといけませんが・・。

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

この意見に回答する

ツリーへ TOPへ

A02-1-1-1
replyerchiebukurophp4 [2月5日 14:07]

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

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

また宜しくお願い申し上げます。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)