PHP işlevini çağırmak için jquery $ .ajax kullanma


118

Bu basit bir cevap olabilir, ancak bir PHP betiğini çağırmak için jQuery'nin $ .ajax'ını kullanıyorum. Yapmak istediğim şey temelde o PHP betiğini bir işlevin içine koymak ve PHP işlevini javascript'ten çağırmak.

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

buna

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

Bu işlevi javascript'te nasıl çağırırım? Şu anda listelenen PHP dosyasıyla sadece $ .ajax kullanıyorum.


6
PHP javascript tarafından üretilen PHP kodunu değerlendirilmek üzere geçirmek ya da başka bir şekilde yapmak çok kötü bir fikirdir.
Tyler Carter

Bunun neden kötü olduğunu açıklayabilir misin?
Catfish

3
Çünkü HERKES kodunuzun yerine HERHANGİ bir kod koyabilir ve bu nedenle sunucunuza kötü şeyler yapabilir.
Tyler Carter

9
@ Chacha102: Ya sen ya da ben soruyu anlamıyorum. Anladığım kadarıyla uzaktan prosedür çağrısı yapmak istiyor.
Felix Kling

İzin verilen işlevler veya "prosedürler" dışındaki tüm erişimleri kısıtlayan bir beyaz listeniz varsa, uzaktan prosedür çağrısı kabul edilebilir. Bunu uygulamak zor olmayacaktır.
Xaxis

Yanıtlar:


228

Kullanım $.ajaxbir sunucu bağlamı (veya URL ya da her neyse) belirli 'eylemi' çağırmak için aramak için. İstediğiniz şey şuna benzer:

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

Sunucu tarafında, actionPOST parametresi okunmalı ve karşılık gelen değer çağrılacak yöntemi göstermelidir, örneğin:

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

Bunun, Komuta modelinin basit bir enkarnasyonu olduğuna inanıyorum .


9
Anladım. Dolayısıyla, PHP'de hangi işlevi çağıracağınızı js ile doğrudan seçemezsiniz, PHP'yi yalnızca post değerini almak ve bu şekilde bir işlevi çağırmak için kullanabilirsiniz. Teşekkürler
Catfish

Ancak bir çerçeve kullanıyorsanız bu basittir. örneğin Kohana ile denetleyici / eylem ajax (function () {url: 'Controller / action.php',}) çağırabilirsiniz;
DeathCoder

1
@MrMesees Bu modern en iyi uygulamaları bizimle paylaşırsanız harika olur.
Francisco Romero

HTTP getirme API'sinin kullanılması JS ön ucu için olduğu gibi vaatleri kullanmak olabilir. PHP temizleme ve filtreleme girdisi için, belki de bir ara yazılım kullanarak birden çok uç noktaya uygulanabilir. Sanırım en önemlisi, geri bildirimimin ~ 2 yıl beklememesini istiyorsanız harika bir seçenek olabilir.
MrMesees

12

Herhangi bir çekirdek PHP işlevini ve hatta eklentinin yöntemi olarak kullanıcı tanımlı PHP işlevlerini çağırmanıza izin veren bir jQuery eklentisi geliştirdim: jquery.php

Belgemizin başına jquery ve jquery.php'yi ekledikten ve sunucumuza request_handler.php yerleştirdikten sonra, eklentiyi aşağıda açıklanan şekilde kullanmaya başlayacağız.

Kullanım kolaylığı için işlevi basit bir şekilde referans alın:

    var P = $.fn.php;

Ardından eklentiyi başlatın:

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 işlev zincirini gösterme:

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 sözde kodundan oluşan bir JSON bloğu göndermenin 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 );

Arka uç yapılandırması bir beyaz liste sağlar, böylece hangi işlevlerin çağrılabileceğini kısıtlayabilirsiniz. Eklenti tarafından açıklanan PHP ile çalışmak için birkaç başka kalıp daha var.


5

Dosyayı doğrudan çağırmak için normal yaklaşıma bağlı kalırım, ancak gerçekten bir işlevi çağırmak istiyorsanız, JSON-RPC'ye (JSON Remote Procedure Call) bir göz atın .

Temel olarak sunucuya belirli bir formatta bir JSON dizesi gönderirsiniz, örn.

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

bu, çağrılacak işlevi ve bu işlevin parametrelerini içerir.

Elbette sunucunun bu tür talepleri nasıl karşılayacağını bilmesi gerekir.
İşte jQuery JSON-RPC için eklenti ve örneğin Zend JSON Sunucusu PHP sunucu uygulaması olarak.


Bu, küçük bir proje veya daha az işlev için aşırı olabilir. En kolay yol karimin cevabı olurdu . Öte yandan JSON-RPC bir standarttır.


4

Javascript ile bir PHP işlevini çağıramazsınız, aynı şekilde bir sayfayı yüklediğinizde keyfi PHP işlevlerini çağıramazsınız (sadece güvenlik sonuçlarını düşünün).

Herhangi bir nedenle kodunuzu bir fonksiyonun içine sarmalamanız gerekiyorsa, neden fonksiyon tanımının altına bir fonksiyon çağrısı koymuyorsunuz, örneğin:

function test() {
    // function code
}

test();

Veya bir PHP şunları içerir:

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

3

Sisteminizde jQuery'deki ajax çağrısından gelen POST isteğini kabul edecek olan, açığa çıkarmanız ve son nokta (URL) yapmanız gerekecektir.

Daha sonra, bu url'yi PHP'den işlerken, işlevinizi çağırır ve sonucu uygun biçimde (büyük olasılıkla JSON veya tercih ederseniz XML) döndürürsünüz.


3

Bunu otomatik olarak yapan kütüphanemi kullanabilirsiniz, son 2 yıldır onu iyileştiriyorum 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 şu kadar basit olacaktır:

phery.remote('phpfunction');

Zincirlenebilir arabirim gibi bir sorgu oluşturucu ile tüm dinamik javascript bölümünü sunucuya geçirebilir ve her tür veriyi PHP'ye geri gönderebilirsiniz. Örneğin, javascript tarafında çok fazla yer kaplayacak bazı işlevler, sunucuda şu şekilde çağrılabilir (bu örnekte, mcrypt, javascript'te başarılması neredeyse imkansızdır):

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 sunucuda

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ş verilere sahip olacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.