usando jquery $ .ajax para chamar uma função PHP

118

Esta pode ser uma resposta simples, mas estou usando $ .ajax do jQuery para chamar um script PHP. O que eu quero fazer é basicamente colocar esse script PHP dentro de uma função e chamar a função PHP do javascript.

<?php 
if(isset($_POST['something'] {
    //do something
}
?>

para isso

<?php
function test() {
    if(isset($_POST['something'] {
         //do something. 
    }
}
?>

Como eu chamaria essa função em javascript? No momento, estou usando apenas $ .ajax com o arquivo PHP listado.

Peixe-gato
fonte
6
Passar código PHP gerado por javascript para ser avaliado, ou fazer o contrário, é uma ideia muito ruim.
Tyler Carter de
Você pode explicar por que isso é ruim?
Catfish de
3
Porque QUALQUER UM pode colocar QUALQUER código no lugar de seu código e, portanto, eles podem fazer coisas ruins para o seu servidor.
Tyler Carter de
9
@ Chacha102: Ou você ou eu não entendemos a pergunta. No meu entendimento, ele deseja fazer uma chamada de procedimento remoto.
Felix Kling de
Uma chamada de procedimento remoto pode ser aceitável se você tiver uma lista de permissões que restrinja o acesso a todas as funções ou "procedimentos" permitidos. Isso não seria difícil de implementar.
Xaxis

Respostas:

228

Use $.ajaxpara chamar um contexto de servidor (ou URL, ou qualquer outro) para invocar uma 'ação' particular. O que você quer é algo como:

$.ajax({ url: '/my/site',
         data: {action: 'test'},
         type: 'post',
         success: function(output) {
                      alert(output);
                  }
});

No lado do servidor, o actionparâmetro POST deve ser lido e o valor correspondente deve apontar para o método a ser invocado, por exemplo:

if(isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
    switch($action) {
        case 'test' : test();break;
        case 'blah' : blah();break;
        // ...etc...
    }
}

Acredito que seja uma encarnação simples do padrão Command .

karim79
fonte
9
Peguei vocês. Portanto, você não pode escolher diretamente com js qual função chamar no PHP, você só pode usar o PHP para pegar o valor post e chamar uma função dessa maneira. Obrigado
Catfish
Mas isso é simples se você estiver usando uma estrutura. com Kohana, por exemplo, você pode simplesmente chamar o controlador / ação ajax (function () {url: 'Controller / action.php',});
DeathCoder
1
@MrMesees Seria ótimo se você compartilhasse essas práticas recomendadas modernas conosco.
Francisco Romero
usar a API de busca de HTTP pode ser para o front-end JS, bem como usar promessas. Para purificar e filtrar a entrada do PHP, talvez usando um middleware para que possa ser aplicado a vários terminais. Suponho que seja importante se você quiser que meu feedback não espere, ~ 2 anos pode ser uma ótima opção.
MrMesees de
12

Desenvolvi um plugin jQuery que permite chamar qualquer função PHP central ou até funções PHP definidas pelo usuário como métodos do plugin: jquery.php

Depois de incluir jquery e jquery.php no cabeçalho de nosso documento e colocar request_handler.php em nosso servidor, começaríamos a usar o plugin da maneira descrita abaixo.

Para facilitar o uso, consulte a função de maneira simples:

    var P = $.fn.php;

Em seguida, inicialize o plug-in:

P('init', 
{
    // The path to our function request handler is absolutely required
    'path': 'http://www.YourDomain.com/jqueryphp/request_handler.php',

    // Synchronous requests are required for method chaining functionality
    'async': false,

    // List any user defined functions in the manner prescribed here
            // There must be user defined functions with these same names in your PHP
    'userFunctions': {

        languageFunctions: 'someFunc1 someFunc2'
    }
});             

E agora alguns cenários de uso:

// Suspend callback mode so we don't work with the DOM
P.callback(false);

// Both .end() and .data return data to variables
var strLenA = P.strlen('some string').end();
var strLenB = P.strlen('another string').end();
var totalStrLen = strLenA + strLenB;
console.log( totalStrLen ); // 25

// .data Returns data in an array
var data1 = P.crypt("Some Crypt String").data();
console.log( data1 ); // ["$1$Tk1b01rk$shTKSqDslatUSRV3WdlnI/"]

Demonstrando o encadeamento de funções PHP:

var data1 = P.strtoupper("u,p,p,e,r,c,a,s,e").strstr([], "C,A,S,E").explode(",", [], 2).data();
var data2 = P.strtoupper("u,p,p,e,r,c,a,s,e").strstr([], "C,A,S,E").explode(",", [], 2).end();
console.log( data1, data2 );

Demonstrando o envio de um bloco JSON de pseudocódigo PHP:

var data1 = 
        P.block({
    $str: "Let's use PHP's file_get_contents()!",
    $opts: 
    [
        {
            http: {
                method: "GET",
                header: "Accept-language: en\r\n" +
                        "Cookie: foo=bar\r\n"
            }
        }
    ],
    $context: 
    {
        stream_context_create: ['$opts']
    },
    $contents: 
    {
        file_get_contents: ['http://www.github.com/', false, '$context']
    },
    $html: 
    {
        htmlentities: ['$contents']
    }
}).data();
    console.log( data1 );

A configuração de back-end fornece uma lista de permissões para que você possa restringir quais funções podem ser chamadas. Existem alguns outros padrões para trabalhar com PHP descritos pelo plugin também.

Xaxis
fonte
5

Eu continuaria com a abordagem normal para chamar o arquivo diretamente, mas se você realmente quiser chamar uma função, dê uma olhada em JSON-RPC (JSON Remote Procedure Call).

Você basicamente envia uma string JSON em um formato específico para o servidor, por exemplo

{ "method": "echo", "params": ["Hello JSON-RPC"], "id": 1}

que inclui a função a ser chamada e os parâmetros dessa função.

É claro que o servidor precisa saber como lidar com essas solicitações.
Aqui está o plugin jQuery para JSON-RPC e, por exemplo, o Zend JSON Server como implementação de servidor em PHP.


Isso pode ser um exagero para um projeto pequeno ou menos funções. A maneira mais fácil seria a resposta de karim . Por outro lado, JSON-RPC é um padrão.

Felix Kling
fonte
4

Você não pode chamar uma função PHP com Javascript, da mesma forma que não pode chamar funções PHP arbitrárias ao carregar uma página (pense nas implicações de segurança).

Se você precisar envolver seu código em uma função por qualquer motivo, por que você não coloca uma chamada de função sob a definição de função, por exemplo:

function test() {
    // function code
}

test();

Ou use um PHP include:

include 'functions.php'; // functions.php has the test function
test();
DisgruntledGoat
fonte
3

Você terá que expor um endpoint (URL) em seu sistema que aceitará a solicitação POST da chamada ajax em jQuery.

Então, ao processar essa url do PHP, você chamaria sua função e retornaria o resultado no formato apropriado (JSON provavelmente ou XML se preferir).

casperOne
fonte
3

Você pode usar minha biblioteca que faz isso automaticamente, tenho melhorado nos últimos 2 anos http://phery-php-ajax.net

Phery::instance()->set(array(
   'phpfunction' => function($data){
      /* Do your thing */
      return PheryResponse::factory(); // do your dom manipulation, return JSON, etc
   }
))->process();

O javascript seria tão simples quanto

phery.remote('phpfunction');

Você pode passar toda a parte do javascript dinâmico para o servidor, com um construtor de consulta como uma interface encadeada, e pode passar qualquer tipo de dados de volta para o PHP. Por exemplo, algumas funções que ocupariam muito espaço no lado do javascript, poderiam ser chamadas no servidor usando isto (neste exemplo, mcrypt, que no javascript seria quase impossível de realizar):

function mcrypt(variable, content, key){
  phery.remote('mcrypt_encrypt', {'var': variable, 'content': content, 'key':key || false});
}

//would use it like (you may keep the key on the server, safer, unless it's encrypted for the user)
window.variable = '';
mcrypt('variable', 'This must be encoded and put inside variable', 'my key');

e no servidor

Phery::instance()->set(array(
  'mcrypt_encrypt' => function($data){
     $r = new PheryResponse;

     $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
     $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
     $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $data['key'] ? : 'my key', $data['content'], MCRYPT_MODE_ECB, $iv);
     return $r->set_var($data['variable'], $encrypted);
     // or call a callback with the data, $r->call($data['callback'], $encrypted);
  }
))->process();

Agora, o variableterá os dados criptografados.

pocesar
fonte