Como passo parâmetros em um script PHP por meio de uma página da web?

139

Estou chamando um script PHP sempre que uma página da web é carregada. No entanto, há um parâmetro que o script PHP precisa executar (o qual eu normalmente passo pela linha de comando quando estou testando o script).

Como posso passar esse argumento toda vez que o script é executado quando a página é carregada?

usuario
fonte
1
Você pode postar seu código, por favor?
precisa saber é o seguinte
1
então você quer executar uma linha de comando? ou um script php?
9788 Christopher Playo
Ok, obrigado pessoal. Eu recebi as respostas abaixo: use $ GET e passe-o como um valor de parâmetro no próprio URL.
Nick

Respostas:

232

Presumivelmente, você está passando os argumentos na linha de comando da seguinte maneira:

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

... e, em seguida, acessando-os no script assim:

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

O que você precisa fazer ao passar argumentos por HTTP (acessando o script pela Web) é usar a cadeia de consulta e acessá-los através da superglobal $ _GET:

Vá para http://seudominio.com/path/to/script.php?argument1=arg1&argument2=arg2

... e acesse:

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

Se você deseja que o script seja executado, independentemente de onde você o chama (linha de comando ou do navegador), é recomendável algo como o seguinte:

EDIT: como apontado por Cthulhu nos comentários, a maneira mais direta de testar em qual ambiente você está executando é usar a constante PHP_SAPI . Atualizei o código de acordo:

<?php
if (PHP_SAPI === 'cli') {
    $argument1 = $argv[1];
    $argument2 = $argv[2];
}
else {
    $argument1 = $_GET['argument1'];
    $argument2 = $_GET['argument2'];
}
?>
Jason
fonte
Eu usaria empty($_GET). $_GETé um valor predefinido, por isso tenho certeza de que está sempre definido, mas vazio se não houver parâmetros GET definidos. empty()retorna falsepara cadeias e matrizes vazias.
Tim S.
Sem realmente verificar, acredito que, $_GETna verdade, não está definido se o script for chamado em um contexto de linha de comando. empty()faria com que ele procurasse argumentos de linha de comando se o script fosse acessado da Web sem uma string de consulta, lançando mais avisos.
Jason
$ argv [0] não é realmente arg1 no seu primeiro exemplo, seria "/path/to/wwwpublic/path/to/script.php". ( php.net/manual/en/reserved.variables.argv.php )
CasualT
3
Sei que estou atrasado para a festa, mas a maneira correta de verificar é PHP_SAPI === 'cli'.
Cthulhu
1
@emanueledelgrande Não tenho muita certeza de seguir o que você está pedindo, mas vou tentar. .htaccessé um arquivo Apache - o Apache processa solicitações recebidas com as diretivas .htaccessincluídas e, em seguida, chama o PHP para criar a resposta à solicitação. Portanto, se você estiver na linha de comando, .htaccessserá completamente ignorado. Se você está acessando um script pela Web e deseja adicionar novos argumentos da sequência de consultas após receber a solicitação, isso normalmente é feito mod_rewrite. Se isso não responder suficientemente à sua pergunta, sugiro que você publique uma nova pergunta.
23417 Jason
17
$argv[0]; // the script name
$argv[1]; // the first parameter
$argv[2]; // the second parameter

Se você deseja que todo o script seja executado, independentemente de onde você o chama (linha de comando ou do navegador), você deseja algo como o seguinte:

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

Para chamar da linha de comando chmod 755 /var/www/webroot/index.phpe usar

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

Para ligar a partir do navegador, use

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