2014-09-05 21 views
6

Dla mnie jest to coś nowego, więc właśnie badam to i próbuję to zrozumieć. Jak widać w skrypcie php są dwie funkcje i próbuję wywołać konkretną z jquery.Wywoływanie konkretnej funkcji z PHP z Jquery & Ajax

Teraz, jeśli mam jedną funkcję, mogę to zrobić, ale kiedy mam 2 lub więcej, zaczynam utknąć. Przypuszczam, że mógłbym to zrobić, gdy mam 2 funkcje, ale jak tylko więcej zmiennych jest w grze lub więcej funkcji, czy po prostu robię masywne instrukcje w moim php?

Problem polega na tym, że gdy dołączę do niego bazę danych, będę musiał rozważyć wszystkie dane wejściowe, które mogą się wydarzyć. Jak określić konkretną funkcję php podczas korzystania z jquery & ajax?

//function.php 
<?php 
    function firstFunction($name) 
    { 
     echo "Hello - this is the first function"; 
    } 

    function secondFunction($name) 
    { 
     echo "Now I am calling the second function"; 
    } 

?> 

<?php 
    $var = $_POST['name']; 

    if(isset($var)) 
    {  
     $getData = firstFunction($var); 
    } 
    else if(isset($var)) 
    { 
     $getData = secondFunction($var); 
    } 
    else 
    { 
     echo "No Result"; 
    } 

?> 

//index.html 
<div id="calling">This text is going to change></div> 

<script> 

    $(document).ready(function() { 
     $('#calling').load(function() { 
     $.ajax({ 
      cache: false, 
      type: "POST", 
      url: "function.php", 
      data: 'name=myname' 
      success: function(msg) 
      { 
       $('#calling').html((msg)); 
      } 

      }); // Ajax Call 
     }); //event handler 
    }); //document.ready 

</script> 
+0

* sidenote: * W przypadku '' else' isset ($ var) ', przekazujesz wartość null do' secondFunction() ' – Raptor

+0

Tak, ale co jeśli jest jeszcze coś innego? W takim razie, skąd miałaby wiedzieć, do czego ma dojść? –

+0

ajax jest czerwoną rozprawą, jej irreverent –

Odpowiedz

10

Trzeba zdać parametru, albo za pośrednictwem obiektu danych lub za pośrednictwem zmiennej GET na URL. Albo:

url: "function.php?action=functionname" 

czyli

data: { 
    name: 'myname', 
    action: 'functionname' 
} 

Następnie w PHP, można uzyskać dostęp do tego atrybutu i obsługiwać go:

if(isset($_POST['action']) && function_exists($_POST['action'])) { 
    $action = $_POST['action']; 
    $var = isset($_POST['name']) ? $_POST['name'] : null; 
    $getData = $action($var); 
    // do whatever with the result 
} 

Uwaga: lepszy pomysł ze względów bezpieczeństwa będzie aby dodać do białej listy dostępne funkcje, które można wywołać, np .:

switch($action) { 
    case 'functionOne': 
    case 'functionTwo': 
    case 'thirdOKFunction': 
     break; 
    default: 
     die('Access denied for this function!'); 
} 

przykładem realizacji:

// PHP: 
function foo($arg1) { 
    return $arg1 . '123'; 
} 

// ... 
echo $action($var); 

// jQuery: 
data: { 
    name: 'bar', 
    action: 'foo' 
}, 
success: function(res) { 
    console.log(res); // bar123 
} 
+0

IMO, nie używaj 'function_exists()' na wartościach '$ _POST'. Potencjalny błąd bezpieczeństwa/możliwość uszkodzenia strony/serwera. Wyobraź sobie, że akcja to 'fopen',' passthru' lub 'ini_set' ... – Raptor

+0

A więc jest 'action:' słowem kluczowym dla nazwy funkcji? –

+0

@JeffKranenburg tak, to tylko przykładowa nazwa zmiennej. Jak wspomniał Raptor, wywoływanie dowolnej funkcji może nie być właściwe - dlatego sugeruję zamiast tego białą listę (doda do odpowiedzi) –

3

Jesteś całkiem blisko tego, co chcesz osiągnąć.

Jeśli chcesz określić, która funkcja będzie wywoływana w PHP, możesz przekazać zmienną, aby poinformować PHP. Na przykład przekazywane request=save w AJAX, można napisać PHP następująco:

$request = ''; 
switch(trim($_POST['request'])) { 
    case 'save': 
    $player_name = (isset($_POST['playername']) ? trim($_POST['player_name']) : 'No Name')); 
    saveFunction($player_name); 
    break; 
    case 'load': 
    loadFunction(); 
    break; 
    default: 
    // unknown/missing request 
} 

EDIT: Można nawet przejść wraz z innymi parametrami

+0

Ah Widzę, co mówisz, fajnie, będę miał z tym zabawę. –

+0

Twoja koncepcja zadziałała, jednak @scrowler podał nieco więcej informacji. –

0

To nie może być dokładnie to, czego szukasz ale może pomóc innym szukającym bardzo prostego rozwiązania.

W swojej jQuery zadeklarować zmienną i wysłać go

var count_id = "count"; 

data: 
{ 
    count_id: count_id 
}, 

Następnie w czeku php jeśli ta zmienna jest ustawiona

if(isset($_POST['count_id'])) { 

Your function here 

}