PHPでトラックバック送信する関数を作成する

このQ&Aのポイント
  • PHPでトラックバックを送信するための関数を作成していますが、うまくいきません。エラーも出ず、どこが問題なのか分かりません。助けてください。
  • トラックバックPINGに失敗しましたというエラーメッセージが表示されていますが、原因が分かりません。何かアドバイスをいただけると助かります。
  • トラックバックの送信先URLや必要なデータを設定し、HTTPリクエストを作成していますが、エラーが出てしまいます。どこに問題があるのか教えてください。
回答を見る
  • ベストアンサー

PHPでトラックバック送信しようとしているのですが・・

下のような関数を作ってトラックバックを送信する機能を実装しようとしていますが、全く上手くいきません・・。$targeturlなどの引数の値は別のPHPスクリプトから取得しています。 やっかいなのは、このプログラムを実行してもエラーが出ないことです。そのため、どこが問題なのか全く分かりません。最後の変数$resの中身も空っぽです。さっぱりわかりません・・。どうか助けてください・・。 function sendTBPing($targeturl, $topicid, $title, $excerpt){   $port = 80;   $query = "";   // POSTするデータの作成   $post = "title=".urlencode(mb_convert_encoding($title,   "UTF-8"));   $post = $post."&url=".urlencode("http://users.mswave.com/~tsugio/blog/archives.php?topicid=". $topicid);   $post = $post."&excerpt=".urlencode(mb_convert_encoding($excerpt, "UTF-8"));   $post = $post."&blog_name=".urlencode(mb_convert_encoding('sample', "UTF-8"));      // ping先URLからホスト名やパスを取り出す   $pingurl = parse_url($targeturl);   if(isset($pingurl['query'])){ $query = "?".$pingurl['query'];   }   if(isset($pingurl['port'])){ $port = $pingurl['port'];   }   // HTTPリクエストの作成   $req = "POST".$pingurl['path'].$query."HTTP/1.1\r\n";   $req = $req."Host: ".$pingurl['host']."\r\n";   $req = $req."User-Agent: PHP/".phpversion()."\r\n";   $req = $req."Content-type: application/x-www-form-urlencoded\r\n";   $req = $req."Content-Length: ".strlen($post)."\r\n\r\n";   $req = $req.$post."\r\n";   // ソケットを開く   $fn = fsockopen($pingurl['host'], $port);   if($fn === false){ throw new exception("トラックバックPINGに失敗しました");   }   // 送信   fputs($fn, $req);   // レスポンス受信   $res = "";   while(!feof($fn)){ $res = $res.fgets($fn);   }   fclose($fn);  // レスポンスのボディに<error>1</error>が含まれていればエラー   list($rhead, $rbody) = split("\r\n\r\n", $res, 2);   $rbody = urlencode($rbody);   if(strstr($rbody, "<error>1</error>") !== false){ throw new exception($rbody);   } }

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

$reqの中身が正しくないのではないでしょうか。 HTTPヘッダがどのようになっている確認してみてください。

Sugichi28
質問者

お礼

すいません。勘違いしてました。存在しない関数(mysql_open())を使っていて、DBにアクセスできなかっただけでした・・。お騒がせしました。無事に受信もできました。 同様に苦労されている方のために上のプログラムを正しく直すのであれば、DBへの接続処理の部分を直すだけです。

Sugichi28
質問者

補足

 回答ありがとうございます。確かにreqの内容がおかしかったです・・。urlの項目を修正したら送信ができました!  そこで、送信側はこれで解決したのですが、問題は受信側です。こちらがまたうんともすんとも言いません・・。いろいろなサイトを見て回りましたが、いまいち分かりません。下にphpファイルを載せます。 <?php if(!isset($_GET['tb_id'])) trError("Entry not exist"); $topicid = trim($_GET['tb_id']); $url = ""; $title = ""; $excerpt = ""; $blog_name = ""; if(isset($_POST['url'])) $url = $_POST['url']; else if(isset($_GET['url'])) $url = $_GET['url']; else trError("url is empty"); if(isset($_POST['title'])) $title = $_POST['title']; else if(isset($_GET['title'])) $title = $_GET['title']; $title = mb_convert_encoding(trim($title), mb_internal_encoding(), "auto"); if(isset($_POST['excerpt'])) $excerpt = $_POST['excerpt']; else if(isset($_GET['excerpt'])) $excerpt = $_GET['excerpt']; $excerpt = mb_convert_encoding(trim($excerpt), mb_internal_encoding(), "auto"); if(isset($_POST['blog_name'])) $blog_name = $_POST['blog_name']; else if(isset($_GET['blog_name'])) $blog_name = $_GET['blog_name']; $blog_name = mb_convert_encoding(trim($blog_name), mb_internal_encoding(), "auto"); $dbh = mysql_open("users.mswave.com", "username", "password", "dbname"); if($dbh === false) trError("DB open error"); $sqlstr = "insert into trackbacks values (null, '$topicid', '$url', '$title', '$excerpt', '$blog_name')"; $result = mysql_query($sqlstr); if($result === false) trError("DB write error"); // 成功メッセージを送る header("Content-type: application/xml"); echo"<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\r\n"; echo"<response>\r\n"; echo"<error>0</error>\r\n"; echo"</response>\r\n"; exit(); function trError($msg){ header("Content-type: application/xml"); echo"<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\r\n"; echo"<response>\r\n"; echo"<error>1</error>\r\n"; echo"<message>".$msg."</message>\r\n"; echo"</response>\r\n"; exit(); } ?> もし仮にこのファイルに問題がなければ、トラックバックを送る側はこのファイルへqueryでtb_id=nとつけて送れば受信できるのではないでしょうか?そもそもそこが間違っていたらどうしようもないんですよね・・。どうなんでしょう、教えてください~~。お願いします!

関連するQ&A

  • phpを実行するとファイルダウンロードになる

    教えてください 以下のプログラムを記述したphpを実行すると、ファイルダウンロードになってしまいます ※プログラムはあるサイトにPOST送信をするものです 解決方法を教えてください よろしくお願いします <?php //ホスト設定 $host = "aaa.bbb.jp"; //パス設定 $path = "/data.php"; //POSTデータ設定 $data = "AAA=111&BBB=222&CCC=333&DDD=444"; //URLエンコード $data = urlencode($data); //実行 header("POST " . $path . " HTTP/1.1\r\n"); header("Host: " . $host . "\r\n"); header("Content-type: application/x-www-form-urlencoded\r\n"); header("Content-length: " . strlen($data) . "\r\n\r\n"); header($data); exit(0); ?>

    • 締切済み
    • PHP
  • 自作ブログのPing送信について

    お世話になります。 現在自作ブログからphpによる各PingサーバへのPing送信を試みていますが、 チェックしてみると下記のようなエラーが出てしまいます。 色々と調べて、サンプルを応用してみたのですが。。。 原因がわかりましたら是非ご教授ください。 よろしくお願いいたします。 下記のFunctionを実行します。 $titleと$siteurlの値は問題なく入っています。 function SendPing($server, $title, $siteurl){ foreach($server as $value){ //送信先サーバURLをホスト名とパス名に分解する $value = rtrim($value); $arr = parse_url($value); $host = $arr["host"]; $path = $arr["path"]; echo($host); echo"<br />"; //送信先サーバをオープンする if($sock = @fsockopen($host, 80, $errno, $errstr, 20)){ //送信データをつくる $title = urlencode($title); $siteurl = urlencode($siteurl); $params = "<?xml version=\"1.0\" ?>\r\n"; $params .= "<methodCall>\r\n"; $params .= "<methodName>weblogUpdates.ping</methodName>\r\n"; $params .= "<params>\r\n"; $params .= "<param>\r\n"; $params .= "<value>$title</value>\r\n"; $params .= "</param>\r\n"; $params .= "<param>\r\n"; $params .= "<value>$siteurl</value>\r\n"; $params .= "</param>\r\n"; $params .= "</params>\r\n"; $params .= "</methodCall>\r\n"; //送信する fputs($sock, "POST ".$path." HTTP/1.0\r\n"); fputs($sock, "Host: $host\r\n"); fputs($sock, "Content-type: text/xml\r\n"); fputs($sock, "Content-length: ".strlen($param)."\r\n"); fputs($sock, "User-Agent: MSIE7.0\r\n"); fputs($sock, "Connection: Close\r\n"); fputs($sock, "\r\n"); fputs($sock, "$param\r\n"); //リターンを受け取る $res = ""; while (!feof($sock)){ $res .= fgetc($sock); } fclose($sock); //リターンからエラーコードを解釈する preg_match("/(\<\?xml)(.*)(\<\/methodResponse\>)/s", $res, $arr); $res = preg_replace("/UTF-8/i", "utf-8", $arr[0]); echo $res."<br />"; } } } すると下記のようなエラーが出ます。 blog.goo.ne.jp faultString parse error. not well formed. error occurred at line 1, column 1, byte index 0 faultCode -32700 api.my.yahoo.co.jp ping.bloggers.jp faultCode 105 faultString XML error: Invalid document end at line 1, column 1 rpc.technorati.jp rpc.weblogs.com messageCan't accept the ping because the URL must begin with http:// or https://.legalYou agree that use of the Weblogs.com ping service is governed by the Terms of Use found at www.weblogs.com.flerror1 ping.fc2.com faultCode 1 faultString The method you requested, '', was not found. blogsearch.google.co.jp flerror1 messageUnable to parse XML-RPC request. よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • LWPでPOST送信した後に送信先に移動したい

    LWPで別サーバーのtest.cgiに以下のようなコードで POST送信しています。 use HTTP::Request::Common; use LWP::UserAgent; $query="param1=dummy"; $ua = LWP::UserAgent->new(); $req = HTTP::Request->new(POST => "http://xxx.xxx.xxx/test.cgi"); $req -> content_type('application/x-www-form-urlencoded'); $req -> content($query); $res = $ua->request($req); $success = $res -> is_success; if(!$success){ die("error"); } $con = $res -> content; この場合、$conにtest.cgiの出力が入るだけで、 URLのhttp://xxx.xxx.xxx/test.cgiに遷移することはできません。 HTMLのformタグでPOST送信したときのように、 POSTでデータを送信してかつ、その送信先に移動するということはできるのでしょうか。 LWPでなくてもいいです。 要するにHTMLのformタグでのPOST送信を手動ではなく、自動で行いたいわけですが、 <form action="http://xxx.xxx.xxx/test.cgi" method="post"> <input type="hidden" name="param1" value="dummy"> </form> このようなタグのあるHTMLを表示して、 JavaScriptでonLoadでsubmitすればできるのですが、 JavaScriptを使っているとSSLの場合にセキュリティのアラートがでる場合があるので、 できればPerlだけでできないかと思ったのです。

  • phpでの受信

    ある質問ページでphpでの受信について、以下のような回答がありました。「サイトの代表アドレス」と「受け取る側のアドレス」は同じにしました。しかしエラーがでました。どこが間違いでしょうか ーーーーーーーーー 「フォーム」にname,subject,commentの欄があるとする。phpでの受信するには次のようなphpになります。 <?php $rp='-f サイトの代表アドレス'; $subject=mime(mb_convert_encoding($_POST['subject'],'JIS','UTF-8')); $body=mb_convert_encoding($_POST['name']."\n".$_POST['comment'],'JIS','UTF -8'); $head="Content-Type: text/plain; charset=ISO-2022-JP\nContent-Transfer- Encoding: 7bit"; mail('受け取る側のアドレス',$subject,$body,"From: サイトの代表アドレス\n".$head,$rp); ?> </body> </html>

    • ベストアンサー
    • PHP
  • ActionScriptとPHPでメール送信

    【flashmail.as】 LV1 = new LoadVars(); LV1.onLoad = function(success){ gotoAndStop(2); // 2フレーム目に移動 } var1 = ""; var2 = ""; var3 = ""; gotoAndStop(1); on(press){ if(var1==""){err=err+"名前が入力されていません!\n");} if(var2==""){err=err+"メールアドレスが入力されていません!\n");} if(var3==""){err=err+"メッセージが入力されていません!\n");} LV1.var1 = var1; LV1.var2 = var2; LV1.var3 = var3; if(err==""){ LV1.sendAndLoad("./flashmail.php", LV1, "POST"); } } 以上のようなactionscriptファイルと、FLAHファイル本体flashmail.flaの2フレーム目に 同様の文を、アクションとして、書いてます。もちろん、モーションファイルflashmail.swfも書き出して、FTPサーバーの同じディレクトリに置いています。 動きとしては、メールフォームに入力して、送信ボタンを押すと、ありがとうございました。 と表示され、そのあと、flashmail.phpのmb_send_mail() でメール送信するはずなのですが、メールが到着しません。 flashmail.phpの内容も下記に表示します。 【flashmail.php】 <?php $subject = $_POST['var1']; $to = $_POST['var2']; $message = $_POST['var3']; var_dump($message); $from = "~"; $subject = mb_convert_encoding($subject, "utf-8", "auto"); // utf-8にエンコード $message= mb_convert_encoding($message, "utf-8", "auto"); mb_internal_encoding("UTF-8"); $res = mb_send_mail($to, $subject, $message, $from); header("Location: flashmail.html"); ?> どうすれば、メールが到着するようになるのか、ご指導お願いします。

    • ベストアンサー
    • PHP
  • PEAR HTTP_Requestでのヘッダ送信

    PEARのHTTP_Requestを使用し、 下記処理にてTEST_URL向けにPOSTとヘッダを同時に送信する処理を行いたいのですが 411 Length Requiredで返ってきてしまします。 サーバのログには Invalid URI in request Connection: Keep-Alive というログがerrorログに出ています。 そこでRFCを読んで見ると、 転送コーディングが施されていない場合は Content-Length ヘッダは送られなければならないが、 メッセージボディ中のオクテット数と 正確に一致しなければならないとの記載がありました。 ここに引っかかっているのかもと思い対策しようと思いましたが メッセージボディのlength(下記の☆部分)をどのように拾うかがわかりません。 require_once "HTTP/Request.php"; $req = &new HTTP_Request(TEST_URL,array()); $req->setURL(TEST_URL); $req->setMethod(HTTP_REQUEST_METHOD_POST); $req->addHeader('Host',"test.hogehoge.jp\r\n"); $req->addHeader('Content-Length',"-☆-\r\n"); $req->addHeader('Connection', "Keep-Alive\r\n"); $req->addHeader('User-Agent',"TEST ABCDEFG\r\n"); $req->addPostData('TEST_POST', 'testnano'); $result = $req->sendRequest(); if(PEAR::isError($result)) { echo $result->getMessage(); echo "<br />"; } else { echo $req->getResponseCode(); echo "<br />"; echo $req->getResponseBody(); echo "<br />"; } もしかして違う原因でしょうか? よろしくおねがいします。

    • 締切済み
    • PHP
  • PHPから携帯へメール送信

    いつもお世話になっております。 PHPから携帯電話へ"絵文字付き"でメールを送るプログラムを作成している のですが、『base64_encode』等を使用して絵文字の表示までは行う事がで きました。 ですが、本文が途中で途切れてしまうのです・・・。 PHP側は、 $to = mb_convert_encoding(mb_decode_mimeheader($structure->headers['from']), 'SJIS', 'ISO-2022-JP'); $subject = mb_convert_encoding(mb_decode_mimeheader($structure->headers['subject']), 'SJIS', 'ISO-2022-JP'); (省略)  ・  ・ $body = $structure->body; $body = preg_replace('/\s*>\s.*/', '', $body); $body = mb_convert_encoding($body, 'SJIS', 'ISO-2022-JP'); //---------------------------------- // base64_encode //---------------------------------- $subject = "=?shift_jis?B?" . base64_encode($subject) . "?="; $body = base64_encode($body); //---------------------------------- // ヘッダを作成 //---------------------------------- $headers = "From: test@mail.com\n"; $headers .= "MIME-Version: 1.0\n"; $headers .= "Content-Type: text/plain; charset=Shift-JIS\n"; $headers .= "Content-Transfer-Encoding: base64"; //---------------------------------- // メール送信 //---------------------------------- $res = mail($to, $subject, $body, $headers);  ・  ・ (省略) 上記のように記述しています。 メールは送れます。絵文字も表示されます。ですが、本文が途中で途切れ てしまいます。 どなたかご教授をお願い致します。

    • ベストアンサー
    • PHP
  • php 投票システム

    データベースと連動した投票システムを考えております。 phpとMySQLを使用したもので、対応するボタンを押すと1票投じられるというものです。 この仕組み自体は実現できたのですが、 ブラウザの更新ボタンを押すと、『情報を再送信する必要があります』と表示され、『はい』を押すと、自動的に1票投じられてしまいます。 スクリプトは以下のようになるのですが、上記のような不具合を修正するためにはどうすればよいのでしょうか。 アドバイス、具体的なソース、また、他の部分における修正すべき箇所など、ご指摘いただきたいと思います。 よろしくお願いいたします。 <?php echo "<table border=0>"; echo "<tr><td colspan=4 align=left><img src=logo-touhyou.gif></td></tr>"; echo "<tr><td><form method=post action="; echo $_SERVER["PHP_SELF"]; echo "><input type=hidden value=1 name=posi><input type=image src=logo-posi-s.gif border=0></form></td>"; echo "<td><form method=post action="; echo $_SERVER["PHP_SELF"]; echo "><input type=hidden value=1 name=deep><input type=image src=logo-deep-s.gif border=0></form></td></tr></table>"; $posi=$_POST["posi"]; $deep=$_POST["deep"]; if ($posi==1){ $server="mysql..jp"; $dbname="LA"; $user="LA"; $pass=""; $conn = mysql_connect($server,$user,$pass); $conndb = mysql_select_db($dbname); $sql="SELECT posi FROM test WHERE id =1 LIMIT 1"; $res=mysql_query($sql); while($row = mysql_fetch_assoc($res)) { $row_con=mb_convert_encoding($row["posi"], "shift_jis", "auto"); echo $row_con; echo "<br>"; $number1=1; $after=$row_con+$number1; echo $after; echo "<br>"; mysql_query("LOCK TABLES test WRITE"); $sql_1="UPDATE test SET posi='$after3' WHERE id =1 LIMIT 1"; $ins=mysql_query($sql); mysql_query("UNLOCK TABLES"); if ($ins_1){ echo "ポジティブ投票完了"; } $sql_2="SELECT posi FROM test WHERE id =1 LIMIT 1"; $res_2=mysql_query($sql_2); while($row_2 = mysql_fetch_assoc($res_2)) { $row_con_2=mb_convert_encoding($row_2["posi"], "shift_jis", "auto"); echo $row_con_2; } } mysql_close($conn); } if ($deep==1){ $server="mysql..jp"; $dbname="LA"; $user="LA"; $pass=""; $conn = mysql_connect($server,$user,$pass); $conndb = mysql_select_db($dbname); $sql2="SELECT deep FROM test WHERE id =2 LIMIT 1"; $res2=mysql_query($sql2); while($row2 = mysql_fetch_assoc($res2)) { $row_con2=mb_convert_encoding($row2["deep"], "shift_jis", "auto"); echo $row_con2; echo "<br>"; $number1=1; $after2=$row_con2+$number1; echo $after2; echo "<br>"; mysql_query("LOCK TABLES test WRITE"); $sql2_2="UPDATE test SET deep='$after2' WHERE id =2 LIMIT 1"; $ins2=mysql_query($sql2_2); mysql_query("UNLOCK TABLES"); if ($ins2){ echo "ディープ投票完了"; } $sql2_2="SELECT deep FROM test WHERE id =4 LIMIT 1"; $res2_2=mysql_query($sql2_2); while($row2_2 = mysql_fetch_assoc($res2_2)) { $row_con2_2=mb_convert_encoding($row2_2["deep"], "shift_jis", "auto"); echo $row_con2_2; } } mysql_close($conn); } ?>

    • ベストアンサー
    • PHP
  • PHPとMySQLの文字化けの対応法は?

    OSはWinXPで、MySQL+PHPのアプリを作成しているところです。 <html> <head><title>配列データの取得</title></head> <body> <table border="1"> <tr><td>題名</td><td>著者</td><td>出版社</td></tr> <?php $host = "localhost"; if (!$conn = mysql_connect($host, "user", "pass")){ die("MySQL接続エラー.<br />"); } mysql_select_db("kisop", $conn); $sql = "SELECT * FROM book_table LIMIT 10"; $res = mysql_query($sql,$conn); while($row = mysql_fetch_array($res)) { print("<tr>"); print("<td>".$row["btitle"]."</td>"); print("<td>".$row["bauth"]."</td>"); print("<td>".$row["bpub"]."</td>"); print("</tr>\n"); } mysql_free_result($res); ?> </table> </body> </html> と、こんな演習をしているのですが、ブラウザに表示させると文字化けしました。 HTML文はEUC、MySQLのデータは、シフトJISで入っていたようです。 そのため、「題名」「著者」などの見出しと、取り出したデータを同時に文字化けさせずに、表示できない 状態です(泣)。 MySQLからデータを取り出すときに、mb_convert_encodingで文字コードを変換してやれば 化けないでしょうが、出力しようとするデータのすべてを変換しなければなりません。 プログラマーさんたちは、文字化けの現象について、どう対応されているのでしょうか? いちいち、mb_convert_encodingで、変換しているものなのでしょうか? 定石のようなものを知りたいところです。 たとえば、HTML文は文字コード○○を使うものだ、設定ファイルを書き換えておく、などなど。 よろしくおねがいします。

    • ベストアンサー
    • PHP
  • PHPでのフォーム送信・・・・

    function send_mail($name,$mail,$birth,$high,$pref,$hobby,$contents,$host,$ua,$time) { session_unset(); if(!$name) $name = "NoName"; if(!$sbj) $sbj = "From Mailform+"; $mes = "$name($mail)$high 様からのお問い合わせです。\n\n"; $contents = str_replace("<br>", "\n", $contents); if($url) $mes .= "●URL: $url\n\n"; $mes .= "【お問い合わせ内容】 (".date('Y.m.d (D) H:i:s', $time).")\n"; $mes .= "メールアドレス:::($mail)\n"; $mes .= "誕生日($birth)\n"; $mes .= "身長($high) cm\n"; $mes .= "お住い:::($pref)\n"; $mes .= "趣味:::($hobby)\n"; $mes .= "疑問点:::($msg)\n"; $mes .= "───────────────────────────────────\n"; $mes .= "$contents\n"; $mes .= "───────────────────────────────────\n"; $mes .= "$host\n$ua"; if(get_magic_quotes_gpc()) $mes = stripslashes($mes); $mes = mb_convert_encoding($mes, "JIS", "SJIS"); $header = "From:" .mb_encode_mimeheader($name) ."<$mail>"; $send = mb_send_mail(RECIPIENT, $sbj, $mes, $header); if($send) success("正常に送信されました"); else error("送信に失敗しました"); } ?> 上記PHPなのですが、送信自体は大丈夫なのですが、 誕生日・身長・お住い・趣味・疑問点 がメールを受信時に反映されません。 $mail と $name だけはちゃんと入力したとおりに出ます。 どの部分を訂正すれば正しくメールを受け取れますでしょうか・・・。 PHP初心者なので検討違いの質問をしていましたらすみません・・・。

    • ベストアンサー
    • PHP