Ответ 1
Один быстрый способ - делать что-то вроде
something.com/myscript.php?f=your_function_name
затем в myscript.php
if(function_exists($_GET['f'])) {
$_GET['f']();
}
Но, пожалуйста, ради любви ко всем котятам, не злоупотребляйте этим.
Если я хочу выполнить php script, я просто указываю браузеру на www.something.com/myscript.php
Но если я хочу выполнить определенную функцию внутри myscript.php
, есть ли способ? что-то вроде www.something.com/myscript.php.specificFunction
Спасибо!
Один быстрый способ - делать что-то вроде
something.com/myscript.php?f=your_function_name
затем в myscript.php
if(function_exists($_GET['f'])) {
$_GET['f']();
}
Но, пожалуйста, ради любви ко всем котятам, не злоупотребляйте этим.
То, что делает ваш script, полностью зависит от вас. URL-адреса не могут волшебным образом привести к тому, что Apache, PHP или любой другой серверный компонент предпримут определенное поведение, но если вы напишете свою программу таким образом, что конкретная функция может быть выполнена, это, безусловно, возможно. Возможно, что-то вроде:
switch($_GET['function']) {
case 'specificFunction':
specificFunction();
}
Затем вы можете посетить myScript.php?function=specificFunction
Будьте предельно осторожны, чтобы указать каждую допустимую функцию. Вы не должны просто принимать параметр $_GET['function']
и слепо выполнять любую функцию, о которой он говорит, поскольку это может представлять огромный риск для безопасности.
Вам придется разоблачить его каким-то образом. Это связано с тем, что публикация всех методов является угрозой безопасности.
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
Попробуйте этот
$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
Вы можете сделать что-то вроде этого (не рекомендуется по соображениям безопасности): 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';
}
Это также не позволит вызывать частные функции класса и т.д.
Здесь вы идете. Это очень просто. Он вызывает только определенные функции и выполняет функцию по умолчанию.
<?php
if (isset($_GET['p'])) $linkchoice=$_GET['p'];
else $linkchoice='';
switch($linkchoice){
case 's' :
firstfunc();
break;
case 'second' :
secondfunc();
break;
default :
echo 'no function';
}
?>
вы можете поместить вызов функции в script.
туРипсЫоп();
функция myFunction() { .... }
Вы не можете сделать это без добавления специального кода в файл PHP, чтобы захватить имя функции из URL и вызвать его.
Существует несколько способов.
Один из способов - передать имя функции в качестве параметра GET, и в зависимости от ее существования вы можете вызвать функцию.
if (isset($GET[param_name])){
if($GET[param_name] === value)
{
function 1...
} else if
{
function 2...
}
}
Вы также можете для безопасности, проверьте HTTP-ссылку. И выполняйте только функции, если реферер является тем же самым доменом, что и сам. Возможно, также сравните/проверьте достоверные другие вещи.
Но должно быть много способов проверить, что запрос поступает с того же веб-сайта, если функция должна быть выполнена.
Используйте конструктор вашего класса PHP:
<?php
class YourClass {
function __construct() {
$functionName = myFunction;
if (isset($_GET['functionName'])
&& $_GET['functionName'] == $functionName)){
myFunction();
}
else {
echo "Function not found";
}
}
}
Я использую это на своем веб-сайте. Чтобы использовать это, просто отформатируйте свой URL-адрес следующим образом: www.something.com/myscript.php?function=myFunction&arg=foo&otherarg=bar
Не имеет значения, что вы называете args в 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;
}
?>
//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