ฉันจะส่งพารามิเตอร์ไปยังสคริปต์ PHP ผ่านหน้าเว็บได้อย่างไร


139

ฉันกำลังเรียกสคริปต์ PHP ทุกครั้งที่โหลดหน้าเว็บ อย่างไรก็ตามมีพารามิเตอร์ที่สคริปต์ PHP จำเป็นต้องเรียกใช้ (ซึ่งปกติแล้วฉันจะผ่านบรรทัดคำสั่งเมื่อฉันทดสอบสคริปต์)

ฉันจะส่งผ่านข้อโต้แย้งนี้ทุกครั้งที่สคริปต์รันเมื่อโหลดหน้าเว็บได้อย่างไร


1
กรุณาโพสต์รหัสของคุณได้ไหม
SenorAmor

1
ดังนั้นคุณต้องการเรียกใช้บรรทัดคำสั่งหรือไม่ หรือสคริปต์ PHP
Christopher Pelayo

โอเคขอบคุณพวกคุณ ฉันได้คำตอบด้านล่าง: ใช้ $ GET และส่งเป็นค่าพารามิเตอร์ใน url เอง
Nick

คำตอบ:


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 superglobal:

ไปที่http://yourdomain.com/path/to/script.php?argument1=arg1&argument2=arg2

... และการเข้าถึง:

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

หากคุณต้องการให้สคริปต์ทำงานไม่ว่าคุณจะโทรจากที่ใด (บรรทัดคำสั่งหรือจากเบราว์เซอร์) คุณจะต้องการสิ่งต่อไปนี้:

แก้ไข:ตามที่ Cthulhu ชี้ให้เห็นในความคิดเห็นวิธีที่ตรงที่สุดในการทดสอบสภาพแวดล้อมที่คุณกำลังเรียกใช้คือการใช้ค่าคงที่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สตริงว่างและอาร์เรย์
Tim S.

โดยไม่ตรวจสอบจริง ๆ ฉันเชื่อว่า$_GETในความเป็นจริงไม่ได้ตั้งค่าถ้าสคริปต์ถูกเรียกในบริบทของบรรทัดคำสั่ง empty()จะทำให้มันมองหาอาร์กิวเมนต์บรรทัดคำสั่งหากสคริปต์มีการเข้าถึงจากเว็บโดยไม่ต้องสตริงแบบสอบถามจึงโยนประกาศเพิ่มเติม
Jason

$ argv [0] ไม่ใช่ arg1 จริงๆในตัวอย่างที่ 1 ของคุณมันจะเป็น "/path/to/wwwpublic/path/to/script.php" ( php.net/manual/en/reserved.variables.argv.php )
ทางการ

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.