Как передать параметры в сценарий PHP через веб-страницу?

139

Я вызываю PHP-скрипт всякий раз, когда загружается веб-страница. Однако есть параметр, который необходимо запустить сценарию PHP (который я обычно передаю через командную строку при тестировании сценария).

Как я могу передавать этот аргумент каждый раз, когда скрипт запускается при загрузке страницы?

Ник
источник
1
Вы можете опубликовать свой код, пожалуйста?
SenorAmor
1
так вы хотите запустить командную строку? или скрипт php?
Кристофер Пелайо
Хорошо, спасибо, ребята. Я получил ответы ниже: используйте $ GET и передайте его как значение параметра в самом URL-адресе.
Ник

Ответы:

235

Предположительно, вы передаете аргументы в командной строке следующим образом:

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

... а затем доступ к ним в скрипте таким образом:

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

При передаче аргументов через HTTP (доступ к сценарию через Интернет) вам нужно использовать строку запроса и обращаться к ним через суперглобальный $ _GET:

Перейдите на http://yourdomain.com/path/to/script.php?argument1=arg1&argument2=arg2

... и доступ:

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

Если вы хотите, чтобы сценарий запускался независимо от того, откуда вы его вызываете (из командной строки или из браузера), вам понадобится что-то вроде следующего:

EDIT: как указал Ктулху в комментариях, самый прямой способ проверить, в какой среде вы выполняете, - использовать константу PHP_SAPI . Я обновил код соответственно:

<?php
if (PHP_SAPI === 'cli') {
    $argument1 = $argv[1];
    $argument2 = $argv[2];
}
else {
    $argument1 = $_GET['argument1'];
    $argument2 = $_GET['argument2'];
}
?>
Джейсон
источник
Я бы использовал empty($_GET). $_GET- это предопределенное значение, поэтому я почти уверен, что оно всегда установлено, но пусто, если не заданы параметры GET. empty()возвращает falseпустые строки и массивы.
Тим С.
Фактически, не проверяя, я считаю, что $_GETна самом деле это не установлено, если сценарий вызывается в контексте командной строки. empty()приведет к тому, что он будет искать аргументы командной строки, если к сценарию осуществляется доступ из Интернета без строки запроса, тем самым генерируя больше уведомлений.
Джейсон
$ argv [0] на самом деле не является arg1 в вашем 1-м примере, это будет "/path/to/wwwpublic/path/to/script.php". ( php.net/manual/en/reserved.variables.argv.php )
CasualT
3
Я понимаю, что опаздываю на вечеринку, но правильный способ проверить это PHP_SAPI === 'cli'.
Ктулху
1
@emanueledelgrande Я не совсем уверен, что понимаю то, о чем вы спрашиваете, но я попробую. .htaccessявляется файлом Apache - Apache обрабатывает входящие запросы с помощью директив, .htaccessа затем вызывает PHP для создания ответа на запрос. Итак, если вы находитесь в командной строке, .htaccessбудут полностью проигнорированы. Если вы обращаетесь к сценарию через Интернет и хотите добавить новые аргументы строки запроса после получения запроса, обычно это делается с помощью mod_rewrite. Если это недостаточно ответ на ваш вопрос, я предлагаю вам опубликовать новый вопрос.
Джейсон
17
$argv[0]; // the script name
$argv[1]; // the first parameter
$argv[2]; // the second parameter

Если вы хотите, чтобы весь скрипт запускался независимо от того, откуда вы его вызываете (из командной строки или из браузера), вам понадобится что-то вроде следующего:

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

Для вызова из командной строки chmod 755 /var/www/webroot/index.phpи использования

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

Чтобы позвонить из браузера, используйте

http://www.mydomain.com/index.php?argument1=arg1&argument2=arg2
Ап. Мутху
источник