上記のサンプルコードを改変した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";
set.phpの次の記述が間違っています。
定数を代入してください。
$set1 = category7item55;//キャッシュIDフォルダ名名連続記述
回答ありがとうございます
とある事情でもう少し質問をひらいておきますが
2番のrouge_2008さんはポイントの配分を行いませんので
よろしくおねがいいたします。
アクセスしてもNot Foundになります。
短縮サービス側の問題か、質問への記載ミスかは判りませんが、
コメント欄などにオリジナルの長いURLのまま記載してみてください。
http://www1.axfc.net/uploader/Sc/so/371309
これで大丈夫だと思います。
お手数ですが見て頂けると助かります。
1234hatena を入力しても
「キーワードが正しくありません」と出てダウンロードできませんでした。
出先の携帯からで確認が不足していました。
webからのダウンロードキーワードが1234
zipのパスワードが上記の物です。
無事解決できたら追加でポイントを送信しますので、どうかお力を貸して下さい。
情報不足で、すいませんでした。
まず最初に、私のレスポンスが悪く、
rouge_2008さん、happyluppyさんにはご迷惑をおかけしたことをお詫びいたします。
そもそもの原因は、この質問をキャンセルできるように、
過去質問のコメント欄で対応したのが間違いの始まりだったと思います。
私がこっそり過去のソースを直していることは、
当事者同士しかわかりづらいことだと思います。
http://q.hatena.ne.jp/1344750511#a1161710
rouge_2008 さんは1つ1つの質問に真摯に取り組んでくださる方で、人の回答をコピーしたり、
ちょこっと見た目を変えたりといった姑息なマネをする方ではありませんので、
回答1の酷さを見て、しかも、誰も回答しないので、考えてくださったのだと思います。
コードを見ると rouge_2008 さんは私とは違ったアプローチを取っておられ、
私が状況に合わせて手直しした部分も手直し以前の状態なので、
私のマネをしたのではなく、独自にテストして手直ししてくださったことは判ります。
ちなみに、
私の書いたコードは結果が1件の場合と複数件の場合で処理を分けており、
ループ内で何度も分岐処理を行わないようにしています。
rouge_2008 さんのコードはループ内の式の中で分岐処理を逐一行っており、
処理コスト面ではちょっと不利かもしれません。
(三項演算を多様するとコードが見づらくなるので、
IFで纏めたほうがいいとは思います)
happyluppyさんにはご面倒をおかけしますが、
両方のコードをテストしていただいて使いやすそうなほうを使ってもらえればと思います。
重ね重ね、すみませんでした。
以前の質問の方に返信をつけていたんですね。
こちらにコメントしてくださっていれば気がついたのですが・・
おっしゃる通り、私の回答はダウンロードしたコードを変更したものです。
また、アドバイスもありがとうございます。
朝まで気がつかなかったので助かりました。m(__)m
>何かまずい事
「質問者から」の欄で、
「2番のrouge_2008さんはポイントの配分を行いません」と書いてしまったことへの謝罪かと思います。
私も「質問者から」の欄だけを見て慌ててコメント欄のほうに書き込ませていただいたのですが、慌てる必要はなかったみたいです^^
人力検索にやってくる時間が3人バラバラなので、ちょっとチグハグぎみですが、これで繋がったかな?
日時を見るとコメント後、補足でrouge_2008さんにポイントを与えないと
書いてあり、意味が分かりませんが、一応私の意識では、補足後コメントを書いたつもりではありました・・・。
(何故だろう・・)
今回の質問ですが、windofjulyさんに以前からこのヤフオクの表示の件について質問に答えて下さっていたので
今回、回答リクエストをつけていました。
windofjulyさんは以前何度も質問に答えて下さったお礼としてポイントを送信していたのですが、
今回検証不足だからといってポイントも返送されてこられましたし、今回のポイントも受けとりたくない思い等から
前回の記事に書いたのだと思います。
私としては当然ぽいんとげったーの様な方ではなく、期待以上の質問をしてくれる方にポイントを送信したいと思い。
windofjulyさんにこちらでポイントを配分したくてなんでもいいので回答をして欲しかったので、
こちらはそのままにしておきました。
その間にRouge2008さんからも素晴らしい回答を頂き、私が誤爆をしてしまった為に話がなんだか
ややこしくなってしまいました。
windoflulyさんのフォローがあるまで不愉快な思いをされたかもしれませんし、rouge_2008さん本当にすいませんでした。
結果としては望むような表示が問題なく行えるようになり、お二人方とも更なる改善案やソースの訂正等を
していただき本当に助かりました。
(◯件の検索結果の表示や、カテゴリの事等、そこまで手が回らないけど気になっていたところでした)
私はphpの基礎知識がまるで無いので何も分からず、こんな事で数時間平気で格闘してましたので・・・。
今回はお二人に同じポイントを送信してこの質問は閉じさせて頂きます。
本当にありがとうございました。
質問者からのメッセージの投稿時間がなぜか5時間ずれているのかもしれませんね。(はてなの不具合?)
「05:14:13」ではなく「0:14:13」に補足を投稿して、「00:15:11」にコメントを投稿したのでしたら状況と合っています。
修正したコードで表示確認の記述が残ったままになっていました。
(※「var_dump($res['ResultSet']['Result']['Item']);」は削除してください。すみません。)
if ($res['ResultSet']['totalResultsAvailable'] > 0) {
$iLoop = 0; var_dump($res['ResultSet']['Result']['Item']);