PHP API请求限制不起作用

时间:2017-04-11 21:03:28

标签: php mysql

我在github上找到了这个非常有趣的项目:https://github.com/brannondorsey/apibuilder

开始使用后,我注意到请求限制无法正常工作。 MySQL数据库中的请求值计为“1000”(或$hits_per_day中设置的限制),但API输出仍然是数据库中的一些数据。

预期的错误消息只是附加到API响应。

但我希望有一个不允许任何输出的API,只有错误信息。您可以在下面找到相关文件。

public function get_json_from_assoc(&$get_array){

    $json_obj = new StdClass();
    $pretty_print = $this->pretty_print;

    if(!$this->find_config_errors()){

        if(isset($get_array['pretty_print'])){
            if(strtolower($get_array['pretty_print']) == "true") $pretty_print = true;
            if(strtolower($get_array['pretty_print']) == "false") $pretty_print = false;  
        }

        //if API is public or if API is private and a correct private key was provided
        if(!$this->private ||
            $this->private &&
            isset($get_array['private_key']) &&
            $this->private_key == $get_array['private_key']){

            $query = $this->form_query($get_array);
            if($this->check_API_key()
                || !$this->API_key_required){
                //if search was included as a parameter in the http request but it isn't allowed in the api's config...
                if(isset($get_array['search']) &&
                   !$this->search_allowed){
                    $json_obj->error = "search parameter not enabled for this API";
                }
                else if(isset($get_array['exclude']) &&
                    !$this->exclude_allowed){
                    $json_obj->error = "exclude parameter not enabled for this API";
                }else{
                    if($results_array = Database::get_all_results($query)){

                        if(is_array($results_array)){
                            // deletes key => value pairs if the value is empty. Only works if array is nested: 
                            // http://stackoverflow.com/questions/5750407/php-array-removing-empty-values   
                            $results_array = array_filter(array_map('array_filter', $results_array));

                            foreach($results_array as $result_array){
                                foreach($result_array as $key => $value){
                                    if($key == "COUNT(*)"){
                                        $count = $value;
                                        break;
                                    }
                                }
                            }
                            if(!isset($count)) $json_obj->data = $results_array;
                            else $json_obj->count = $count; 
                            //COME BACK need to make count only parameter work
                        }
                    }else $json_obj->error = "no results found";
                }

                //only attempt to increment the api hit count if this method is called from a PUBLIC API request
                if($this->API_key_required){
                    $query = "SELECT " . $this->API_hit_date_column_name . " FROM " . Database::$users_table . " WHERE " . $this->API_key_column_name . " = '" . $this->API_key . "' LIMIT 1";
                    $result = Database::get_all_results($query);
                    //increments the hit count and/or hit date OR sets the error message if the key has reached its hit limit for the day
                    if($this->update_API_hits($this->API_key, $result[0][$this->API_hit_date_column_name]) === false){
                     $json_obj->error = "API hit limit reached";
                    }
                 }
            }else $json_obj->error = "API key is invalid or was not provided";
            //if there was a search and it returned no results
            if($this->search != "" &&
                !$this->search_has_been_repeated &&
                isset($json_obj->error) &&
                strstr($json_obj->error, $this->no_results_message) == true){
                    $this->search_in_boolean_mode = true; //set search in boolean mode to true
                    $this->search_has_been_repeated = true; //note that the search will now have been repeated
                    //$this->JSON_string = $this->get_json_from_assoc($get_array, $object_parent_name); //recurse the function (thus re-searching)
                    return $this->get_json_from_assoc($get_array); //recurse the function (thus re-searching)
            }
        }else{ //API is private but private_key is invalid or was not provided
            $json_obj->error = "this API is private and the private key was invalid or not provided";
        }
    }else{ //config errors were present
        $pretty_print = true; //always output errors in pretty print for readability
        $json_obj->config_error = $this->config_errors;
    }
    return ($pretty_print && version_compare(PHP_VERSION, '5.4.0') >= 0) ? json_encode($json_obj, JSON_PRETTY_PRINT) : json_encode($json_obj);
}

0 个答案:

没有答案