2010-12-05 4 views
27

Si je veux exécuter un script php, je signale que le navigateur www.something.com/myscript.phpAppelez la fonction PHP de l'URL?

Mais si je veux exécuter une fonction spécifique à l'intérieur myscript.php, est-il un moyen? Quelque chose comme www.something.com/myscript.php.specificFunction

Merci!

Répondre

36

Un moyen rapide est de faire des choses comme

something.com/myscript.php?f=your_function_name 

puis dans myscript.php

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

Mais s'il vous plaît, pour l'amour de tous les chatons, n'en abusez pas.

+1

+1 C'est le meilleur moyen. –

+54

Non, non, non, non, non, non, non, non, non! Vous avez juste permis à n'importe quel visiteur d'exécuter n'importe quelle fonction de PHP qu'ils veulent! Et s'ils choisissent d'exécuter votre fonction 'purgeDatabase'? Ou même juste 'phpinfo'? – VoteyDisciple

+0

Voir ci-dessous pour une alternative basée sur la classe qui permettrait d'éviter un grand nombre de ces problèmes de sécurité. – CodeJoust

0

Vous ne pouvez pas faire cela sans ajouter de code spécial au fichier PHP lui-même pour récupérer le nom de la fonction de l'URL et l'invoquer.

1

vous pouvez mettre l'appel de fonction dans le script.

myFunction();

function myFunction() { .... }

+0

Si vous le faites de cette façon, le script courrait cette fonction à chaque fois qu'il a été appelé. Cela pourrait être un gâchis, surtout si vous avez plus d'une fonction dans le fichier. Je pense que le PO demande à propos de créer un fichier PHP avec plusieurs fonctions, et en appelant seulement un spécifiquement. – ShiningLight

0

Il existe plusieurs façons. Une façon serait de passer le nom de la fonction comme un paramètre GET, et en fonction de son existence, vous pouvez appeler la fonction.

23

Ce que fait votre script dépend entièrement de vous. Les URL ne peuvent pas provoquer magiquement Apache, PHP ou tout autre composant serveur à adopter un certain comportement, mais si vous écrivez votre programme de telle sorte qu'une fonction particulière puisse être exécutée, c'est certainement possible. Peut-être quelque chose comme:

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

Ensuite, vous pouvez visiter myScript.php?function=specificFunction

Soyez extrêmement prudent ici pour liste spécifiquement chaque fonction admissible. Vous ne devez pas simplement prendre le paramètre $_GET['function'] et exécuter aveuglément n'importe quelle fonction, car cela pourrait présenter un énorme risque de sécurité.

6

Vous pourriez faire quelque chose comme ça (non recommandé pour des raisons de sécurité): www.exampe.com/myscript.php?run=getNames

alors:

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

Vous seriez mieux utiliser une classe PHP au lieu d'essayer d'appeler une fonction sur l'espace de noms global car ils pourraient appeler une fonction potentiellement dangereuse ou appeler une fonction dont vous ne voulez pas qu'ils voient le résultat:

<?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'; 
} 

Cela ne permettrait pas non plus d'appeler les fonctions privées de la classe, etc.

+0

Salut. Je ne sais pas si vous êtes familier avec Android, mais comme vous appelez une url webservice via Android, il ne serait pas visible pour l'utilisateur.Est-ce que l'utilisation de ce code que vous avez publié pose toujours des problèmes de sécurité? –

0
if (isset($GET[param_name])){ 

    if($GET[param_name] === value) 
    { 
     function 1... 
    } else if 
{ 

function 2... 
} 

} 
+0

Bonjour @robert, et bienvenue dans StackOverflow. Bien que votre code puisse aider à répondre à la question, il est toujours préférable d'inclure des explications dans votre réponse. De cette façon, le PO et quiconque lisant cette réponse pourrait mieux comprendre comment résoudre le problème. – dhh

9

Vous devrez l'exposer d'une certaine manière. C'est parce que exposer toutes les méthodes publiques, serait un risque de sécurité.

example.php

<?php 

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

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

?> 

Ensuite il suffit d'appeler:

http://www.example.com/Example.php?calculate-length&value=My%20example 
+0

Oui, je suis au courant de cela. Mais parfois est utile lors du développement. Je n'ai pas pensé à l'utiliser pour la production. –

0

Vous pouvez également pour la sécurité, vérifiez le Référent HTTP. Et seulement exécuter des fonctions si le référant est le même domaine que lui-même. Peut-être aussi comparer/vérifier d'autres choses.

Mais il devrait y avoir plusieurs façons de vérifier que la requête provient du même site web où la fonction doit être exécutée.

+1

Notez que l'en-tête Referer peut être falsifié, de sorte qu'il ne donne aucune sécurité. – lonesomeday

0

Utilisez le constructeur de votre classe PHP:

<?php 
class YourClass { 

    function __construct() { 
     $functionName = myFunction; 

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

      myFunction(); 
     } 
     else { 
      echo "Function not found"; 
     } 
    } 
} 
+0

Cela ne démarre que si vous en construisez une instance. – sics

7

Essayez celui

$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]; 
} 

et les urls peut être comme ci-dessous
http://domain.com/url.php/func1
http://domain.com/url.php/func2/arg1/arg2

4

Ici vous allez. Celui-ci est vraiment simple. Il n'appelle que des fonctions spécifiques et fait fonction par défaut.

<?php 

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

switch($linkchoice){ 

case 's' : 
    firstfunc(); 
    break; 

case 'second' : 
    secondfunc(); 
    break; 

default : 
    echo 'no function'; 

} 

?> 
+0

IMHO, c'est la meilleure façon de le faire. – ShiningLight

0

Je l'utilise sur mon site web. Pour l'utiliser il suffit de formater votre URL comme ceci www.something.com/myscript.php?function=myFunction&arg=foo&otherarg=bar Peu importe ce que vous appelez les args dans l'URL et vous pouvez avoir autant d'arguments que vous le souhaitez.

<?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; 
     } 
    ?> 
0
//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 
Questions connexes