Можно ли использовать данные AJAX POST для значений конструктора в классе PHP? - PullRequest
1 голос
/ 05 мая 2011

Я хочу вызвать PHP-класс через AJAX для обработки некоторых данных формы. Поскольку, когда вы создаете экземпляр класса в PHP, вы можете передать значения, которые будут использоваться в конструкторе классов, я подумал, возможно ли то же самое с помощью AJAX?

В настоящее время я использую метод POST с отдельной функцией в классе для определения значений записей и их последующей обработки, но я мог бы сэкономить время, предварительно загрузив значения в конструктор, если это возможно!

Обновление: пример кода

class myAjaxClass {
    private $data;
    public function __construct($could, $this, $be, $post, $data) {
        $this->data = $data;
        ...etc...

Ответы [ 3 ]

1 голос
/ 05 мая 2011

Значения записей - это суперглобальные значения, поэтому вам не нужно никому их передавать. Если ваш ajax-запрос вызывает правильный объект obj, все, что вам нужно, это использовать $ _POST в методах этого класса ...

1 голос
/ 05 мая 2011

По AJAX Вы можете вызвать только какой-нибудь скрипт, например, my_script.php, который будет выглядеть как

<?php
$myAjaxClass = new MyAjaxClass($_POST['could'], $_POST['this'], $_POST['be'], $_POST['post'], ...);
var_dump($myAjaxClass);
?>

, а в вызове JS AJAX вы должны предоставить данные для публикации, например, с помощью jQuery:

$(document).ready(function(){
    $.post(
        "my_script.php",
        {could: "COULD", this: "THIS", be: "BE", ... },
        function(data) {
            alert(data); // data must be a string... when object, use data.property, when array, use data['index']
        }
    );
});
0 голосов
/ 06 мая 2011

В конце концов я решил написать базовый класс обработчика Ajax для подготовки и загрузки данных POST и т. Д. Затем я могу расширить его с помощью других классов для определенных целей, таких как AjaxLogin и AjaxRegister.

Вот оно:

class Ajax {

    protected $data = array();
    protected $command; // Used to request a specific method.
    protected $count; // Counter for multi-page forms (Really needed?)

    /**
     * Response is the output array to be serialised using `json_encode()`
     * @var Boolean - Used to imply the success or failure of the AJAX function (i.e. form validation)
     * @var Array (optional) - An array of output / error messages [ Defined as: 'messages' => ... ]
     */
    protected $response = array('valid' => true); // Output to be serialised using 'json_encode()'

    public function __construct() {
        /* Redirect empty or insufficient POST data with 'Forbidden' response header (overwrite false) */
        if( !$_POST OR count($_POST) < 1 ) {
            header('location:'.$_SERVER['HTTP_REFERER'], false, '403');
            exit();     
        }

        /* Session validation (if 'hash' sent) */
        if( isset($_POST['hash']) AND $_POST['hash'] != md5(session_id()) ) {
            header('location:'.$_SERVER['HTTP_REFERER'], false, '403');
            exit();
        }

        $this->processRequest($_POST['data']);
    }

    protected function addMessage($message) {
        $this->response['valid'] = false;
        $this->response['messages'][] = $message;
    }

    /**
     * Unserialise AJAX data. Accepts data from either:
     * - jQuery.serialize()         [String]
     * - jQuery.serializeArray()    [Array of Objects]
     */
    private function unserializeData($data) {
        // -- from jQuery.serialize()
        if( is_string($data) ) {
            $array = explode('&', $data);
            foreach($array as $key => $value) {
                $string = preg_split('/=/', $value);
                $this->data[$string[0]] = $string[1];
            }
        }
        //  -- from jQuery.serializeArray()
        elseif( is_array($data) ) {
            $array = (array) $data;
            foreach($array as $element) {
                $this->data[$element['name']] = $element['value'];
            //  $this->addMessage($element['name'].' => '.$element['value']);
            }
        }
        else $this->addMessage('Unable to process your request, Please contact our Technical Support!');
    }

    // TODO: Use strip_tags or something for security??
    private function processRequest($data) {
        /* Process serialised data in to an Array */
        $this->unserializeData($data);

        /* Process additional POST data (if present) */
        if( isset($_POST['command']) ) $this->command = $_POST['command'];
        if( isset($_POST['count']) ) $this->count = $_POST['count'];
        // Add additional POST data processing here!!
    }
}

Не стесняйтесь использовать, модифицировать, выносить суждения и т. Д. По своему усмотрению, я надеюсь, что это кому-то поможет! ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...