menggunakan jquery $ .ajax untuk memanggil fungsi PHP

118

Ini mungkin jawaban yang sederhana, tapi saya menggunakan $ .ajax jQuery untuk memanggil skrip PHP. Apa yang ingin saya lakukan pada dasarnya adalah meletakkan skrip PHP itu di dalam suatu fungsi dan memanggil fungsi PHP dari javascript.

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

untuk ini

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

Bagaimana saya memanggil fungsi itu di javascript? Saat ini saya hanya menggunakan $ .ajax dengan file PHP terdaftar.

Ikan lele
sumber
6
Meneruskan kode PHP yang dihasilkan javascript PHP untuk dievaluasi, atau melakukannya sebaliknya, adalah ide yang sangat buruk.
Tyler Carter
Bisakah Anda menjelaskan mengapa itu buruk?
Catfish
3
Karena SIAPA PUN dapat menempatkan kode APA PUN sebagai pengganti kode Anda, dan dengan demikian mereka dapat melakukan hal buruk ke server Anda.
Tyler Carter
9
@ Chacha102: Anda atau saya tidak mengerti pertanyaannya. Menurut pemahaman saya, dia ingin melakukan panggilan prosedur jarak jauh.
Felix Kling
Panggilan prosedur jarak jauh dapat diterima jika Anda memiliki daftar putih yang membatasi akses ke semua kecuali fungsi atau "prosedur" yang diizinkan. Ini tidak akan sulit untuk diterapkan.
Xaxis

Jawaban:

228

Gunakan $.ajaxuntuk memanggil konteks server (atau URL, atau apa pun) untuk meminta 'tindakan' tertentu. Yang Anda inginkan adalah seperti:

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

Di sisi server, actionparameter POST harus dibaca dan nilai yang sesuai harus mengarah ke metode yang akan dipanggil, misalnya:

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

Saya percaya itu adalah inkarnasi sederhana dari pola Command .

karim79.dll
sumber
9
Kena kau. Jadi Anda tidak dapat langsung memilih dengan js fungsi mana yang akan dipanggil dalam PHP, Anda hanya dapat menggunakan PHP untuk mengambil nilai posting dan memanggil fungsi dengan cara itu. Terima kasih
Catfish
Tapi ini sederhana jika Anda menggunakan kerangka kerja. dengan Kohana misalnya Anda cukup memanggil controller / action ajax (function () {url: 'Controller / action.php',});
DeathCoder
1
@MrMesees Akan sangat bagus jika Anda membagikan praktik terbaik modern tersebut dengan kami.
Francisco Romero
menggunakan HTTP fetch API bisa untuk frontend JS, serta menggunakan promise. Untuk sanitasi PHP dan masukan pemfilteran, mungkin menggunakan middleware sehingga dapat diterapkan ke beberapa titik akhir. Saya rasa penting jika Anda ingin tanggapan saya tidak menunggu ~ 2 tahun mungkin pilihan yang bagus.
MrMesees
12

Saya mengembangkan plugin jQuery yang memungkinkan Anda memanggil fungsi inti PHP apa pun atau bahkan fungsi PHP yang ditentukan pengguna sebagai metode plugin: jquery.php

Setelah memasukkan jquery dan jquery.php di kepala dokumen kita dan menempatkan request_handler.php di server kita, kita akan mulai menggunakan plugin dengan cara yang dijelaskan di bawah ini.

Untuk kemudahan penggunaan, rujuk fungsi dengan cara yang sederhana:

    var P = $.fn.php;

Kemudian inisialisasi plugin:

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'
    }
});             

Dan sekarang beberapa skenario penggunaan:

// 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/"]

Mendemonstrasikan rangkaian fungsi 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 );

Mendemonstrasikan pengiriman blok JSON pseudo-code 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 );

Konfigurasi backend menyediakan daftar putih sehingga Anda dapat membatasi fungsi mana yang dapat dipanggil. Ada beberapa pola lain untuk bekerja dengan PHP yang dijelaskan oleh plugin juga.

Xaxis
sumber
5

Saya akan tetap menggunakan pendekatan normal untuk memanggil file secara langsung, tetapi jika Anda benar-benar ingin memanggil suatu fungsi, lihat JSON-RPC (JSON Remote Procedure Call).

Anda pada dasarnya mengirim string JSON dalam format tertentu ke server, mis

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

yang mencakup fungsi untuk memanggil dan parameter dari fungsi itu.

Tentu saja server harus tahu bagaimana menangani permintaan seperti itu.
Berikut adalah plugin jQuery untuk JSON-RPC dan misalnya Zend JSON Server sebagai implementasi server di PHP.


Ini mungkin berlebihan untuk proyek kecil atau kurang fungsi. Cara termudah adalah jawaban karim . Di sisi lain, JSON-RPC adalah standar.

Felix Kling
sumber
4

Anda tidak dapat memanggil fungsi PHP dengan Javascript, dengan cara yang sama Anda tidak dapat memanggil fungsi PHP arbitrer saat Anda memuat halaman (pikirkan implikasi keamanannya).

Jika Anda perlu membungkus kode Anda dalam suatu fungsi karena alasan apa pun, mengapa Anda tidak meletakkan panggilan fungsi di bawah definisi fungsi, misalnya:

function test() {
    // function code
}

test();

Atau, gunakan PHP termasuk:

include 'functions.php'; // functions.php has the test function
test();
Kambing Tidak Puas
sumber
3

Anda harus mengekspos dan endpoint (URL) di sistem Anda yang akan menerima permintaan POST dari panggilan ajax di jQuery.

Kemudian, saat memproses url itu dari PHP, Anda akan memanggil fungsi Anda dan mengembalikan hasilnya dalam format yang sesuai (kemungkinan besar JSON, atau XML jika Anda mau).

casperOne
sumber
3

Anda dapat menggunakan perpustakaan saya yang melakukannya secara otomatis, saya telah memperbaikinya selama 2 tahun terakhir 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();

Javascript akan sesederhana

phery.remote('phpfunction');

Anda dapat meneruskan semua bagian javascript dinamis ke server, dengan pembuat kueri seperti antarmuka yang dapat dirantai, dan Anda dapat meneruskan semua jenis data kembali ke PHP. Misalnya, beberapa fungsi yang akan memakan terlalu banyak ruang di sisi javascript, dapat dipanggil di server menggunakan ini (dalam contoh ini, mcrypt, yang di javascript hampir tidak mungkin dilakukan):

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');

dan di server

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();

Sekarang variableakan memiliki data terenkripsi.

pocesar
sumber