如何通过 JavaScript 调用 PHP 函数?

How can I call PHP functions by JavaScript?

提问人:wallgeek 提问时间:4/2/2013 最后编辑:Ed The ''Pro''wallgeek 更新时间:8/1/2022 访问量:546782

问:

我正在尝试将PHP函数从外部PHP文件调用到JavaScript脚本中。我的代码不同且很大,所以我在这里编写了一个示例代码。

这是我的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 调用值。

JavaScript PHP 函数

评论

13赞 Class 4/2/2013
PHP是服务器端,JS是客户端。您需要将 ajax 或页面刷新与 gets/posts 一起使用,或者尝试创建一个 js 等效函数。

答:

47赞 Sandeep Kapil 4/2/2013 #1

试试这个

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

评论

6赞 Shadi 2/1/2017
尽管此解决方案有效,但它不是一种干净且好的方法。它在客户端和服务器代码之间具有紧密的依赖关系。更好的设计是使用 ajax 将请求发送到具有 php 函数调用的 php 页面。
1赞 A.A Noman 2/26/2017
<脚本> var num1;VAR NUM2;var phpadd= <?php echo add($num 1, $num 2);?> </script> 是否可以以这种方式调用函数?
2赞 ashleedawg 1/20/2020
@Shadi - 我很好奇,“客户端和服务器代码之间的紧密依赖关系”有什么问题?是否存在潜在问题,或者这只是“整洁编码”的问题?
2赞 Robert Sinclair 5/5/2020
@ashleedawg好问题,好像使用 Ajax 不知何故不需要客户端和服务器端之间的“紧密依赖”。
2赞 Daniele Rugginenti 6/24/2022
@statosdotcom您的代码不起作用。你不能以这种方式在 PHP 中使用 JS var。
5赞 Lemon Drop 4/2/2013 #2

例如,如果你真的想将数据发送到 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);
});
99赞 Victor 4/2/2013 #3

是的,您可以使用请求参数中的数据向服务器执行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);

?>

评论

9赞 KingsInnerSoul 7/23/2014
你能向我解释一下这段代码吗?以及如何在不同的功能和结构下使用它?
1赞 Kuba 2/21/2019
是的,很好的答案......我只是在关于jQuery的注释中添加,这往往会变慢。另一种选择是使用浏览器原生 XMLHttpRequest,例如这里 blog.garstasio.com/you-don't-need-jquery/ajax/#posting
0赞 Nguai al 1/17/2020
header('内容类型:application/json');我认为你不需要这条线。
0赞 Nald Dev 1/17/2021
我正在寻找在输入更改时调用PHP函数,所以这给了我一个线索,我最终使用了fetch,谢谢
2赞 Heba 12/1/2021
@Victor我尝试了你的代码,但它从未进入我的PHP函数
1赞 radmen 4/2/2013 #4

尝试查看 CASSIS。这个想法是将PHP与JS混合在一起,这样两者都可以在客户端和服务器端工作。

8赞 Romain Durand 4/2/2013 #5

您需要创建一个 API: js 函数在 Web 服务上执行 AJAX 请求

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

在 PHP 端,您必须检查 action 参数才能执行 propre 函数(基本上是 $_GET[“action”] 变量上的 switch 语句)

评论

0赞 Nguai al 1/17/2020
为什么要使用函数表达式?这更适合函数声明。
7赞 Hernaldo Gonzalez 8/5/2013 #6

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)
    { 
       ...
    }
?>
3赞 Naresh 10/18/2013 #7

我为我写了一些脚本,它的工作..我希望它对你有用

<?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>
13赞 Anitha Mani 11/25/2013 #8

使用 document.write 例如

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

评论

4赞 Mikeys4u 2/24/2014
确保在使用它时加入“<?php”,因为脚本将不起作用。如果此代码在 stackoverflow 中显示为“< ?php”,则无法正确格式化
7赞 user6730329 12/27/2016 #9

这对我来说非常有效:

要调用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文件,而是另一个,它的路径是写在JS函数的变量中,并且需要评估PHP代码。此文件名为“phpCompiler.php”,位于您网站的根目录中:urlcallPHP

<?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是必需的:
从Google 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 之一下载文件并将其作为本地文件,这样您网站的启动加载速度会更快!

选择权在你!


现在你完成了!我只是告诉你如何使用功能。这是要调用 PHP 的 JavaScript:callPHP

//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赞 1/6/2017
让我们试试我的解决方案,对我来说它有效!在你对任何探测发表评论之后!
0赞 Ifeanyi Amadi 4/2/2019 #10

我创建了这个库,可能对您有所帮助。MyPHP 客户端和服务器端库

例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Page Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>

    <!-- include MyPHP.js -->
    <script src="MyPHP.js"></script>

    <!-- use MyPHP class -->
    <script>
        const php = new MyPHP;
        php.auth = 'hashed-key';

        // call a php class
        const phpClass = php.fromClass('Authentication' or 'Moorexa\\Authentication', <pass aguments for constructor here>);

        // call a method in that class
        phpClass.method('login', <arguments>);

        // you can keep chaining here...

        // finally let's call this class
        php.call(phpClass).then((response)=>{
            // returns a promise.
        });

        // calling a function is quite simple also
        php.call('say_hello', <arguments>).then((response)=>{
            // returns a promise
        });

        // if your response has a script tag and you need to update your dom call just call
        php.html(response);

    </script>
</body>
</html>
1赞 perlesvaus 12/24/2019 #11

我创建了这个库 JS PHP Import,您可以从 github 下载,并随时随地使用。

该库允许将 php 函数和类方法导入 javascript 浏览器环境,因此可以使用它们的实际名称作为 javascript 函数和方法进行访问。该代码使用 javascript promises,因此您可以链接函数返回。

我希望它对你有用。

例:

<script>
$scandir(PATH_TO_FOLDER).then(function(result) {
  resultObj.html(result.join('<br>'));
});

$system('ls -l').then(function(result) {
  resultObj.append(result);
});

$str_replace(' ').then(function(result) {
  resultObj.append(result);
});

// Chaining functions 
$testfn(34, 56).exec(function(result) { // first call
   return $testfn(34, result); // second call with the result of the first call as a parameter
}).exec(function(result) {
   resultObj.append('result: ' + result + '<br><br>');
});
</script>
6赞 User Not Exist 1/10/2021 #12

void 函数

<?php
function printMessage() {
    echo "Hello World!";
}
?>

<script>
    document.write("<?php printMessage() ?>");
</script>

值返回函数

<?php
function getMessage() {
    return "Hello World!";
}
?>

<script>
    var text = "<?php echo getMessage() ?>";
</script>
1赞 SuninDarknes 8/1/2022 #13

我只使用 js 制作了一个版本,没有使用任何依赖项。我认为这是最可靠的解决方案,但可能不是最好的解决方案,因为它不会检查任何错误。

JavaScript的

var a = 1;
var b = 2;
function add(){
  var xmlHttp = new XMLHttpRequest();
  xmlHttp.open( "GET", "YOUR_SERVER/function.php?a="+a+"&b="+b, false );
  xmlHttp.send( null );
  return xmlHttp.responseText; 
}
var c = add(a, b)

function.php 文件

<?php echo $_GET["a"] + $_GET["b"]?>

c = 3

评论

0赞 Matt Pengelly 8/5/2022
如果您有新问题,请单击“提问”按钮提出问题。如果有助于提供上下文,请附上指向此问题的链接。- 从评论