2

6 か月前にサイトのストア ファインダーを作成し、データはデータベースに保存されています。ユーザーが郵便番号を入力し、検索をクリックすると、最寄りの店舗が一覧表示されます。

今朝ライブ サイトをテストしたところ、php エラー メッセージが表示されました。

A PHP Error was encountered

Severity: Warning

Message: file_get_contents(http://maps.google.co.uk/maps/geo?q=sr3+4as&output=json&key=----MYKEY---): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden

Filename: controllers/store.php

ステージング サイトとローカルホストでこれを試したところ、同じ応答が得られました。6か月間コードに触れていないので、キーの有効期限が切れているか破損していると思いました。新しい API キーを作成し、これをヘッダーとコントローラーに追加しました。ここで、エラーは運が悪いと表示されます。

どこが間違っているのでしょうか?! 何かがリクエストを停止していて、問題がどこにあるのか不明ですか?

コードを含む私のコントローラーは次のとおりです。

class Store extends CI_Controller {

    function __construct() {
        parent::__construct();
        $this->load->model('store_model');
        $this->load->library('form_validation');
    }

    public function index(){
        $data['page_title'] = "Store Finder";
        $data['section_no'] = 5;
        $data['content'] = "store";

         function formatBritishPostcode($postcode) {    
            //--------------------------------------------------
            // Clean up the user input

            $postcode = strtoupper($postcode);
            $postcode = preg_replace('/[^A-Z0-9]/', '', $postcode);
            $postcode = preg_replace('/([A-Z0-9]{3})$/', ' \1', $postcode);
            $postcode = trim($postcode);

            //--------------------------------------------------
            // Check that the submitted value is a valid
            // British postcode: AN NAA | ANN NAA | AAN NAA |
            // AANN NAA | ANA NAA | AANA NAA

            if (preg_match('/^[a-z](\d[a-z\d]?|[a-z]\d[a-z\d]?) \d[a-z]{2}$/i', $postcode)) {
                return $postcode;
            } else {
                return NULL;
            }       
        } 

        $this->form_validation->set_rules('postcode','Postcode','required|trim|htmlspecialchars|xssclean'); 
        $this->form_validation->set_error_delimiters('<div id="errors">&bull;&nbsp;','</div>');

        if($this->form_validation->run() == FALSE) {
            $data['error'] = 1;
            if($this->input->post('submit')) {
                $data['error_msg'] = "Please enter a Post Code.";   
            }
        } else {
            $data['error'] = 0;
            if($this->input->post('postcode')) {
                $postCodeClean = formatBritishPostcode($this->input->post('postcode'));
                if ($postCodeClean === NULL) {
                    $data['error_msg'] = "Please supply a valid Post Code.";
                } else {

                $url = "http://maps.google.co.uk/maps/geo?q=".urlencode($this->input->post('postcode'))."&output=json&key=---MYKEY---";

                    $json = file_get_contents($url);
                    $store_data = json_decode(str_replace("&quot;","\"",htmlentities($json)));

                    $lng = $store_data->Placemark[0]->Point->coordinates[0];            
                    $lat = $store_data->Placemark[0]->Point->coordinates[1];

                    $data['stores'] = $this->store_model->get_stores($lat, $lng);
                }
            }
        }

        $this->load->view('template', $data);
    }
} 
4

3 に答える 3

1

これは API V2 および 3 の問題でした。上記のコードは次のように変更され、魅力的に機能しました。

$url ="https://maps.googleapis.com/maps/api/geocode/json?address=".urlencode($this->input->post('postcode'))."&sensor=false";


$json = file_get_contents($url);
$store_data = json_decode(str_replace("&quot;","\"",htmlentities($json)));

$lat = $store_data->{'results'}[0]->{'geometry'}->{'location'}->{'lat'};
$lng = $store_data->{'results'}[0]->{'geometry'}->{'location'}->{'lng'};

$data['stores'] = $this->store_model->get_stores($lat, $lng);
于 2013-10-25T08:41:12.323 に答える
-1

これはコードの問題ではありません。

スクレイピングを防ぐために PHP スクリプトをブロックするか、リクエストが多すぎる場合は IP をブロックする可能性があります。

IPのブロックを解除するには、サーバーチームに相談してください.

于 2017-09-24T20:27:59.820 に答える