Вызов функции PHP из URL? - PullRequest
30 голосов
/ 05 декабря 2010

Если я хочу выполнить скрипт php, я просто указываю браузеру www.something.com/myscript.php

Но если я хочу выполнить определенную функцию внутри myscript.php, есть ли способ?что-то вроде www.something.com/myscript.php.specificFunction

Спасибо!

Ответы [ 14 ]

45 голосов
/ 05 декабря 2010

Один быстрый способ - это делать что-то вроде

something.com/myscript.php?f=your_function_name

, затем в myscript.php

if(function_exists($_GET['f'])) {
   $_GET['f']();
}

Но, пожалуйста, ради любви всех котят,не злоупотребляйте этим.

25 голосов
/ 05 декабря 2010

То, что делает ваш скрипт, полностью зависит от вас.URL-адреса не могут волшебным образом заставить Apache, PHP или любой другой серверный компонент вести себя определенным образом, но если вы пишете свою программу так, что конкретная функция может быть выполнена, это, безусловно, возможно.Возможно, что-то вроде:

switch($_GET['function']) {
case 'specificFunction':
    specificFunction();
}

Тогда вы можете посетить myScript.php?function=specificFunction

Будьте предельно осторожны, чтобы специально перечислить каждую допустимую функцию .Вы не должны просто брать параметр $_GET['function'] и слепо выполнять любую функцию, которую он говорит, поскольку это может представлять огромную угрозу безопасности.

10 голосов
/ 05 декабря 2010

Вам придется каким-то образом разоблачить это.Это потому, что раскрытие всех методов public будет представлять угрозу безопасности.

Example.php

<?php

    function CalculateLength($source)
    {
        return strlen($source);
    }

    if(isset($_GET['calculate-length']) && isset($_GET['value']){
        die(CalculateLength($_GET['value']));
    }

?>

Затем просто вызовите:

http://www.example.com/Example.php?calculate-length&value=My%20example
9 голосов
/ 21 марта 2013

Попробуйте это

$urlParams = explode('/', $_SERVER['REQUEST_URI']);
$functionName = $urlParams[2];
$functionName($urlParams);


function func1 ($urlParams) {
    echo "In func1";
}

function func2 ($urlParams) {
    echo "In func2";
    echo "<br/>Argument 1 -> ".$urlParams[3];
    echo "<br/>Argument 2 -> ".$urlParams[4];
}

и URL могут быть такими, как показано ниже
http://domain.com/url.php/func1
http://domain.com/url.php/func2/arg1/arg2

7 голосов
/ 05 декабря 2010

Вы можете сделать что-то вроде этого (не рекомендуется из соображений безопасности): www.exampe.com/myscript.php?run=getNames

, то:

<?php
if (isset($_GET['run']) && function_exists($_GET['run'])){
  echo $_GET['run']();
} else {
  echo 'Function not Found';
}

Было бы лучше использовать класс php вместо попытки вызвать функцию в глобальном пространстве имен, потому что они могут вызывать потенциально опасную функцию или вызывать функцию, для которой вы не хотите, чтобы они видели результат:

<?php
class PublicView {
  function get_page(){ echo 'hey'; }
}
if (isset($_GET['run']) && method_exists('PublicView',$_GET['run'])){
  $view = new PublicView();
  $view->$_GET['run']();
} else {
  echo 'Function not found';
}

Это также не позволило бы вызывать закрытые функции класса и т. Д.

5 голосов
/ 20 октября 2013

Вот, пожалуйста.Это действительно просто.Вызывает только определенные функции и выполняет функцию по умолчанию.

    <?php 

if (isset($_GET['p'])) $linkchoice=$_GET['p']; 
else $linkchoice=''; 

switch($linkchoice){ 

case 's' : 
    firstfunc(); 
    break; 

case 'second' : 
    secondfunc(); 
    break; 

default : 
    echo 'no function'; 

} 

?> 
2 голосов
/ 17 марта 2016

Я использую это на своем сайте.Чтобы использовать это, просто отформатируйте ваш URL следующим образом: www.something.com/myscript.php?function=myFunction&arg=foo&otherarg=bar Неважно, как вы называете аргументы в URL, и вы можете иметь столько аргументов, сколько захотите.

<?php
        if(isset($_GET["function"])&&!empty($_GET)){
            $function = $_GET["function"];
            unset($_GET["function"]);
            $canexec = array(
                "function name that can be executed",
                "function name that can be executed",
                "function name that can be executed"
            );
            if(!in_array($function,$canexec)){
                die("That function cannot be executed via url.");
            }
            $args = array();
            if(count($_GET)>0){
                //handle args
                foreach($_GET as $arg){
                   array_push($args,$arg);
                }
            }
            $result = call_user_func_array($function,$args);
            //this part is only necessary if you want to send a response to a http request.
            if(is_bool($result)){
                die(($r)?'true':'false');
            }
            else if(is_array($result)){
                die(json_encode($result));
            }
            else {
                die($result);
            }
        }
        myFunction($foo,$bar){
            echo $foo." ".$bar;
        }
    ?>
2 голосов
/ 05 декабря 2010

Вы можете поместить вызов функции в скрипт.

туРипсЫоп ();

функция myFunction () { .... }

1 голос
/ 16 апреля 2017
//Register Hooks
$hooks = ['lang','score'];


function parseHook() {
   if (isset($_GET['_h'])) {
       return $hook = explode('/', filter_var(rtrim($_GET['_h'], '/'), FILTER_SANITIZE_URL));
   } else {
       return false;
   }
}


$hook = parseHook();


if ($hook && in_array($hook[0],$hooks) && function_exists($hook[0])) {
    $callMe = $hook[0];
    unset($hook[0]);
    $params = $hook ? array_values($hook) : [];
    $callMe($params);
}

function lang($params) {
    $Lib = new Lib();
    $Lib->printWithPreTag($params);
}

function score($params) {
    $Lib = new Lib();
    $Lib->printWithPreTag($params);
}

//&_h=hookname/par1/par2/par3
0 голосов
/ 06 июля 2012

Используйте конструктор вашего класса PHP:

<?php
class YourClass {

    function __construct() {
        $functionName = myFunction;

        if (isset($_GET['functionName']) 
                && $_GET['functionName'] == $functionName)){

            myFunction();
        }
        else {
            echo "Function not found";
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...