Як передати параметри в PHP-скрипт через веб-сторінку?


139

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

Як я можу передавати цей аргумент щоразу, коли сценарій запускається під час завантаження сторінки?


1
Чи можете ви опублікувати свій код, будь ласка?
SenorAmor

1
значить, ви хочете запустити командний рядок? чи сценарій php?
Крістофер Пелайо

Гаразд, дякую, хлопці Я отримав відповіді нижче: використовуйте $ GET і передайте його як значення параметра в самій URL-адресі.
Нік

Відповіді:


232

Імовірно, ви передаєте аргументи в командному рядку наступним чином:

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 у вашому першому прикладі, це буде "/path/to/wwwpublic/path/to/script.php". ( php.net/manual/en/reserved.variables.argv.php )
CasualT

3
Я розумію, що я спізнююсь на вечірку, але правильний спосіб перевірити це PHP_SAPI === 'cli'.
Cthulhu

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.