PHP फ़ंक्शन को कॉल करने के लिए jquery $ .ajax का उपयोग करना


118

यह एक सरल उत्तर हो सकता है, लेकिन मैं PHP स्क्रिप्ट को कॉल करने के लिए jQuery के $ .ajax का उपयोग कर रहा हूं। जो मैं करना चाहता हूं वह मूल रूप से उस PHP स्क्रिप्ट को एक फ़ंक्शन के अंदर रखा गया है और जावास्क्रिप्ट से PHP फ़ंक्शन को कॉल करता है।

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

इसके लिए

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

मैं उस फ़ंक्शन को जावास्क्रिप्ट में कैसे कहूंगा? अभी मैं सूचीबद्ध PHP फ़ाइल के साथ $ .ajax का उपयोग कर रहा हूँ।


6
PHP जावास्क्रिप्ट-जनरेट किया गया PHP कोड उत्तीर्ण करना, या इसे दूसरे तरीके से करना, बहुत बुरा विचार है।
टायलर कार्टर

क्या आप समझा सकते हैं कि यह बुरा क्यों है?
कैटफ़िश

3
क्योंकि कोई भी आपके कोड के स्थान पर कोई भी कोड डाल सकता है, और इस प्रकार वे आपके सर्वर पर खराब काम कर सकते हैं।
टायलर कार्टर

9
@ Chacha102: या तो आप या मैं इस सवाल को नहीं समझते हैं। मेरी समझ में वह एक दूरस्थ प्रक्रिया कॉल करना चाहता है।
फेलिक्स क्लिंग

यदि आपके पास एक श्वेतसूची है, जो आपके सभी अनुमत कार्यों या "प्रक्रियाओं" तक पहुँच को प्रतिबंधित करती है, तो एक दूरस्थ प्रक्रिया कॉल स्वीकार्य हो सकती है। इसे लागू करना मुश्किल नहीं होगा।
Xaxis

जवाबों:


228

$.ajaxकिसी विशेष 'कार्रवाई' को लागू करने के लिए एक सर्वर संदर्भ (या URL, या जो भी) को कॉल करने के लिए उपयोग करें । आप जो चाहते हैं वह कुछ इस तरह है:

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

सर्वर साइड पर, actionPOST पैरामीटर को पढ़ा जाना चाहिए और संबंधित मान को लागू करने की विधि को इंगित करना चाहिए, जैसे:

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

मेरा मानना ​​है कि यह कमांड पैटर्न का एक सरल अवतार है ।


9
पकड़ लिया। तो आप सीधे js के साथ नहीं चुन सकते हैं कि PHP में किस फ़ंक्शन को कॉल करना है, आप केवल पोस्ट मान को हथियाने के लिए PHP का उपयोग कर सकते हैं और उस तरह से फ़ंक्शन को कॉल कर सकते हैं। धन्यवाद
कैटफ़िश

लेकिन यह सरल है यदि आप एक रूपरेखा का उपयोग कर रहे हैं। उदाहरण के लिए कोहना के साथ आप कंट्रोलर / एक्शन को अजाक्स (फंक्शन () {url: 'कंट्रोलर / एक्शन। एफपीपी,}) कह सकते हैं;
डेथ कोडर

1
@MrMesees यह बहुत अच्छा होगा यदि आप उन आधुनिक सर्वोत्तम प्रथाओं को हमारे साथ साझा करते हैं।
फ्रांसिस्को रोमेरो

HTTP फ़्रेन्च एपीआई का उपयोग जेएस फ्रंटएंड के साथ-साथ वादों का उपयोग करने के लिए हो सकता है। PHP सैनिटाइजिंग और फ़िल्टरिंग इनपुट के लिए, शायद एक मिडलवेयर का उपयोग करना ताकि इसे कई एंडपॉइंट पर लागू किया जा सके। मुझे लगता है कि अगर आप मेरी प्रतिक्रिया का इंतजार नहीं करना चाहते हैं ~ 2 साल एक महान विकल्प हो सकता है।
MrMesees

12

मैंने एक jQuery प्लगइन विकसित किया है जो आपको किसी भी कोर PHP फ़ंक्शन या यहां तक ​​कि उपयोगकर्ता परिभाषित PHP फ़ंक्शन को प्लगइन के तरीकों के रूप में कॉल करने की अनुमति देता है: jquay.pp

हमारे दस्तावेज़ के सिर में 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 फंक्शन चैनिंग का प्रदर्शन:

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

PHP के छद्म कोड का JSON ब्लॉक भेजने का प्रदर्शन:

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 रिमोट प्रक्रिया कॉल) ।

आप मूल रूप से सर्वर पर एक विशिष्ट प्रारूप में JSON स्ट्रिंग भेजते हैं, जैसे

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

जिसमें कॉल करने के लिए फ़ंक्शन और उस फ़ंक्शन के पैरामीटर शामिल हैं।

बेशक सर्वर को यह जानना होगा कि ऐसे अनुरोधों को कैसे संभालना है।
यहाँ JSON-RPC और जैसे Zend JSON सर्वर के लिए jQuery प्लगइन है PHP में सर्वर कार्यान्वयन के रूप ।


यह एक छोटी परियोजना या कम कार्यों के लिए ओवरकिल हो सकता है। सबसे आसान तरीका होगा करीम का जवाब । दूसरी ओर, JSON-RPC एक मानक है।


4

आप जावास्क्रिप्ट फ़ंक्शन के साथ एक PHP फ़ंक्शन को कॉल नहीं कर सकते हैं, उसी तरह जब आप एक पृष्ठ लोड करते हैं (बस सुरक्षा निहितार्थ के बारे में सोचते हैं) मनमाने ढंग से PHP फ़ंक्शन को कॉल नहीं कर सकते।

यदि आपको किसी कारण से फ़ंक्शन में अपना कोड लपेटने की आवश्यकता है, तो आप फ़ंक्शन परिभाषा के तहत फ़ंक्शन कॉल क्यों नहीं करते हैं, उदाहरण के लिए:

function test() {
    // function code
}

test();

या, एक PHP का उपयोग करें शामिल हैं:

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

3

आपको अपने सिस्टम में एक्सपोज और एंडपॉइंट (URL) करना होगा जो jQuery में ajax कॉल से POST रिक्वेस्ट को स्वीकार करेगा।

फिर, जब 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');

आप सभी डायनेमिक जावास्क्रिप्ट भाग को सर्वर में क्वेरी कर सकते हैं, जैसे कि चेनएबल इंटरफ़ेस जैसे क्वेरी बिल्डर के साथ, और आप किसी भी प्रकार के डेटा को 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 होगा एन्क्रिप्टेड डेटा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.