Я пытаюсь кое-что с JSON и PHP, и есть кое-что, что я не могу найти способ сделать, хотя я не на 100% уверен, что он есть. Но поскольку это выглядит как хороший вариант (если возможно), я решил спросить здесь.
У меня есть эти примеры с официального сайта jquery. Есть два файла, первый – index.php, где я выполняю мой Ajax, hete это:
<!DOCTYPE html> <html> <head> <title>Simple form sending and receiving a JSON object to/from PHP</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ var data = { "sales": [ { "firstname" : "John", "lastname" : "Brown" }, { "firstname" : "Marc", "lastname" : "Johnson" } ] // end of sales array } var dataString = JSON.stringify(data); $.post('simpleformSubmi.php', { data: dataString}, showResult, "text"); }); function showResult(res) { $("#fullresponse").html("Full response: " +res); } </script> <div id="fullresponse"></div> </head> <body>
Ничего сложного. И у меня есть мой simpleformSubmi.php, который:
<?php $logFile = 'logFile'; $res = json_decode(stripslashes($_POST['data']), true); error_log("result: ".$_POST['data'].", res=".json_encode($res), 3, $logFile); error_log("\n", 3, $logFile); //header("Content-type: text/plain"); foreach ($res as $key=>$value) { $str[] = $value; } $functionArray ="function(){ \$a = 10; echo \$a;}"; $jsStr = $str[0][1]; echo json_encode($jsStr['firstname']); echo '<hr />'; echo json_encode($res); echo '<hr />'; echo json_encode($functionArray); ?>
Как вы можете видеть, $ functionArray – это фактически строка, содержащая функцию PHP, которую я хочу вернуть с помощью JSON и выполнить ее после этого. Так есть ли способ сделать это на самом деле? Теперь то, что я получаю в файле index.php afet, выполняет следующие действия:
"function(){ $a = 10; echo $a;}
"
Спасибо, Lern
Похоже, вы пытаетесь выполнить функцию PHP через JavaScript. Поскольку PHP выполняется на стороне сервера, единственный способ, которым вы должны выполнить функцию PHP в этом контексте, – попросить сервер выполнить функцию для вас, например, выполняя другой вызов ajax.
Что-то вроде этого:
index.php
$(document).ready(function(){ var data = { "sales": [ { "firstname" : "John", "lastname" : "Brown" }, { "firstname" : "Marc", "lastname" : "Johnson" } ] // end of sales array } var dataString = JSON.stringify(data); //Change post() success callback function to executePHP() $.post('simpleformSubmi.php', { data: dataString}, executePHP, "text"); //Let's define executePHP() outside post() call for clarity function executePHP() { //Ask the server to execute function foo(), and get the result $.get("example.com/somefile.php?function=foo", function(data) { //Success function, do whatever you want. alert(data); }); } });
Затем в файле somefile.php
<?php //Condition(s), if any. You could even implement this interface using REST. //Get function to execute if($_GET["function"] == "foo") { //Output function's result. echo foo(); } //The function you want to run function foo() { //Do something $a = 10; return $a; } ?>
Если все пойдет хорошо, когда JavaScript достигнет alert(data);
вы увидите 10
.
Вы не можете выполнить функцию PHP после отправки ее в качестве ответа, так как ответ получен на стороне клиента, а PHP – это серверный язык.
Обычно вы просто возвращаете значения. В вашем примере вы просто вернете ассоциативный массив, содержащий пару значений ключа a,10
.
Вы можете возвращать функции javascript из скрипта PHP и выполнять это на стороне клиента, используя eval
но eval'ing
открывает коробку уязвимостей для pandora.
Вы не можете выполнить PHP-код за пределами PHP-сервера. Поэтому вы не можете запустить его в браузере.
Тем не менее, вы можете передать строку JavaScript и запустить ее через eval
. Некоторые люди скажут вам, что это плохо, но помните, что eval
был единственным способом разобрать JSON в первую очередь.
Чтобы отправить что-то в PHP, вы должны вызвать серверы через, pe через GET или POST-действия из формы. Но нет, вы не можете выполнить что-либо серверное через echo, поскольку эхо-выходы на стороне клиента. Вы всегда можете использовать eval (http://php.net/manual/es/function.eval.php) на сервере, чтобы выполнить что-то из сообщения POST, но оно не рекомендуется, так как оно может открыть большое отверстие безопасности.
Вы вернули функцию (я предполагаю, что вы имели в виду, что это javascript), теперь вам нужно ее вызвать. Это можно сделать, используя обратный вызов jQuery $ .post.
Попробуйте изменить это.
$.post('simpleformSubmi.php', { data: dataString}, showResult, "text");
к
$.post('simpleformSubmi.php', { data: dataString}, function(data){eval(data)}, "text");
Если его PHP (как он выглядит), а не Javascript, то это нужно будет выполнить с сервера. Быть, что это серверный язык «все.