Я пытаюсь вызвать 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.
Да, вы можете выполнить запрос 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); ?>
Попробуй это
<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>
используйте document.write, например,
<script> document.write(' <?php add(1,2); ?> '); document.write(' <?php milt(1,2); ?> '); document.write(' <?php divide(1,2); ?> '); </script>
Вам необходимо создать API: ваши функции js выполняют запросы AJAX на вашем веб-сервисе
var mult = function(arg1, arg2) $.ajax({ url: "webservice.php?action=mult&arg1="+arg1+"&arg2="+arg2 }).done(function(data) { console.log(data); }); }
на стороне php вам нужно будет проверить параметр действия, чтобы выполнить функцию propre (в основном оператор switch в переменной $ _GET ["action"])
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) { ... } ?>
Попробуйте взглянуть на CASSIS . Идея состоит в том, чтобы смешивать PHP с JS, чтобы оба могли работать на стороне клиента и сервера.
Я написал для меня несколько сценариев. Я надеюсь, что это может пригодиться вам
<?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>
к<?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>
Если вы действительно хотите отправить данные в 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); });
Чтобы вызвать функцию 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, а другой, какой путь написан в переменной url
функции JS 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:
Загрузите его из Google CDN:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
или из Microsoft CDN: «Я предпочитаю Google! :)»
<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. });