2010-12-05 48 views
27

Si quiero ejecutar un script php, acabo de señalar al navegador www.something.com/myscript.php¿Llamar a la función PHP desde url?

Pero si quiero ejecutar una función específica dentro myscript.php, hay una manera? algo así como www.something.com/myscript.php.specificFunction

Gracias!

Respuesta

36

Una forma rápida es hacer las cosas como

something.com/myscript.php?f=your_function_name 

después en myscript.php

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

Pero por favor, por el amor de todos los gatitos, no abuse de esto.

+1

+1 Esta es la mejor manera. –

+54

No, no, no, no, no, no, no, no, no! ¡Acabas de permitir que cualquier visitante ejecute cualquier función de PHP que quiera! ¿Qué ocurre si eligen ejecutar su función 'purgeDatabase'? ¿O incluso simplemente 'phpinfo'? – VoteyDisciple

+0

Vea a continuación una alternativa basada en clases que evitaría muchas de esas preocupaciones de seguridad. – CodeJoust

0

No puede hacer esto sin agregar un código especial al archivo PHP para obtener el nombre de la función de la URL e invocarla.

1

puede poner la llamada de función en el script.

myFunction();

función myFunction() { .... }

+0

Si lo haces de esta manera, entonces el guión correría esa función cada vez que se llama. Eso podría ser un desastre, especialmente si tiene más de una función en el archivo. Creo que OP está preguntando sobre la creación de un archivo PHP con múltiples funciones y solo llamando a uno específicamente. – ShiningLight

0

Existen varias formas.

Una forma sería pasar el nombre de la función como un parámetro GET, y dependiendo de su existencia, podría llamar a la función.

23

Lo que hace su script es totalmente de usted. Las URL no pueden provocar mágicamente que Apache, PHP o cualquier otro componente del servidor adopte un cierto comportamiento, pero si usted escribe su programa de manera que se pueda ejecutar una función en particular, es ciertamente posible. Tal vez algo como:

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

A continuación, se puede visitar myScript.php?function=specificFunction

Sea extremadamente cuidadoso aquí para enumerar específicamente cada función permitida. No solo debe tomar el parámetro $_GET['function'] y ejecutar a ciegas cualquier función que indique, ya que podría presentar un riesgo de seguridad enorme.

6

Se podría hacer algo como esto (no se recomienda por razones de seguridad): www.exampe.com/myscript.php?run=getNames

a continuación:

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

Usted estaría mejor utilizando una clase php en lugar de intentar invocar una función en el espacio de nombres global porque podrían llamar a una función potencialmente peligrosa o llamar a una función que no quiere que vea el resultado:

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

Esto tampoco permitiría llamar a las funciones privadas de la clase, etc.

+0

Hola. No estoy seguro de si está familiarizado con Android, pero como llama a una url de servicio web a través de Android, no sería visible para el usuario.¿El uso de este código que ha publicado todavía causa problemas de seguridad? –

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

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

function 2... 
} 

} 
+0

Hola @robert, y bienvenido a StackOverflow. Si bien su código puede ayudar a responder la pregunta, siempre es mejor incluir alguna explicación en su respuesta. De esta manera, el OP y cualquier otra persona que lea esta respuesta podría obtener una mejor comprensión sobre cómo resolver el problema. – dhh

9

Tendrá que exponerlo de alguna manera. Esto es porque exponer todos los métodos al público, sería un riesgo para la seguridad.

ejemplo.php

<?php 

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

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

?> 

A continuación, sólo llamar:

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

Sí, soy consciente de eso. Pero a veces es útil cuando se desarrolla. No pensé en usar esto para producción. –

0

Usted podría también para la seguridad, comprobar el Referente HTTP. Y solo ejecuta funciones si el referente es el mismo dominio que el mismo. Quizás también compare/verifique otras cosas.

Pero debe haber muchas formas en que puede verificar que la solicitud proviene del mismo sitio web donde se debe ejecutar la función.

+1

Tenga en cuenta que el encabezado Referer puede falsificarse, por lo que efectivamente no ofrece seguridad. – lonesomeday

0

Utilice el constructor de la clase PHP:

<?php 
class YourClass { 

    function __construct() { 
     $functionName = myFunction; 

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

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

Esto no comienza a menos que construyas una instancia de él. – sics

7

prueba este

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

y las URLs pueden ser de la siguiente manera
http://domain.com/url.php/func1
http://domain.com/url.php/func2/arg1/arg2

4

Aquí tienes. Este es realmente simple. Llama solo funciones específicas y funciona por defecto.

<?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

en mi humilde opinión, esta es la mejor manera de hacerlo. – ShiningLight

0

Estoy usando esto en mi sitio web. Para usar esto simplemente formatea tu URL como esta www.something.com/myscript.php?function=myFunction&arg=foo&otherarg=bar No importa cómo llames a los argumentos en la url y puedes tener tantos argumentos como quieras.

<?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 
Cuestiones relacionadas