¿Cómo paso parámetros a un script PHP a través de una página web?

139

Estoy llamando a un script PHP cada vez que se carga una página web. Sin embargo, hay un parámetro que debe ejecutar el script PHP (que normalmente paso por la línea de comando cuando estoy probando el script).

¿Cómo puedo pasar este argumento cada vez que se ejecuta el script cuando se carga la página?

Mella
fuente
1
¿Puedes publicar tu código, por favor?
SenorAmor
1
entonces quieres ejecutar una línea de comando? o un script PHP?
Christopher Pelayo
De acuerdo, gracias chicos. Obtuve las respuestas a continuación: use $ GET y páselo como un valor de parámetro en la propia URL.
Nick

Respuestas:

232

Presumiblemente, está pasando los argumentos en la línea de comando de la siguiente manera:

php /path/to/wwwpublic/path/to/script.php arg1 arg2

... y luego acceder a ellos en el script de esta manera:

<?php
// $argv[0] is '/path/to/wwwpublic/path/to/script.php'
$argument1 = $argv[1];
$argument2 = $argv[2];
?>

Lo que debe hacer al pasar argumentos a través de HTTP (acceder al script a través de la web) es usar la cadena de consulta y acceder a ellos a través de la superglobal $ _GET:

Ir http://yourdomain.com/path/to/script.php?argument1=arg1&argument2=arg2

... y acceso:

<?php
$argument1 = $_GET['argument1'];
$argument2 = $_GET['argument2'];
?>

Si desea que el script se ejecute independientemente de desde dónde lo llame (línea de comando o desde el navegador) querrá algo como lo siguiente:

EDITAR: como señaló Cthulhu en los comentarios, la forma más directa de probar en qué entorno está ejecutando es usar la constante PHP_SAPI . He actualizado el código en consecuencia:

<?php
if (PHP_SAPI === 'cli') {
    $argument1 = $argv[1];
    $argument2 = $argv[2];
}
else {
    $argument1 = $_GET['argument1'];
    $argument2 = $_GET['argument2'];
}
?>
Jason
fuente
Me gustaría utilizar empty($_GET). $_GETes un valor predefinido, así que estoy bastante seguro de que siempre se establece, pero está vacío si no hay parámetros GET establecidos. empty()devuelve falsecadenas y matrices vacías.
Tim S.
Sin verificarlo realmente, creo que $_GETde hecho no se establece si el script se llama en un contexto de línea de comando. empty()provocaría que busque argumentos de línea de comandos si se accede al script desde la web sin una cadena de consulta, lo que arroja más avisos.
Jason
$ argv [0] no es realmente arg1 en su primer ejemplo, sería "/path/to/wwwpublic/path/to/script.php". ( php.net/manual/en/reserved.variables.argv.php )
CasualT
3
Me doy cuenta de que llego tarde a la fiesta, pero la forma correcta de comprobarlo es PHP_SAPI === 'cli'.
Cthulhu
1
@emanueledelgrande No estoy completamente seguro de seguir lo que me preguntas, pero lo intentaré. .htaccesses un archivo Apache: Apache procesa las solicitudes entrantes con las directivas .htaccessy luego invoca PHP para generar la respuesta a la solicitud. Entonces, si estás en la línea de comando, .htaccessserá completamente ignorado. Si está accediendo a una secuencia de comandos a través de la web y desea agregar nuevos argumentos de cadena de consulta después de recibir la solicitud, eso generalmente se hace con mod_rewrite. Si eso no responde suficientemente a su pregunta, le sugiero que publique una nueva pregunta.
Jason
17
$argv[0]; // the script name
$argv[1]; // the first parameter
$argv[2]; // the second parameter

Si desea que se ejecute todo el script, independientemente de desde dónde lo llame (línea de comando o desde el navegador), querrá algo como lo siguiente:

<?php
if ($_GET) {
    $argument1 = $_GET['argument1'];
    $argument2 = $_GET['argument2'];
} else {
    $argument1 = $argv[1];
    $argument2 = $argv[2];
}
?>

Para llamar desde la línea de comando chmod 755 /var/www/webroot/index.phpy usar

/usr/bin/php /var/www/webroot/index.php arg1 arg2

Para llamar desde el navegador, use

http://www.mydomain.com/index.php?argument1=arg1&argument2=arg2
Ap. Muthu
fuente