รับตัวแปรทั้งหมดที่ส่งด้วย POST หรือไม่


89

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

ถ้าฉันใช้ GET ฉันจะได้รับสิ่งนี้:

?19=on&25=on&30=on

ฉันต้องการแทรกตัวแปรในฐานข้อมูล

ฉันจะรับตัวแปรทั้งหมดที่ส่งมาพร้อมกับ POST ได้อย่างไร ในฐานะอาร์เรย์หรือค่าที่คั่นด้วยโคม่าหรืออะไร?


คำตอบ:


167

ตัวแปร$_POSTจะถูกเติมโดยอัตโนมัติ

ลองvar_dump($_POST);ดูเนื้อหา

คุณสามารถเข้าถึงแต่ละค่าได้ดังนี้: echo $_POST["name"];

แน่นอนว่านี่ถือว่าแบบฟอร์มของคุณใช้การเข้ารหัสแบบฟอร์มทั่วไป (เช่น enctype=”multipart/form-data”

หากข้อมูลโพสต์ของคุณอยู่ในรูปแบบอื่น (เช่น JSON หรือ XML คุณสามารถดำเนินการดังนี้:

$post = file_get_contents('php://input');

และ$postจะมีข้อมูลดิบ

สมมติว่าคุณใช้$_POSTตัวแปรมาตรฐานคุณสามารถทดสอบได้ว่ามีการเลือกช่องทำเครื่องหมายดังนี้:

if(isset($_POST['myCheckbox']) && $_POST['myCheckbox'] == 'Yes')
{
     ...
}

หากคุณมีช่องทำเครื่องหมายอาร์เรย์ (เช่น

<form action="myscript.php" method="post">
  <input type="checkbox" name="myCheckbox[]" value="A" />val1<br />
  <input type="checkbox" name="myCheckbox[]" value="B" />val2<br />
  <input type="checkbox" name="myCheckbox[]" value="C" />val3<br />
  <input type="checkbox" name="myCheckbox[]" value="D" />val4<br />
  <input type="checkbox" name="myCheckbox[]" value="E" />val5
  <input type="submit" name="Submit" value="Submit" />
</form>

การใช้[ ]ในชื่อช่องทำเครื่องหมายระบุว่าสคริปต์ PHP จะเข้าถึงค่าที่เลือกเป็นอาร์เรย์ ในกรณีนี้$_POST['myCheckbox']จะไม่ส่งคืนสตริงเดียว แต่จะส่งคืนอาร์เรย์ที่ประกอบด้วยค่าทั้งหมดของช่องทำเครื่องหมายที่ถูกเลือก

ตัวอย่างเช่นถ้าผมตรวจสอบกล่องทั้งหมดที่จะเป็นอาร์เรย์ประกอบด้วย:$_POST['myCheckbox'] {A, B, C, D, E}นี่คือตัวอย่างวิธีการดึงอาร์เรย์ของค่าและแสดง:

  $myboxes = $_POST['myCheckbox'];
  if(empty($myboxes))
  {
    echo("You didn't select any boxes.");
  }
  else
  {
    $i = count($myboxes);
    echo("You selected $i box(es): <br>");
    for($j = 0; $j < $i; $j++)
    {
      echo $myboxes[$j] . "<br>";
    }
  }

2
คุณตั้งใจจะเพิ่มตัวอย่าง / ลิงค์ในตอนท้ายหรือไม่?

1
ขอบคุณจริงๆฉันได้ลองใช้เพียงแค่ print_r ($ _ POST) และมันใช้งานไม่ได้เนื่องจากใช้ GET อยู่ตลอดเวลา My bad
lisovaccaro

@ Liso22 ไร้กังวล! เกิดขึ้นกับเราทุกคน :)
Code Magician

5
$ post = file_get_contents ('php: // input'); ประหยัดเวลาของฉัน ขอบคุณ. โอ้พระเจ้า f ** ng php ...
Nedudi

1
Gratz 100!
อีก

77

คุณควรจะสามารถเข้าถึงได้จาก$_POSTตัวแปร:

foreach ($_POST as $param_name => $param_val) {
    echo "Param: $param_name; Value: $param_val<br />\n";
}

คุณตั้งใจจะเพิ่มตัวอย่าง / ลิงค์ในตอนท้ายหรือไม่?

1
สังเกตเห็นลำไส้ใหญ่ที่ส่วนท้ายของคำตอบ

นี่คือคำตอบของสิ่งที่ถูกถาม
lisandro

13

เลิกใช้แล้วและไม่ต้องการเข้าถึง superglobals โดยตรง (เนื่องจาก php 5.5 ฉันคิดว่า?)

IDE สมัยใหม่ทุกคนจะบอกคุณ:

อย่าเข้าถึง Superglobals โดยตรง ใช้ฟังก์ชันตัวกรองบางอย่าง (เช่นfilter_input)

สำหรับวิธีแก้ปัญหาของเราในการรับพารามิเตอร์คำขอทั้งหมดเราต้องใช้เมธอด filter_input_array

ในการรับพารามิเตอร์ทั้งหมดจากวิธีการป้อนข้อมูลให้ใช้สิ่งนี้:

$myGetArgs = filter_input_array(INPUT_GET);
$myPostArgs = filter_input_array(INPUT_POST);
$myServerArgs = filter_input_array(INPUT_SERVER);
$myCookieArgs = filter_input_array(INPUT_COOKIE);
...

ตอนนี้คุณสามารถใช้มันในvar_dumpหรือforeach-Loops ของคุณ

สิ่งที่ไม่ได้ผลคือการเข้าถึง $ _REQUEST Superglobal ด้วยวิธีนี้ มันส่งคืน Allways NULLและถูกต้อง

หากคุณต้องการรับพารามิเตอร์อินพุตทั้งหมดโดยใช้วิธีการต่างๆเพียงแค่รวมเข้าด้วยกันตามวิธีต่อไปนี้:

function askForPostAndGetParams(){
    return array_merge ( 
        filter_input_array(INPUT_POST), 
        filter_input_array(INPUT_GET) 
    );
}

แก้ไข: เวอร์ชันขยายของวิธีนี้ (ใช้ได้เช่นกันเมื่อไม่ได้ตั้งค่าวิธีการร้องขออย่างใดอย่างหนึ่ง):

function askForRequestedArguments(){
    $getArray = ($tmp = filter_input_array(INPUT_GET)) ? $tmp : Array();
    $postArray = ($tmp = filter_input_array(INPUT_POST)) ? $tmp : Array();
    $allRequests = array_merge($getArray, $postArray);
    return $allRequests;
}

ฉันได้รับข้อผิดพลาดร้ายแรงเมื่อพยายามใช้คำแนะนำของคุณ "$ postArray = ($ tmp = filter_input_array (INPUT_POST))? $ tmp: Array ();". FATAL ERROR นิพจน์คงที่มีการดำเนินการที่ไม่ถูกต้องในบรรทัดที่ 5
luckyguy73

@AshtonMorgan ฉันทดสอบแล้ว (คัดลอกวาง) และใช้งานได้ดี คุณใช้ PHP Version อะไร?
mtizziani

9

บางอย่างเช่น$_POSTอาร์เรย์?

คุณสามารถใช้http_build_query($_POST)เพื่อดึงมันกลับมาเป็นvar=xxx&var2=yyyสตริงอีกครั้ง หรือเพียงprint_r($_POST)เพื่อดูว่ามีอะไรอยู่


6

ทำไมไม่ทำแบบนี้มันง่ายมาก:

extract($_POST);

4
ความคิดแย่มากอย่างที่เป็นอยู่ หลุมรักษาความปลอดภัยขนาดยักษ์
ไม่มีใคร

2
รหัสนี้ตอบคำถามของเขาได้อย่างสมบูรณ์ "ฉันจะรับตัวแปรทั้งหมดที่ส่งมาพร้อมกับ POST ได้อย่างไร" ในขณะที่คำตอบอื่น ๆ ไม่มี และคำตอบที่ดีที่สุดจะถูกโหวตลงไป ความปลอดภัยอาจไม่ใช่ปัญหาสำหรับโครงการของเขา คุณกำลังบอกว่าผู้ที่ทำ php ทำผิดพลาดโดยการคิดค้นฟังก์ชันนี้ขึ้นมานั้นไม่ควรใช้?
bubbahut

2
@bubbahut เป๊ะ. ไม่มีใครต้องการตัวแปรโพสต์ทั้งหมดสำหรับโค้ดการผลิต
cowboysaif

5

การใช้นี้คุณสามารถรับตัวแปรโพสต์ทั้งหมด

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