上記のサンプルコードを改変したphpプログラムを書いています。
まず上記改変する前のサンプルコードでは問題が起こらないので
サーバーの設定などには問題が無いと考えています。
ソース改変後
<?php getAndDispFunc( "中古" ); ?>の部分を例えばウェブマネーと
すると画像の様にエラーが起こってしまいます。
ニンテンドープリペイド と入れると問題は起きません
あと半角英語でも問題が起きた事が無く、ウェブマネーをURLエンコードしたURLを
ブラウザに入れても問題無くエラーが起こるようなことはありません。
データーは一応全部UTF-8で保存しています。
構成として
index.php (test.phpの呼び出し)
test.php (set.phpとkeyword.phpを読み込んで実行)
set.php (設定情報をまとめたファイル)
keyword.php (検索ワードを記述するファイル)
ソースをアップロードしたので原因がわかる方教えてください
PASS 1234hatena です。
http://ll.la/NH)f
1件しか見つからなかった場合のレスポンスデータの構造が違っていたのが原因です。
(※PHPserializeのみ確認。XMLとJSONPの場合は不明です。)
次のようにすると正常に表示されます。
function getAndDispFunc( $keyword ){ require_once "set.php"; //キャッシュの作成 $cache_time = 1*3600; $result = require_once 'Cache/Lite.php'; if ($result === false){ echo 'パスが違う?'; exit(); } $cache_id = $set1; $option = array('cacheDir' => 'tmp/', 'lifetime' => $cache_time,); $cache_lite = new Cache_Lite($option); $cache_data = $cache_lite->get($cache_id); if($cache_data){ $html_title[0] = $cache_data; }else{ //conecoリクエストURLの作成 $requestUra = "http://api.coneco.net/cws/v1/SearchProducts?apikey=*** Your CONECO API Key ***"; //$requestUra .= "&comId=$set2"; //商品IDの指定 $requestUra .= "&keyword=" . urlencode( $keyword ); //conecoAPIリクエスト実行 $res2 = file_get_contents($requestUra); $html=mb_convert_encoding(file_get_contents($requestUra), 'UTF-8', 'auto'); $pattern = "/(?<=<LowestPrice>).+?(?=<\/LowestPrice>)/mis"; preg_match($pattern,$html,$html_title); $cache_lite->save($html_title[0], $cache_id); } //cocone IDの設定が無い場合の処理 if( isset($html_title[0]) ){ } else { $html_title[0] = $set6; } //リクエストURL作成 $requestUrl = "http://auctions.yahooapis.jp/AuctionWebService/V2/php/search?"; $uranai_bangou = rand(1,11); if ($uranai_bangou == 1) { $requestUrl .= "appid=LuXDRiSxg677.Bfle4jIRp7rOtuoeGdm1q0gEhrTXnwMz35nRN8XnkRb8fas1PdqTKyoqZg-"; } elseif ($uranai_bangou == 2) { $requestUrl .= "appid=oxJbSFqxg65eKTlbRVJo9xLvRG3rpoGZvD8CIcBbGPhD9nTjRH.cN3fuYabO4btsVOkkees-"; } elseif ($uranai_bangou == 3) { $requestUrl .= "appid=_eDyS7Wxg66n.rnBFsvExdgO7Bi8CCVJVMfPDue77EZnQRFJ_X4Cf0mEh.o4I3_sc_8xSes-"; } elseif ($uranai_bangou == 4) { $requestUrl .= "appid=Gcyamraxg65Ps3GnOTAgqTloZ6O1bHlKOROOMeR5H4PxU4cwQSIAmk628bcSO.vGNQz3roA-"; } elseif ($uranai_bangou == 5) { $requestUrl .= "appid=Huh7gbmxg665fWm5z_FwlDQ4oN.1MKjxSgl7xkkksVCRsnfUehDCH8w2uUojydk5cbaGV9g-"; } elseif ($uranai_bangou == 6) { $requestUrl .= "appid=ccaZaSOxg66DjX5ssW6a2Fn1IxX_3VbHJnMTjbSz6xNi8Q.y5yzShh0Wpxjy_rattovDeKE-"; } elseif ($uranai_bangou == 7) { $requestUrl .= "appid=KbzQRh6xg67njNwThrQE4jbJ7VAsOGG9ZHeIQgBKU1jncMVJLCjXjltwuU7sXwoEr1.JKUo-"; } elseif ($uranai_bangou == 8) { $requestUrl .= "appid=PU0hqPexg66HGfMn.FpEDBpicax5AjkJ01qie.hJ45I7tcvVLk0G19XHvrL28VD6JXkYZmw-"; } elseif ($uranai_bangou == 9) { $requestUrl .= "appid=JsNp9rSxg64um9srcjBlt6rws4GCSKlK4t4j1dCZhEQij9onYshnbsZgIbZTccrSWMnitfE-"; } else { $requestUrl .= "appid=1g9Htxuxg64fs_yk4BrPCL9Hqec9s3gqN5W_waSFcEayuG2MeTr4p4eamvtj5dUEGdff7N4-"; } $requestUrl .= "&category=$set3"; //カテゴリ「空気清浄機」 $requestUrl .= "&query=" . urlencode( $keyword );; //検索キーワードをUTF-8でURLエンコード $requestUrl .= "&sort=bidorbuy&order=b"; //ソート $requestUrl .= "&thumbnail=1"; //画像ありの商品の絞り込み $requestUrl .= "&aucmaxprice="; //最大価格 $requestUrl .= "&aucminprice="; //最小価格 $requestUrl .= "&aucmax_bidorbuy_price=$html_title[0]"; //即決最大価格 $requestUrl .= "&aucmin_bidorbuy_price=$set4"; //即決最小価格 //APIリクエスト実行 $res = unserialize(file_get_contents($requestUrl)); //APIレスポンスXMLよりHTMLに変換 $retHtml .= ""; $retHtml .= "<b>$set0</b><br><br><font color=red><br><a href=http://$set5 target=_blank>Amazonでの購入もおすすめです。</a><br><table><hr>\n"; $retHtml .= "<br>" . $res['ResultSet']['totalResultsAvailable'] . " 件見つかりました。<br>"; if ($res['ResultSet']['totalResultsAvailable'] > 0) { $iLoop = 0; foreach ($res['ResultSet']['Result']['Item'] as $itemValue) { if( $iLoop % 2 == 0 ){ $retHtml .= "<tr><td>\n"; } else { $retHtml .= "<tr><td>\n"; } //タイトル $title = $res['ResultSet']['totalResultsAvailable'] == 1 ? $res['ResultSet']['Result']['Item']['Title'] : $itemValue['Title']; $retHtml .= "<b> " . $title . "</b></br>\n"; //画像 $image = $res['ResultSet']['totalResultsAvailable'] == 1 ? $res['ResultSet']['Result']['Item']['Image'] : $itemValue['Image']; $buy = $res['ResultSet']['totalResultsAvailable'] == 1 ? $res['ResultSet']['Result']['Item']['BidOrBuy'] : $itemValue{'BidOrBuy'}; $endtime = $res['ResultSet']['totalResultsAvailable'] == 1 ? $res['ResultSet']['Result']['Item']['EndTime'] : $itemValue['EndTime']; $itemUrl = $res['ResultSet']['totalResultsAvailable'] == 1 ? $res['ResultSet']['Result']['Item']['AuctionItemUrl'] : $itemValue{'AuctionItemUrl'}; $retHtml .= "<table><tr><td width=150><img src=\"" . $image . "\" alt=\"" . $title . "\" /></td><td>即決価格:<font color=red> " . floor($buy) ."円<br></font>終了時刻 : " . date('Y年m月d日H時i分', strtotime($endtime)) . "<br><a href=\"http://atq.ck.valuecommerce.com/servlet/atq/referral?sid=2219441&pid=877510753&vcptn=auct%2Fp%2FbB3A7Kg1M6EFXm6WdTH1hFB6eL8-&vc_url=" . $itemUrl . "\"target=_blank\">ヤフオクで詳細を見る、購入する</a></tr></td></table>\n"; if( $iLoop % 2 == 1 ){ $retHtml .= "</tr></td>\n"; } else { $retHtml .= "</tr></td>\n"; } $iLoop++; if($res['ResultSet']['totalResultsAvailable'] == 1) { break; } } if( $iLoop % 2 == 1 ){ $retHtml .= "<td></td></tr>\n"; } } else { // 該当なしの場合の処理 $retHtml .= "<tr><td>該当する商品がありませんでした。時間を置いてアクセスしてみてください。</td></tr>\n"; } $retHtml .= "</table>\n"; echo $retHtml; } require_once "keyword.php";
1件しか見つからなかった場合のレスポンスデータの構造が違っていたのが原因です。
(※PHPserializeのみ確認。XMLとJSONPの場合は不明です。)
次のようにすると正常に表示されます。
function getAndDispFunc( $keyword ){ require_once "set.php"; //キャッシュの作成 $cache_time = 1*3600; $result = require_once 'Cache/Lite.php'; if ($result === false){ echo 'パスが違う?'; exit(); } $cache_id = $set1; $option = array('cacheDir' => 'tmp/', 'lifetime' => $cache_time,); $cache_lite = new Cache_Lite($option); $cache_data = $cache_lite->get($cache_id); if($cache_data){ $html_title[0] = $cache_data; }else{ //conecoリクエストURLの作成 $requestUra = "http://api.coneco.net/cws/v1/SearchProducts?apikey=*** Your CONECO API Key ***"; //$requestUra .= "&comId=$set2"; //商品IDの指定 $requestUra .= "&keyword=" . urlencode( $keyword ); //conecoAPIリクエスト実行 $res2 = file_get_contents($requestUra); $html=mb_convert_encoding(file_get_contents($requestUra), 'UTF-8', 'auto'); $pattern = "/(?<=<LowestPrice>).+?(?=<\/LowestPrice>)/mis"; preg_match($pattern,$html,$html_title); $cache_lite->save($html_title[0], $cache_id); } //cocone IDの設定が無い場合の処理 if( isset($html_title[0]) ){ } else { $html_title[0] = $set6; } //リクエストURL作成 $requestUrl = "http://auctions.yahooapis.jp/AuctionWebService/V2/php/search?"; $uranai_bangou = rand(1,11); if ($uranai_bangou == 1) { $requestUrl .= "appid=LuXDRiSxg677.Bfle4jIRp7rOtuoeGdm1q0gEhrTXnwMz35nRN8XnkRb8fas1PdqTKyoqZg-"; } elseif ($uranai_bangou == 2) { $requestUrl .= "appid=oxJbSFqxg65eKTlbRVJo9xLvRG3rpoGZvD8CIcBbGPhD9nTjRH.cN3fuYabO4btsVOkkees-"; } elseif ($uranai_bangou == 3) { $requestUrl .= "appid=_eDyS7Wxg66n.rnBFsvExdgO7Bi8CCVJVMfPDue77EZnQRFJ_X4Cf0mEh.o4I3_sc_8xSes-"; } elseif ($uranai_bangou == 4) { $requestUrl .= "appid=Gcyamraxg65Ps3GnOTAgqTloZ6O1bHlKOROOMeR5H4PxU4cwQSIAmk628bcSO.vGNQz3roA-"; } elseif ($uranai_bangou == 5) { $requestUrl .= "appid=Huh7gbmxg665fWm5z_FwlDQ4oN.1MKjxSgl7xkkksVCRsnfUehDCH8w2uUojydk5cbaGV9g-"; } elseif ($uranai_bangou == 6) { $requestUrl .= "appid=ccaZaSOxg66DjX5ssW6a2Fn1IxX_3VbHJnMTjbSz6xNi8Q.y5yzShh0Wpxjy_rattovDeKE-"; } elseif ($uranai_bangou == 7) { $requestUrl .= "appid=KbzQRh6xg67njNwThrQE4jbJ7VAsOGG9ZHeIQgBKU1jncMVJLCjXjltwuU7sXwoEr1.JKUo-"; } elseif ($uranai_bangou == 8) { $requestUrl .= "appid=PU0hqPexg66HGfMn.FpEDBpicax5AjkJ01qie.hJ45I7tcvVLk0G19XHvrL28VD6JXkYZmw-"; } elseif ($uranai_bangou == 9) { $requestUrl .= "appid=JsNp9rSxg64um9srcjBlt6rws4GCSKlK4t4j1dCZhEQij9onYshnbsZgIbZTccrSWMnitfE-"; } else { $requestUrl .= "appid=1g9Htxuxg64fs_yk4BrPCL9Hqec9s3gqN5W_waSFcEayuG2MeTr4p4eamvtj5dUEGdff7N4-"; } $requestUrl .= "&category=$set3"; //カテゴリ「空気清浄機」 $requestUrl .= "&query=" . urlencode( $keyword );; //検索キーワードをUTF-8でURLエンコード $requestUrl .= "&sort=bidorbuy&order=b"; //ソート $requestUrl .= "&thumbnail=1"; //画像ありの商品の絞り込み $requestUrl .= "&aucmaxprice="; //最大価格 $requestUrl .= "&aucminprice="; //最小価格 $requestUrl .= "&aucmax_bidorbuy_price=$html_title[0]"; //即決最大価格 $requestUrl .= "&aucmin_bidorbuy_price=$set4"; //即決最小価格 //APIリクエスト実行 $res = unserialize(file_get_contents($requestUrl)); //APIレスポンスXMLよりHTMLに変換 $retHtml .= ""; $retHtml .= "<b>$set0</b><br><br><font color=red><br><a href=http://$set5 target=_blank>Amazonでの購入もおすすめです。</a><br><table><hr>\n"; $retHtml .= "<br>" . $res['ResultSet']['totalResultsAvailable'] . " 件見つかりました。<br>"; if ($res['ResultSet']['totalResultsAvailable'] > 0) { $iLoop = 0; foreach ($res['ResultSet']['Result']['Item'] as $itemValue) { if( $iLoop % 2 == 0 ){ $retHtml .= "<tr><td>\n"; } else { $retHtml .= "<tr><td>\n"; } //タイトル $title = $res['ResultSet']['totalResultsAvailable'] == 1 ? $res['ResultSet']['Result']['Item']['Title'] : $itemValue['Title']; $retHtml .= "<b> " . $title . "</b></br>\n"; //画像 $image = $res['ResultSet']['totalResultsAvailable'] == 1 ? $res['ResultSet']['Result']['Item']['Image'] : $itemValue['Image']; $buy = $res['ResultSet']['totalResultsAvailable'] == 1 ? $res['ResultSet']['Result']['Item']['BidOrBuy'] : $itemValue{'BidOrBuy'}; $endtime = $res['ResultSet']['totalResultsAvailable'] == 1 ? $res['ResultSet']['Result']['Item']['EndTime'] : $itemValue['EndTime']; $itemUrl = $res['ResultSet']['totalResultsAvailable'] == 1 ? $res['ResultSet']['Result']['Item']['AuctionItemUrl'] : $itemValue{'AuctionItemUrl'}; $retHtml .= "<table><tr><td width=150><img src=\"" . $image . "\" alt=\"" . $title . "\" /></td><td>即決価格:<font color=red> " . floor($buy) ."円<br></font>終了時刻 : " . date('Y年m月d日H時i分', strtotime($endtime)) . "<br><a href=\"http://atq.ck.valuecommerce.com/servlet/atq/referral?sid=2219441&pid=877510753&vcptn=auct%2Fp%2FbB3A7Kg1M6EFXm6WdTH1hFB6eL8-&vc_url=" . $itemUrl . "\"target=_blank\">ヤフオクで詳細を見る、購入する</a></tr></td></table>\n"; if( $iLoop % 2 == 1 ){ $retHtml .= "</tr></td>\n"; } else { $retHtml .= "</tr></td>\n"; } $iLoop++; if($res['ResultSet']['totalResultsAvailable'] == 1) { break; } } if( $iLoop % 2 == 1 ){ $retHtml .= "<td></td></tr>\n"; } } else { // 該当なしの場合の処理 $retHtml .= "<tr><td>該当する商品がありませんでした。時間を置いてアクセスしてみてください。</td></tr>\n"; } $retHtml .= "</table>\n"; echo $retHtml; } require_once "keyword.php";
メッセージが届いていないので確認できていません・・・
コメントでのwindofjulyさんのアドバイスに従って少し修正してみました。
//APIレスポンスXMLよりHTMLに変換 $retHtml .= ""; $retHtml .= "<table><tr><td><b>$keyword</b><br><br><font color=red><br><a href=http://$set5 target=_blank>Amazonでの購入もおすすめです。</a><hr></td></tr>\n"; $retHtml .= "<tr><td>" . $res['ResultSet']['totalResultsAvailable'] . " 件見つかりました。</td></tr>\n"; if ($res['ResultSet']['totalResultsAvailable'] > 0) { $iLoop = 0; var_dump($res['ResultSet']['Result']['Item']); foreach ($res['ResultSet']['Result']['Item'] as $itemValue) { $retHtml .= "<tr><td>\n"; if($res['ResultSet']['totalResultsAvailable'] == 1) { $retHtml .= "<b> " . $res['ResultSet']['Result']['Item']['Title'] . "</b></br>\n"; $retHtml .= "<table><tr><td width=150><img src=\"" . $res['ResultSet']['Result']['Item']['Image'] . "\" alt=\"" . $res['ResultSet']['Result']['Item']['Title'] . "\" /></td><td>即決価格:<font color=red> " . floor($res['ResultSet']['Result']['Item']['BidOrBuy']) ."円<br></font>終了時刻 : " . date('Y年m月d日H時i分', strtotime($res['ResultSet']['Result']['Item']['EndTime'])) . "<br><a href=\"http://atq.ck.valuecommerce.com/servlet/atq/referral?sid=2219441&pid=877510753&vcptn=auct%2Fp%2FbB3A7Kg1M6EFXm6WdTH1hFB6eL8-&vc_url=" . $res['ResultSet']['Result']['Item']['AuctionItemUrl'] . "\"target=_blank\">ヤフオクで詳細を見る、購入する</a></td></tr></table>\n"; } else { //タイトル $retHtml .= "<b> " . $itemValue['Title'] . "</b></br>\n"; //画像 $retHtml .= "<table><tr><td width=150><img src=\"" . $itemValue['Image'] . "\" alt=\"" . $itemValue['Title'] . "\" /></td><td>即決価格:<font color=red> " . floor($itemValue{'BidOrBuy'}) ."円<br></font>終了時刻 : " . date('Y年m月d日H時i分', strtotime($itemValue['EndTime'])) . "<br><a href=\"http://atq.ck.valuecommerce.com/servlet/atq/referral?sid=2219441&pid=877510753&vcptn=auct%2Fp%2FbB3A7Kg1M6EFXm6WdTH1hFB6eL8-&vc_url=" . $itemValue{'AuctionItemUrl'} . "\"target=_blank\">ヤフオクで詳細を見る、購入する</a></td></tr></table>\n"; } $retHtml .= "</td></tr>\n"; $iLoop++; if($res['ResultSet']['totalResultsAvailable'] == 1) { break; } } } else { // 該当なしの場合の処理 $retHtml .= "<tr><td>該当する商品がありませんでした。時間を置いてアクセスしてみてください。</td></tr>\n"; } $retHtml .= "</table>\n"; echo $retHtml;
質問者からのメッセージが上記コメント返信より後の投稿だと思いますが、何かまずい事でもあったでしょうか?
回答ありがとうございます
とある事情でもう少し質問をひらいておきますが
2番のrouge_2008さんはポイントの配分を行いませんので
よろしくおねがいいたします。
メッセージが届いていないので確認できていません・・・
2012/08/20 09:12:14コメントでのwindofjulyさんのアドバイスに従って少し修正してみました。
質問者からのメッセージが上記コメント返信より後の投稿だと思いますが、何かまずい事でもあったでしょうか?
2012/08/20 09:27:19