2013-04-02 93 views
30

我想從一個外部的php文件調用一個php函數到javascript中。我的代碼不同而且很大,所以我在這裏寫了一個示例代碼。如何通過JavaScript調用PHP函數?

這是我的PHP代碼:

<?php 
function add($a,$b){ 
    $c=$a+$b; 
    return $c; 
} 
function mult($a,$b){ 
    $c=$a*$b; 
    return $c; 
} 

function divide($a,$b){ 
    $c=$a/$b; 
    return $c; 
} 
?> 

這是我的javascript代碼:

<script> 
    var phpadd= add(1,2); //call the php add function 
    var phpmult= mult(1,2); //call the php mult function 
    var phpdivide= divide(1,2); //call the php divide function 
</script> 

原來這就是我想要做的。

我的原始php文件不包含這些數學函數,但想法是相同的。

如果以某種方式它沒有適當的解決方案,那麼請建議我的替代方案,但它應該從外部的PHP調用值。

+10

php是服務器端JS是客戶端。您需要使用ajax或頁面刷新gets/posts或嘗試創建一個js等效函數。 – Class

回答

52

是的,你在請求參數做Ajax請求到服務器與您的數據,這樣的(很簡單):

注意下面的代碼使用jQuery

jQuery.ajax({ 
    type: "POST", 
    url: 'your_functions_address.php', 
    dataType: 'json', 
    data: {functionname: 'add', arguments: [1, 2]}, 

    success: function (obj, textstatus) { 
        if(!('error' in obj)) { 
         yourVariable = obj.result; 
        } 
        else { 
         console.log(obj.error); 
        } 
      } 
}); 

和your_functions_address.php這樣的:

<?php 
    header('Content-Type: application/json'); 

    $aResult = array(); 

    if(!isset($_POST['functionname'])) { $aResult['error'] = 'No function name!'; } 

    if(!isset($_POST['arguments'])) { $aResult['error'] = 'No function arguments!'; } 

    if(!isset($aResult['error'])) { 

     switch($_POST['functionname']) { 
      case 'add': 
       if(!is_array($_POST['arguments']) || (count($_POST['arguments']) < 2)) { 
        $aResult['error'] = 'Error in arguments!'; 
       } 
       else { 
        $aResult['result'] = add(floatval($_POST['arguments'][0]), floatval($_POST['arguments'][1])); 
       } 
       break; 

      default: 
       $aResult['error'] = 'Not found function '.$_POST['functionname'].'!'; 
       break; 
     } 

    } 

    echo json_encode($aResult); 

?> 
+3

你可以向我解釋這段代碼嗎?以及如何在不同的功能和參數下使用它? – KingsInnerSoul

23

嘗試這個

<script> 
    var phpadd= <?php echo add(1,2);?> //call the php add function 
    var phpmult= <?php echo mult(1,2);?> //call the php mult function 
    var phpdivide= <?php echo divide(1,2);?> //call the php divide function 
</script> 
+0

謝謝Sandeep。解決方案就像魅力....... – DKBHOI

+2

雖然這個解決方案的工作原理,但它並不是一個乾淨和好的方法。它在客戶端和服務器代碼之間有嚴格的依賴關係。更好的設計是使用ajax將請求發送到具有php函數調用的php頁面。 – Shadi

+0

是否可以通過這種方式調用函數? –

1

如果你真的想將數據發送到PHP腳本,例如,你可以這樣做:

的PHP:

<?php 
$a = $_REQUEST['a']; 
$b = $_REQUEST['b']; //totally sanitized 

echo $a + $b; 
?> 

JS(使用jQuery) :

$.post("/path/to/above.php", {a: something, b: something}, function(data){           
    $('#somediv').html(data); 
}); 
1

試試看CASSIS。這個想法是將PHP和JS混合使用,因此它們都可以在客戶端和服務器端工作。

6

您需要創建一個API: 你的JS功能上的PHP端Web服務

var mult = function(arg1, arg2) 
    $.ajax({ 
     url: "webservice.php?action=mult&arg1="+arg1+"&arg2="+arg2 
    }).done(function(data) { 
     console.log(data); 
    }); 
    } 

執行AJAX請求,你必須檢查動作參數,以執行黑白配功能(基本上在$ _GET [ 「行動」]變量switch語句)

3

的index.php

<body> 
... 
<input id="Div7" name="Txt_Nombre" maxlenght="100px" placeholder="Nombre" /> 
<input id="Div8" name="Txt_Correo" maxlenght="100px" placeholder="Correo" /> 
<textarea id="Div9" name="Txt_Pregunta" placeholder="Pregunta" /></textarea> 

<script type="text/javascript" language="javascript"> 

$(document).ready(function() { 
    $(".Txt_Enviar").click(function() { EnviarCorreo(); }); 
}); 

function EnviarCorreo() 
{ 
    jQuery.ajax({ 
     type: "POST", 
     url: 'servicios.php', 
     data: {functionname: 'enviaCorreo', arguments: [$(".Txt_Nombre").val(), $(".Txt_Correo").val(), $(".Txt_Pregunta").val()]}, 
     success:function(data) { 
     alert(data); 
     } 
    }); 
} 
</script> 

servicios.php

<?php 
    include ("correo.php"); 

    $nombre = $_POST["Txt_Nombre"]; 
    $correo = $_POST["Txt_Corro"]; 
    $pregunta = $_POST["Txt_Pregunta"]; 

    switch($_POST["functionname"]){ 

     case 'enviaCorreo': 
      EnviaCorreoDesdeWeb($nombre, $correo, $pregunta); 
      break;  
    } 
?> 

correo.php

<?php 
    function EnviaCorreoDesdeWeb($nombre, $correo, $pregunta) 
    { 
     ... 
    } 
?> 
1

我寫了一些劇本,我的工作。我希望這對你有用

<?php 
if(@$_POST['add']) 
{ 
function add() 
{ 
    $a="You clicked on add fun"; 
    echo $a; 
} 
add(); 
} 
else if (@$_POST['sub']) 
{ 
function sub() 
{ 
    $a="You clicked on sub funn"; 
echo $a; 
} 
sub(); 
} 
?> 
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="POST"> 

<input type="submit" name="add" Value="Call Add fun"> 
<input type="submit" name="sub" Value="Call Sub funn"> 
<?php echo @$a; ?> 

</form> 
+0

在我的本地系統中,我檢查了它對我的工作.... :) – Naresh

7

使用的文件。寫 例如,

<script> 
    document.write(' <?php add(1,2); ?> '); 
    document.write(' <?php milt(1,2); ?> '); 
    document.write(' <?php divide(1,2); ?> '); 
</script> 
+1

請確保在使用此參數時加入'<?php',因爲該腳本不起作用。如果它顯示爲'<?php' – Mikeys4u

+0

不錯^^非常感謝! –

1

這項工作非常適合我:

要調用PHP函數(參數也行)就可以了,像很多人說,送參數打開PHP文件,從那裏檢查參數的值來調用函數。但是你也可以做很多人說這是不可能的:直接調用正確的PHP函數,而不需要向PHP文件添加代碼。

我找到了一種方法:

這對JavaScript:

function callPHP(expression, objs, afterHandler) { 
     expression = expression.trim(); 
     var si = expression.indexOf("("); 
     if (si == -1) 
      expression += "()"; 
     else if (Object.keys(objs).length > 0) { 
      var sfrom = expression.substring(si + 1); 
      var se = sfrom.indexOf(")"); 
      var result = sfrom.substring(0, se).trim(); 
      if (result.length > 0) { 
       var params = result.split(","); 
       var theend = expression.substring(expression.length - sfrom.length + se); 
       expression = expression.substring(0, si + 1); 
       for (var i = 0; i < params.length; i++) { 
        var param = params[i].trim(); 
        if (param in objs) { 
         var value = objs[param]; 
         if (typeof value == "string") 
          value = "'" + value + "'"; 
         if (typeof value != "undefined") 
          expression += value + ","; 
        } 
       } 
       expression = expression.substring(0, expression.length - 1) + theend; 
      } 
     } 
     var doc = document.location; 
     var phpFile = "URL of your PHP file"; 
     var php = 
      "$docl = str_replace('/', '\\\\', '" + doc + "'); $absUrl = str_replace($docl, $_SERVER['DOCUMENT_ROOT'], str_replace('/', '\\\\', '" + phpFile + "'));" + 
      "$fileName = basename($absUrl);$folder = substr($absUrl, 0, strlen($absUrl) - strlen($fileName));" + 
      "set_include_path($folder);include $fileName;" + expression + ";"; 
     var url = doc + "/phpCompiler.php" + "?code=" + encodeURIComponent(php); 
     $.ajax({ 
      type: 'GET', 
      url: url, 
      complete: function(resp){ 
       var response = resp.responseText; 
       afterHandler(response); 
      } 
     }); 
    } 


這一個PHP文件,該文件是不是你的PHP文件,但另一個,這條路徑寫入在urlJS函數變量callPHP,它需要評估PHP代碼。此文件被稱爲「phpCompiler.php」和它在你的網站的根目錄:

<?php 
$code = urldecode($_REQUEST['code']); 
$lines = explode(";", $code); 
foreach($lines as $line) 
    eval(trim($line, " ") . ";"); 
?> 


所以,你的PHP代碼保持等於除了返回值,這將是附和道:

<?php 
function add($a,$b){ 
    $c=$a+$b; 
    echo $c; 
} 
function mult($a,$b){ 
    $c=$a*$b; 
    echo $c; 
} 

function divide($a,$b){ 
    $c=$a/$b; 
    echo $c; 
} 
?> 


我建議你要記住,jQuery是必需的:
從谷歌CDN下載:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 

或Microsoft CDN:「我更喜歡谷歌! :)」

<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.1.1.min.js"></script> 

更好的是從兩個CDN中的一個下載文件,並把它作爲本地文件,那麼你的網站的速度更快!

選擇的啓動時加載的是你!


現在你說完我只是告訴你如何使用 callPHP 功能這是JavaScript調用PHP:

//Names of parameters are custom, they haven't to be equals of these of the PHP file. 
//These fake names are required to assign value to the parameters in PHP 
//using an hash table. 
callPHP("add(num1, num2)", { 
      'num1' : 1, 
      'num2' : 2 
     }, 
      function(output) { 
       alert(output); //This to display the output of the PHP file. 
     }); 
+0

讓我們嘗試我的解決方案,對我來說它的工作原理!在您對任何探針發表評論後! – 2017-01-06 12:55:04