bir PHP işlevi çağırmak için jQuery $. ajax kullanarak

8 Cevap php

Bu basit bir cevap olabilir, ama ben bir PHP komut dosyası çağırmak için jQuery en $. Ajax kullanıyorum. Ne yapmak istediğim temelde bir işlev içinde olduğunu PHP script koymak ve Javascript PHP işlevi çağırır.

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

Buna

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

Nasıl javascript o işlev çağırır? Şu anda sadece $ kullanıyorum. Listelenen PHP dosyası ile ajax.

8 Cevap

$.ajax, belirli bir 'eylem' çağırmak için bir sunucu içeriği (veya URL, ya da her neyse) aramak için kullanın. Ne istediğiniz gibi bir şeydir:

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

Sunucu tarafında, action POST parametre okunacağı ve karşılık gelen değer, örneğin çağırmak için yönteme işaret etmelidir:

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

Ben o Command pattern basit bir doğuşunda inanıyorum.

Ben plugin yöntemlerden herhangi çekirdek PHP işlevini hatta kullanıcı tanımlı PHP işlevleri çağırmak için olanak sağlayan bir jQuery eklentisi geliştirdi: jquery.php

Bizim belgenin baş jquery ve jquery.php dahil ve bizim sunucu üzerinde request_handler.php yerleştirdikten sonra biz aşağıda açıklanan şekilde eklentisi kullanarak başlamak istiyorum.

Kullanım kolaylığı için, basit bir tarzda işlev referans:

    var P = $.fn.php;

Sonra eklenti başlatılamadı:

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

Ve şimdi bazı kullanım senaryoları:

// 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 fonksiyon zincirleme gösterilmesi:

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 pseudo-kod JSON blok gönderme gösterilmesi:

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

Eğer denebilecek hangi işlevleri kısıtlayabilir böylece arka uç yapılandırması bir beyaz liste sağlar. Yanı sıra eklenti tarafından açıklanan PHP ile çalışmak için birkaç başka desenler vardır.

Ben doğrudan dosyayı aramak için normal bir yaklaşım ile sopa, ama sen gerçekten bir işlevi çağırmak istiyorsanız, JSON-RPC (json Uzaktan Yordam Çağrısı) bir göz olurdu.

Bu temelde, örneğin, sunucuya belirli bir formatta bir JSON dize gönderin

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

hangi aramak için işlevini ve bu işlevin parametrelerini içerir.

Of course the server has to know how to handle such requests.
Here is
jQuery plugin for JSON-RPC and e.g. the Zend JSON Server as server implementation in PHP.


Bu küçük bir proje veya daha az fonksiyonları için overkill olabilir. En kolay yol olurdu karim's answer. Öte yandan, JSON-RPC bir standarttır.

(Sadece güvenlik uygulamalarını düşünmek), bir sayfayı yüklemek zaman keyfi PHP işlevleri çağırmak olamaz aynı şekilde, JavaScript ile bir PHP işlevini çağırmak olamaz.

Eğer herhangi bir nedenle bir fonksiyonu kodunuzu kaydırmak gerekiyorsa, neden işlev tanımı altında bir işlev çağrısı, örneğin koymayın ya:

function test() {
    // function code
}

test();

Ya da, bir PHP kullanabilirsiniz şunlardır:

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

Otomatik olarak, ben http://phery-php-ajax.net son 2 yıldır onu geliştirmeye oldum gelmez benim kütüphanesini kullanabilirsiniz

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

Javascript kadar basit olurdu

phery.remote('phpfunction');

Sen chainable arayüzü gibi bir sorgu oluşturucu ile, sunucuya tüm dinamik javascript kısmını geçebilir, ve geri PHP türlü veri geçebilir. Örneğin, javascript tarafında çok fazla yer alacağını bazı işlevler, bu kullanarak sunucu denilebilir (bu örnekte, mcrypt, javascript başarmak neredeyse imkansız olacağını):

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

ve sunucu

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

Şimdi variable şifrelenmiş veri olacak.

Siz jQuery ajax çağrısından POST isteğini kabul edecek sisteminizde (URL) ortaya çıkarmak ve son nokta zorunda olacak.

Sonra PHP o url işlerken, size işlevini çağırır ve (isterseniz JSON büyük olasılıkla, ya da XML) uygun biçimde sonuca dönmek.

Ben javascript sağlanan php harita işlevleri ve tüm iletişim önemser küçük bir çerçeve inşa başında değilim, ama ben henüz bitirmedim.

Buraya bakın: http://sourceforge.net/projects/mydlo/

[Bu :) Şimdi yalnızca bir prealpha sürümü kararlı, düzenlenirse]

$.post(
    "http://example.com/folder/your_file.php",     // url
    { something : "foobar", foo : "bar" },         // post-data
    function(data){                                // response
        console.log(data);
    }
);

http://api.jquery.com/jQuery.post/ daha fazla örnek görmek