Làm cách nào để truyền tham số vào tập lệnh PHP thông qua trang web?


139

Tôi đang gọi một kịch bản PHP bất cứ khi nào một trang web tải. Tuy nhiên, có một tham số mà tập lệnh PHP cần chạy (mà tôi thường chuyển qua dòng lệnh khi tôi đang kiểm tra tập lệnh).

Làm cách nào tôi có thể vượt qua đối số này mỗi khi tập lệnh được chạy khi tải trang?


1
Bạn có thể gửi mã của bạn, xin vui lòng?
SenorAmor

1
Vì vậy, bạn muốn chạy một dòng lệnh? hoặc một tập lệnh php?
Christopher Pelayo

Được rồi, cảm ơn các bạn. Tôi đã nhận được câu trả lời dưới đây: sử dụng $ GET và chuyển nó dưới dạng giá trị tham số trong chính url.
Nick

Câu trả lời:


232

Có lẽ bạn đang truyền các đối số trên dòng lệnh như sau:

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

... và sau đó truy cập chúng trong tập lệnh:

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

Những gì bạn cần làm khi chuyển các đối số qua HTTP (truy cập tập lệnh qua web) là sử dụng chuỗi truy vấn và truy cập chúng thông qua siêu lớp $ _GET:

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

... và truy cập:

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

Nếu bạn muốn tập lệnh chạy bất kể bạn gọi nó từ đâu (dòng lệnh hoặc từ trình duyệt), bạn sẽ muốn một cái gì đó như sau:

EDIT: như được chỉ ra bởi Cthulhu trong các bình luận, cách trực tiếp nhất để kiểm tra môi trường nào bạn đang thực thi là sử dụng hằng số PHP_SAPI . Tôi đã cập nhật mã phù hợp:

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

Tôi sẽ sử dụng empty($_GET). $_GETlà một giá trị được xác định trước, vì vậy tôi khá chắc chắn rằng nó luôn được đặt, nhưng trống nếu không có tham số GET được đặt. empty()trả về falsecho chuỗi rỗng và mảng.
Tim S.

Không thực sự kiểm tra, tôi thực sự tin rằng $_GETtrên thực tế không được đặt nếu tập lệnh được gọi trong ngữ cảnh dòng lệnh. empty()sẽ khiến nó tìm kiếm các đối số dòng lệnh nếu tập lệnh được truy cập từ web mà không có chuỗi truy vấn, do đó sẽ đưa ra nhiều thông báo hơn.
Jason

$ argv [0] không thực sự là arg1 trong ví dụ đầu tiên của bạn, nó sẽ là "/path/to/wwwpublic/path/to/script.php". ( Php.net/manual/en/reserved.variables.argv.php )
CasualT

3
Tôi nhận ra rằng tôi đến trễ bữa tiệc, nhưng cách thích hợp để kiểm tra là PHP_SAPI === 'cli'.
Cthulhu

1
@emanueledelgrande Tôi không hoàn toàn chắc chắn tôi làm theo những gì bạn hỏi, nhưng tôi sẽ thử. .htaccesslà một tệp Apache - Apache xử lý các yêu cầu đến với các lệnh trong .htaccessvà sau đó gọi PHP để xây dựng phản hồi cho yêu cầu. Vì vậy, nếu bạn đang ở trong dòng lệnh, .htaccesssẽ hoàn toàn bị bỏ qua. Nếu bạn đang truy cập tập lệnh qua web và bạn muốn thêm đối số chuỗi truy vấn mới sau khi nhận được yêu cầu, điều đó thường được thực hiện với mod_rewrite. Nếu điều đó không đủ trả lời câu hỏi của bạn, tôi khuyên bạn nên đăng một câu hỏi hoàn toàn mới.
Jason

17
$argv[0]; // the script name
$argv[1]; // the first parameter
$argv[2]; // the second parameter

Nếu bạn muốn tất cả các tập lệnh chạy bất kể bạn gọi nó từ đâu (dòng lệnh hoặc từ trình duyệt), bạn sẽ muốn một cái gì đó như sau:

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

Để gọi từ dòng lệnh chmod 755 /var/www/webroot/index.phpvà sử dụng

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

Để gọi từ trình duyệt, sử dụng

http://www.mydomain.com/index.php?argument1=arg1&argument2=arg2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.