ใช้ jquery $ .ajax เพื่อเรียกใช้ฟังก์ชัน PHP


118

นี่อาจเป็นคำตอบง่ายๆ แต่ฉันใช้ $ .ajax ของ jQuery เพื่อเรียกสคริปต์ PHP สิ่งที่ฉันต้องการทำโดยทั่วไปคือวางสคริปต์ PHP นั้นไว้ในฟังก์ชันและเรียกใช้ฟังก์ชัน PHP จากจาวาสคริปต์

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

สำหรับสิ่งนี้

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

ฉันจะเรียกใช้ฟังก์ชันนั้นในจาวาสคริปต์ได้อย่างไร ตอนนี้ฉันใช้แค่ $ .ajax กับไฟล์ PHP ในรายการ


6
การส่งโค้ด PHP ที่สร้างด้วยจาวาสคริปต์ PHP ไปประเมินหรือทำในทางอื่นเป็นความคิดที่แย่มาก
Tyler Carter

คุณอธิบายได้ไหมว่าทำไมถึงไม่ดี?
ปลาดุก

3
เนื่องจากทุกคนสามารถใส่รหัสใด ๆ แทนรหัสของคุณได้ดังนั้นพวกเขาจึงสามารถทำสิ่งที่ไม่ดีกับเซิร์ฟเวอร์ของคุณได้
Tyler Carter

9
@ Chacha102: คุณหรือฉันไม่เข้าใจคำถาม ในความเข้าใจของฉันเขาต้องการโทรโพรซีเดอร์ระยะไกล
Felix Kling

การเรียกกระบวนงานระยะไกลสามารถยอมรับได้หากคุณมีรายการที่อนุญาตพิเศษซึ่ง จำกัด การเข้าถึงฟังก์ชันหรือ "ขั้นตอน" ทั้งหมดที่คุณอนุญาต สิ่งนี้คงไม่ใช่เรื่องยากที่จะนำไปปฏิบัติ
Xaxis

คำตอบ:


228

ใช้$.ajaxเพื่อเรียกบริบทเซิร์ฟเวอร์ (หรือ URL หรืออะไรก็ได้) เพื่อเรียกใช้ 'การดำเนินการ' เฉพาะ สิ่งที่คุณต้องการมีดังนี้:

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

ทางฝั่งเซิร์ฟเวอร์actionควรอ่านพารามิเตอร์ POST และค่าที่เกี่ยวข้องควรชี้ไปที่วิธีการเรียกใช้เช่น:

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

ผมเชื่อว่าเป็นชาติที่เรียบง่ายของรูปแบบคำสั่ง


9
Gotcha ดังนั้นคุณไม่สามารถเลือก js ได้โดยตรงว่าจะเรียกใช้ฟังก์ชันใดใน PHP คุณสามารถใช้ PHP เพื่อดึงค่าโพสต์และเรียกใช้ฟังก์ชันด้วยวิธีนั้น ขอบคุณ
ปลาดุก

แต่นี่เป็นเรื่องง่ายหากคุณใช้กรอบ ตัวอย่างเช่นกับ Kohana คุณสามารถเรียกตัวควบคุม / action ajax (function () {url: 'Controller / action.php',});
DeathCoder

1
@MrMesees จะดีมากถ้าคุณแบ่งปันแนวทางปฏิบัติที่ดีที่สุดสมัยใหม่กับเรา
Francisco Romero

การใช้ HTTP fetch API อาจใช้สำหรับส่วนหน้า JS เช่นเดียวกับการใช้สัญญา สำหรับการฆ่าเชื้อ PHP และการกรองอินพุตอาจใช้มิดเดิลแวร์เพื่อให้สามารถนำไปใช้กับปลายทางหลายจุดได้ ฉันคิดว่าที่สำคัญถ้าคุณต้องการความคิดเห็นของฉันไม่ต้องรอประมาณ 2 ปีอาจเป็นตัวเลือกที่ดี
MrMesees

12

ฉันพัฒนาปลั๊กอิน jQuery ที่ให้คุณเรียกใช้ฟังก์ชัน PHP หลักหรือแม้แต่ฟังก์ชัน PHP ที่ผู้ใช้กำหนดเป็นวิธีการของปลั๊กอิน: jquery.php

หลังจากรวม jquery และ jquery.php ไว้ในส่วนหัวของเอกสารของเราและวาง request_handler.php บนเซิร์ฟเวอร์ของเราเราจะเริ่มใช้ปลั๊กอินในลักษณะที่อธิบายด้านล่าง

เพื่อความสะดวกในการใช้งานให้อ้างอิงฟังก์ชันในลักษณะง่ายๆ:

    var P = $.fn.php;

จากนั้นเริ่มต้นปลั๊กอิน:

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

และตอนนี้สถานการณ์การใช้งานบางส่วน:

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

การสาธิตฟังก์ชัน PHP Chaining:

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

สาธิตการส่งบล็อก JSON ของโค้ดหลอก 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 );

การกำหนดค่าแบ็กเอนด์มีรายการที่อนุญาตพิเศษเพื่อให้คุณสามารถ จำกัด ฟังก์ชันที่สามารถเรียกใช้ได้ มีรูปแบบอื่น ๆ อีกสองสามอย่างสำหรับการทำงานกับ PHP ที่อธิบายโดยปลั๊กอินเช่นกัน


5

ฉันจะยึดตามวิธีปกติในการเรียกไฟล์โดยตรง แต่ถ้าคุณต้องการเรียกใช้ฟังก์ชันจริงๆให้ดูที่JSON-RPC (JSON Remote Procedure Call)

โดยทั่วไปคุณจะส่งสตริง JSON ในรูปแบบเฉพาะไปยังเซิร์ฟเวอร์เช่น

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

ซึ่งรวมถึงฟังก์ชันในการโทรและพารามิเตอร์ของฟังก์ชันนั้น

แน่นอนเซิร์ฟเวอร์ต้องรู้วิธีจัดการกับคำขอดังกล่าว
นี่คือปลั๊กอิน jQuery สำหรับ JSON-RPCและเช่นZend JSON Serverเป็นการใช้งานเซิร์ฟเวอร์ใน PHP


ซึ่งอาจมากเกินไปสำหรับโปรเจ็กต์ขนาดเล็กหรือฟังก์ชันน้อย วิธีที่ง่ายที่สุดที่จะเป็นคำตอบที่คาริม ในทางกลับกัน JSON-RPC เป็นมาตรฐาน


4

คุณไม่สามารถเรียกใช้ฟังก์ชัน PHP ด้วย Javascript ได้เช่นเดียวกับที่คุณไม่สามารถเรียกใช้ฟังก์ชัน PHP ตามอำเภอใจเมื่อคุณโหลดหน้าเว็บ (เพียงแค่นึกถึงผลกระทบด้านความปลอดภัย)

หากคุณต้องการห่อรหัสของคุณในฟังก์ชันไม่ว่าด้วยเหตุผลใดก็ตามทำไมคุณไม่เรียกใช้ฟังก์ชันภายใต้นิยามฟังก์ชันเช่น:

function test() {
    // function code
}

test();

หรือใช้ PHP ได้แก่ :

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

3

คุณจะต้องเปิดเผยและปลายทาง (URL) ในระบบของคุณซึ่งจะยอมรับคำขอ POST จากการโทร ajax ใน jQuery

จากนั้นเมื่อประมวลผล url นั้นจาก PHP คุณจะเรียกใช้ฟังก์ชันของคุณและส่งคืนผลลัพธ์ในรูปแบบที่เหมาะสม (เป็นไปได้มากที่สุดสำหรับ JSON หรือ XML หากคุณต้องการ)


3

คุณสามารถใช้ห้องสมุดของฉันที่ทำเช่นนั้นโดยอัตโนมัติฉันได้รับการปรับปรุงในช่วง 2 ปีที่ผ่านมา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();

จาวาสคริปต์จะง่ายเหมือน

phery.remote('phpfunction');

คุณสามารถส่งผ่านส่วน javascript แบบไดนามิกทั้งหมดไปยังเซิร์ฟเวอร์ด้วยตัวสร้างแบบสอบถามเช่นอินเทอร์เฟซแบบ chainable และคุณสามารถส่งข้อมูลประเภทใดก็ได้กลับไปที่ PHP ตัวอย่างเช่นฟังก์ชันบางอย่างที่ใช้พื้นที่มากเกินไปในฝั่งจาวาสคริปต์อาจถูกเรียกในเซิร์ฟเวอร์โดยใช้สิ่งนี้ (ในตัวอย่างนี้คือ mcrypt ซึ่งในจาวาสคริปต์แทบจะเป็นไปไม่ได้ที่จะทำสำเร็จ):

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

และในเซิร์ฟเวอร์

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

ตอนนี้variableจะมีข้อมูลที่เข้ารหัส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.