สมมติว่าเรามักจะเข้าถึงผ่าน
http://localhost/index.php?a=1&b=2&c=3
เราจะดำเนินการเดียวกันในพรอมต์คำสั่ง linux ได้อย่างไร
php -e index.php
แล้วการส่งตัวแปร $ _GET ล่ะ? อาจจะคล้าย ๆ php -e index.php --a 1 --b 2 --c 3? สงสัยจะได้ผล
ขอบคุณ!
สมมติว่าเรามักจะเข้าถึงผ่าน
http://localhost/index.php?a=1&b=2&c=3
เราจะดำเนินการเดียวกันในพรอมต์คำสั่ง linux ได้อย่างไร
php -e index.php
แล้วการส่งตัวแปร $ _GET ล่ะ? อาจจะคล้าย ๆ php -e index.php --a 1 --b 2 --c 3? สงสัยจะได้ผล
ขอบคุณ!
คำตอบ:
โดยทั่วไปสำหรับการส่งอาร์กิวเมนต์ไปยังสคริปต์บรรทัดคำสั่งคุณจะใช้argv
ตัวแปรส่วนกลางหรือgetopt :
// bash command:
// php -e myscript.php hello
echo $argv[1]; // prints hello
// bash command:
// php -e myscript.php -f=world
$opts = getopt('f:');
echo $opts['f']; // prints world
$ _GET อ้างถึงพารามิเตอร์เมธอด HTTP GET ซึ่งไม่มีในบรรทัดคำสั่งเนื่องจากต้องใช้เว็บเซิร์ฟเวอร์ในการเติมข้อมูล
หากคุณต้องการเติม $ _GET จริงๆคุณสามารถทำได้:
// bash command:
// export QUERY_STRING="var=value&arg=value" ; php -e myscript.php
parse_str($_SERVER['QUERY_STRING'], $_GET);
print_r($_GET);
/* outputs:
Array(
[var] => value
[arg] => value
)
*/
คุณยังสามารถเรียกใช้สคริปต์ที่กำหนดเติมข้อมูล$_GET
จากบรรทัดคำสั่งโดยไม่ต้องแก้ไขสคริปต์ดังกล่าว:
export QUERY_STRING="var=value&arg=value" ; \
php -e -r 'parse_str($_SERVER["QUERY_STRING"], $_GET); include "index.php";'
โปรดทราบว่าคุณสามารถทำได้เช่นเดียวกันกับ$_POST
และ$_COOKIE
เช่นกัน
getopt()
แต่สิ่งนี้จะบอก PHP ว่าคุณต้องการอาร์กิวเมนต์ f
ไม่ใช่ตัวเลือก f
(ซึ่งจะระบุลบด้วยเครื่องหมายจุดคู่) มันก็แค่ไวยากรณ์
จากคำตอบนี้บน ServerFault :
ใช้php-cgi
ไบนารีแทน just php
และส่งผ่านอาร์กิวเมนต์ในบรรทัดคำสั่งเช่นนี้:
php-cgi -f index.php left=1058 right=1067 class=A language=English
ซึ่งทำให้สิ่งนี้อยู่ใน$_GET
:
Array
(
[left] => 1058
[right] => 1067
[class] => A
[language] => English
)
คุณยังสามารถตั้งค่าตัวแปรสภาพแวดล้อมที่เว็บเซิร์ฟเวอร์กำหนดได้เช่นนี้:
REQUEST_URI='/index.php' SCRIPT_NAME='/index.php' php-cgi -f index.php left=1058 right=1067 class=A language=English
<b>Notice</b>: Undefined index: testing in <b> ... </b><br />
php-cgi -f /var/www/vhosts/example.com/public_html/index.php action=DoSomething
Works Good ..
ฉันไม่มี php-cgi ไบนารีบน Ubuntu ดังนั้นฉันจึงทำสิ่งนี้:
% alias php-cgi = "php -r '"' parse_str (ระเบิด ("&", array_slice ($ argv, 2)), $ _GET); รวม ($ argv [1]); '"' -" % php-cgi test1.php foo = 123 <html> คุณตั้งค่า foo เป็น 123 </ html> % cat test1.php <html> คุณตั้งค่า foo เป็น <? php print $ _GET ['foo']?> </html>
บางครั้งคุณไม่มีตัวเลือกในการแก้ไขไฟล์ php เพื่อตั้งค่า $ _GET เป็นพารามิเตอร์ที่ส่งผ่านและบางครั้งคุณไม่สามารถหรือไม่ต้องการติดตั้ง php-cgi
ฉันพบว่านี่เป็นทางออกที่ดีที่สุดสำหรับกรณีนั้น:
php -r '$_GET["key"]="value"; require_once("script.php");'
วิธีนี้หลีกเลี่ยงการแก้ไขไฟล์ php ของคุณและให้คุณใช้คำสั่ง php ธรรมดา หากคุณติดตั้ง php-cgi แล้วให้ใช้สิ่งนั้น แต่นี่เป็นสิ่งที่ดีที่สุดถัดไป คิดว่าตัวเลือกนี้ควรค่าแก่การกล่าวถึง
-r หมายถึงรันโค้ด php ในสตริงต่อไปนี้ คุณตั้งค่า $ _GET ด้วยตนเองที่นั่นจากนั้นอ้างอิงไฟล์ที่คุณต้องการเรียกใช้
เป็นที่น่าสังเกตว่าคุณควรเรียกใช้สิ่งนี้ในโฟลเดอร์ที่ถูกต้องซึ่งมักจะไม่ใช่โฟลเดอร์ที่มีไฟล์ php เสมอไปคำสั่งที่ต้องการจะใช้ตำแหน่งของคำสั่งของคุณเพื่อแก้ไข URL ที่เกี่ยวข้องไม่ใช่ตำแหน่งของไฟล์
php file_name.php var1 var2 varN
จากนั้นตั้งค่า$_GET
ตัวแปรของคุณในบรรทัดแรกของคุณใน PHP แม้ว่านี่จะไม่ใช่วิธีที่ต้องการในการตั้งค่า$_GET
ตัวแปรและคุณอาจประสบปัญหาขึ้นอยู่กับสิ่งที่คุณทำในภายหลังกับตัวแปรนั้น
if (isset($argv[1])) {
$_GET['variable_name'] = $argv[1];
}
ตัวแปรที่คุณเรียกใช้สคริปต์ด้วยจะสามารถเข้าถึงได้จาก$argv
อาร์เรย์ในแอป PHP ของคุณ รายการแรกจะเป็นชื่อของสคริปต์ที่มาจากดังนั้นคุณอาจต้องการarray_shift($argv)
วางรายการแรกนั้นหากคุณต้องการประมวลผลตัวแปรจำนวนมาก หรือเพียงแค่โหลดลงในตัวแปรท้องถิ่น
ลองใช้WGET
:
WGET 'http://localhost/index.php?a=1&b=2&c=3'
$_GET
หมายถึงเว็บเซิร์ฟเวอร์ที่ทำงานอยู่
- ตัวเลือกที่ 1: php-cgi -
ใช้ 'php-cgi' แทน 'php' เพื่อเรียกใช้สคริปต์ของคุณ นี่เป็นวิธีที่ง่ายที่สุดเนื่องจากคุณไม่จำเป็นต้องแก้ไขโค้ด php ของคุณเป็นพิเศษเพื่อใช้งานได้:
php-cgi -f /my/script/file.php a=1 b=2 c=3
- ทางเลือกที่ 2: หากคุณมีเว็บเซิร์ฟเวอร์ -
หากไฟล์ php อยู่บนเว็บเซิร์ฟเวอร์คุณสามารถใช้ 'wget' ในบรรทัดคำสั่ง:
wget 'http://localhost/my/script/file.php?a=1&b=2&c=3'
หรือ:
wget -q -O - "http://localhost/my/script/file.php?a=1&b=2&c=3"
- การเข้าถึงตัวแปรใน php -
ในทั้งสองตัวเลือก 1 และ 2 คุณเข้าถึงพารามิเตอร์เหล่านี้ดังนี้:
$a = $_GET["a"];
$b = $_GET["b"];
$c = $_GET["c"];
หากคุณต้องการที่จะผ่าน$_GET
, $_REQUEST
, $_POST
หรืออะไรก็ได้ที่คุณยังสามารถใช้โหมดโต้ตอบ PHP:
php -a
จากนั้นพิมพ์:
<?php
$_GET['a']=1;
$_POST['b']=2;
include("/somefolder/some_file_path.php");
สิ่งนี้จะตั้งค่าตัวแปรที่คุณต้องการด้วยตนเองจากนั้นเรียกใช้ไฟล์ php ของคุณด้วยชุดตัวแปรเหล่านั้น
หากคุณมีความเป็นไปได้ที่จะแก้ไขสคริปต์ PHP คุณสามารถเติมอาร์เรย์ $ _GET เทียมโดยใช้รหัสต่อไปนี้ที่จุดเริ่มต้นของสคริปต์จากนั้นเรียกใช้สคริปต์ด้วยไวยากรณ์: php -f script.php name1=value1 name2=value2
// When invoking the script via CLI like "php -f script.php name1=value1 name2=value2", this code will populate $_GET variables called "name1" and "name2", so a script designed to be called by a web server will work even when called by CLI
if (php_sapi_name() == "cli") {
for ($c = 1; $c < $argc; $c++) {
$param = explode("=", $argv[$c], 2);
$_GET[$param[0]] = $param[1]; // $_GET['name1'] = 'value1'
}
}
ที่บรรทัดคำสั่งให้วางสิ่งต่อไปนี้
export QUERY_STRING="param1=abc¶m2=xyz" ;
POST_STRING="name=John&lastname=Doe" ; php -e -r
'parse_str($_SERVER["QUERY_STRING"], $_GET); parse_str($_SERVER["POST_STRING"],
$_POST); include "index.php";'
ฉันแค่ผ่านมันไปแบบนี้:
php5 script.php param1=blabla param2=yadayada
ใช้งานได้ดีอาร์เรย์ $ _GET คือ:
array(3) {
["script_php"]=>
string(0) ""
["param1"]=>
string(6) "blabla"
["param2"]=>
string(8) "yadayada"
}
php -r 'parse_str($argv[2],$_GET);include $argv[1];' index.php 'a=1&b=2'
คุณสามารถสร้างส่วนแรกเป็นนามแฝง:
alias php-get='php -r '\''parse_str($argv[2],$_GET);include $argv[1];'\'
จากนั้นใช้:
php-get some_script.php 'a=1&b=2&c=3'
หรือเพียงแค่ (ถ้าคุณมี LYNX):
lynx 'http://localhost/index.php?a=1&b=2&c=3'
php [script name] "a=1&b=2&c=3"
จะไม่เติมแต่คุณสามารถส่งผลกระทบต่อสิ่งเดียวกันโดยอ้างอิง$_SERVER['QUERY_STRING']
$_SERVER['argv'][1]