php $ _POST อาร์เรย์ว่างเปล่าเมื่อส่งแบบฟอร์ม


100

ฉันมี CMS แบบกำหนดเองที่ฉันสร้างขึ้นซึ่งทำงานได้อย่างสมบูรณ์บนกล่อง dev ของฉัน (Ubuntu / PHP5 + / MySQL5 +)

ฉันเพิ่งย้ายไปที่กล่องการผลิตสำหรับลูกค้าของฉันและตอนนี้การส่งแบบฟอร์มทั้งหมดแสดงเป็นอาร์เรย์ $ _POST ว่างเปล่า

ฉันพบเคล็ดลับในการตรวจสอบว่ามีการส่งผ่านข้อมูลจริงโดยใช้file_get_contents('php://input');และข้อมูลปรากฏขึ้นที่นั่น - อาร์เรย์$_POST/ $_REQUESTว่างเปล่าเสมอ

ฉันยังตรวจสอบแล้วว่าส่วนหัวประเภทเนื้อหานั้นถูกต้องเช่นกันผ่าน firebug ( application/x-www-form-urlencoded; charset=utf-8)

ปัญหานี้เกิดขึ้นไม่ว่าจะส่งแบบฟอร์มผ่าน AJAX หรือส่งแบบฟอร์มปกติ

ความช่วยเหลือใด ๆ ที่ได้รับการชื่นชมอย่างมาก!

php  arrays  forms  post 

ตรวจสอบ post_max_size: ต้องตั้งค่าเป็น 8M ไม่ใช่ 8MB ในกรณีล่าสุดคุณจะไม่เห็นข้อผิดพลาดใด ๆ แต่ขนาด $ _POST จะตั้งค่าเป็น 0
Sergei Karpov

1
ระวัง: Apache ทำการเปลี่ยนเส้นทาง 301 หากไม่มีเครื่องหมายทับ
Leandro

คำตอบ:


190

ฉันรู้ว่าคำถามนี้เกี่ยวกับ POST ผ่านแบบฟอร์ม แต่มาที่นี่เพื่อค้นหาคำตอบสำหรับปัญหาที่คล้ายกันเมื่อโพสต์ด้วยเนื้อหาประเภท JSON พบคำตอบและต้องการแบ่งปันเพราะต้องเสียเวลามาก

เมื่อใช้ประเภทเนื้อหา JSON อาร์เรย์ $ _POST จะไม่เติมข้อมูล (ฉันเชื่อว่ามีรูปแบบหลายส่วนเท่านั้น)

นี่คือสิ่งที่ได้ผลเพื่อแก้ไขปัญหา:

$rest_json = file_get_contents("php://input");
$_POST = json_decode($rest_json, true);

หวังว่านี่จะช่วยใครสักคน!


1
วิธีแก้ปัญหานี้สมเหตุสมผล - แก้ไขตัวควบคุมการอัปเดตแบทช์ของฉัน :)
Martin Zeitler

2
อีกทางเลือกหนึ่งคือการเปลี่ยนContent-Typeส่วนหัวแล้วเป็นอันดับข้อมูลของคุณด้วยapplication/x-www-form-urlencoded $.param(dataObject)นั่นน่าจะช่วยได้
ŁukaszBachman

1
@ ŁukaszBachmanวิธีการทำว่าถ้า DataObject เป็นสิ่งที่ต้องการ title=something&body=anything........ ฉันต้องการได้รับขอบเขตของชื่อและเนื้อหา $ dataobject ["title"] ส่งกลับค่าว่าง ในกรณีของฉัน $ _POST ว่างเปล่า และวิธีเดียวที่จะใช้ file_get_contents ("php: // input") ... ยกเว้นว่าจะไม่เข้ารหัส json
Khurshid Alam

สิ่งนี้มีประโยชน์มาก สิ่งที่น่าแปลกคือฉันไม่มีปัญหาในการส่ง Json บนเครื่องพัฒนาของฉัน แต่ทำเพื่อการผลิต
Simon H


88

นี่เป็นอีกสาเหตุที่เป็นไปได้ - แบบฟอร์มของฉันส่งไปยัง domain.com โดยไม่มี WWW และฉันได้ตั้งค่าการเปลี่ยนเส้นทางอัตโนมัติเพื่อเพิ่ม "WWW" อาร์เรย์ $ _POST ถูกล้างในกระบวนการนี้ ดังนั้นเพื่อแก้ไขสิ่งที่ฉันต้องทำคือส่งไปที่ www.domain.com


25
Dammit URL ที่เขียนhtaccessซ้ำใน my เป็นสาเหตุของการ POST ไม่ทำงาน ฉันเพิ่มเครื่องหมายทับลงใน url ทั้งหมดโดยอัตโนมัติ แต่ในโค้ดเป็น ACTION ฉันใช้ url โดยไม่มีเครื่องหมายทับ คำตอบของคุณช่วยได้เนื่องจากฉันไม่เคยคิดที่จะตรวจสอบ. htaccess +1
binar

ฉันมีการส่งต่อโดเมน (ด้วยการปิดบัง) โดยใช้ Godaddy และดูเหมือนว่านี่จะเป็นที่มาของปัญหาขอบคุณ!
Chris Prince

1
ฉันก็มีปัญหาที่คล้ายกันมันมาจาก.htaccessไฟล์ของฉัน มันกำลังลอก.phpส่วนขยายออกจาก URL และแบบฟอร์มของฉันก็POSTเข้ากับ URL ที่มีส่วนขยาย
Emanuel Vintilă

25

ฉันมีปัญหาที่คล้ายกัน กลับกลายเป็นการแก้ไขง่ายๆ ในรูปแบบที่ฉันมี

<form action = "directory" method = "post">

โดยที่ไดเร็กทอรีเป็นชื่อของ ... ไดเร็กทอรี อาร์เรย์ POST ของฉันว่างเปล่าโดยสิ้นเชิง เมื่อฉันดู url ในเบราว์เซอร์ของฉันมันจะแสดงพร้อมกับเครื่องหมายทับที่ส่วนท้าย

การเพิ่มสแลชไปข้างหน้าเพื่อสิ้นสุดการกระทำของฉันได้เคล็ดลับ -

<form action = "directory /" method = "post">

อาร์เรย์ $ _POST ของฉันเต็มอีกครั้ง!


1
นี่ไม่ควรแก้ไขตัวอย่างเช่นใน CakePHP ที่มีระบบการกำหนดเส้นทางที่ดีล้มเหลวในเรื่องนี้ (ฉันไม่ได้หมายความว่า Cake ล้มเหลว) บางทีแนวทางในการแก้ปัญหานี้ไม่ใช่เฟรมเวิร์กหรือไฟล์. php แต่การกำหนดค่าบางอย่างใน apache ฉันต้องการตรวจสอบปัญหานี้เพิ่มเติม มันน่าสนใจทีเดียว
James

ในบันทึกที่คล้ายกันฉันมีปัญหาเดียวกันกับ OP แต่เฉพาะในกรณีที่<form>แท็กไม่มีnameแอตทริบิวต์และเฉพาะใน IE
jkt123

14

ตรวจสอบให้แน่ใจว่าใน php.ini:

  • track_vars (ใช้ได้เฉพาะกับ PHP เวอร์ชันเก่าเท่านั้น) ถูกตั้งค่าเป็น On
  • variables_order มีตัวอักษร P
  • post_max_size ตั้งเป็นค่าที่เหมาะสม (เช่น 8 MB)
  • (ถ้าใช้ suhosin patch) suhosin.post.max_varsและsuhosin.request.max_varsมีขนาดใหญ่พอ

ฉันคิดว่าคำแนะนำที่สองของฉันจะช่วยแก้ปัญหาของคุณได้


1
ขอบคุณ MrMage ขอขอบคุณข้อมูลเชิงลึกของคุณและจะตรวจสอบการตั้งค่า ini เหล่านั้นและแจ้งให้คุณทราบว่าเคล็ดลับนั้นหรือไม่ ขอบคุณ!

1
การตั้งค่า "post_max_size" คือ showstopper ของฉัน ฉันกำลังอัปโหลดไฟล์ขนาดใหญ่ในระหว่างการส่งแบบฟอร์มและการตั้งค่านี้มีค่าน้อยกว่า ดังนั้นฉันจึงได้รับอาร์เรย์โพสต์ว่างเมื่อฉันส่งแบบฟอร์ม
shasi kanth

9

ฉันพบว่าเมื่อโพสต์จาก HTTP ไปยัง HTTPS $_POSTจะว่างเปล่า เหตุการณ์นี้เกิดขึ้นขณะทดสอบแบบฟอร์ม แต่ใช้เวลาสักพักจนกว่าฉันจะรู้


5

ฉันพบปัญหาที่คล้ายกัน แต่แตกต่างกันเล็กน้อยและใช้เวลา 2 วันในการทำความเข้าใจปัญหา

  • ในกรณีของฉันอาร์เรย์ POST ว่างเปล่า

  • จากนั้นตรวจสอบด้วย file_get_contents ('php: // input'); และนั่นก็ว่างเปล่าเช่นกัน

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

จากนั้นฉันตรวจสอบว่ามีอะไรผิดปกติกับ URL จริง ไม่มีข้อผิดพลาดกับ URL อย่างไรก็ตามมันชี้ไปที่โฟลเดอร์ที่ไม่มี index.php ใน URL และฉันกำลังตรวจสอบ POST ที่ index.php

ที่นี่ฉันสงสัยว่าการเปลี่ยนเส้นทางจาก / ไปยัง /index.php ทำให้ข้อมูล POST สูญหายและทดสอบ URL พร้อมผนวก index.php เข้ากับ URL

ที่ได้ผล

โพสต์ไว้ที่นี่เพื่อให้ใครบางคนเห็นว่าเป็นประโยชน์


1
ฉันมีปัญหาเดียวกันโดยไม่มี '/' ที่ท้าย url ไม่มีสิ่งใดอยู่ใน $ _REQUEST แต่มี '/' หรือ '/index.php' ข้อมูลที่โพสต์ทั้งหมดอยู่ใน $ _REQUEST อาจเป็นการตั้งค่า nginx ของฉันหรืออย่างอื่น!
MohaMad

5

มีenable_post_data_readingการตั้งค่าจะทำให้คนพิการนี้ ตามเอกสาร:

enable_post_data_reading

การปิดใช้งานตัวเลือกนี้ทำให้ $ _POST และ $ _FILES ไม่ถูกเติม วิธีเดียวที่จะอ่าน postdata คือผ่าน php: // input stream wrapper สิ่งนี้มีประโยชน์กับคำขอพร็อกซีหรือเพื่อประมวลผลข้อมูล POST ในรูปแบบที่มีประสิทธิภาพของหน่วยความจำ


5

หากคุณกำลังโพสต์ไปยังไฟล์ index.php ในไดเร็กทอรีเช่น /api/index.php ตรวจสอบให้แน่ใจว่าในแบบฟอร์มของคุณคุณระบุไดเร็กทอรีแบบเต็มไปยังไฟล์เช่น

นี้

<form method="post" action="/api/index.php"> 
</form>

หรือ

<form method="post" action="/api/"> 
</form>

ได้ผล

แต่สิ่งนี้ล้มเหลว

<form method="post" action="/api"> 
</form>

ที่จริงฉันมีตรงกันข้าม ผมค้นพบว่า/my_uriจะทำงาน /my_uri/แต่ไม่
Link14

1
มีปัญหาเดียวกัน ดูเหมือนว่า apache หรือ nginx จะเพิ่มการเปลี่ยนเส้นทางจาก / api ไปยัง / api /
John Smith

Apache ทำการเปลี่ยนเส้นทาง 301 โดยอัตโนมัติหากไม่มีเครื่องหมายทับ ขอบคุณสำหรับคำตอบและความคิดเห็นก็มีประโยชน์เช่นกัน
Leandro

4

ไม่มีวิธีแก้ปัญหาที่สวยงามในตอนนี้ แต่ต้องการแบ่งปันข้อค้นพบของฉันสำหรับการอ้างอิงในอนาคตของผู้อื่นที่ประสบปัญหานี้ ต้นตอของปัญหาคือ 2 การลบล้างค่า php ในไฟล์. htaccess ฉันเพิ่งเพิ่มค่า 2 ค่านี้เพื่อเพิ่มขีด จำกัด ขนาดไฟล์สำหรับการอัปโหลดไฟล์จากค่าเริ่มต้น 8MB เป็นค่าที่ใหญ่กว่า - ฉันสังเกตว่าการมี 2 ค่านี้ในไฟล์ htaccess เลยไม่ว่าจะใหญ่หรือเล็กกว่าค่าเริ่มต้นก็ทำให้เกิดปัญหา .

php_value post_max_size xxMB
php_value upload_max_filesize xxMB

ฉันเพิ่มตัวแปรเพิ่มเติมเพื่อหวังว่าจะเพิ่มขีด จำกัด สำหรับตัวแปร suhosin.post.xxx/suhosin.upload.xxx ทั้งหมด แต่สิ่งเหล่านี้ไม่มีผลกับปัญหานี้

โดยสรุปฉันไม่สามารถอธิบาย "ทำไม" ที่นี่ แต่ได้ระบุสาเหตุที่แท้จริง ความรู้สึกของฉันคือในที่สุดนี่เป็นปัญหา suhosin / htaccess แต่น่าเสียดายที่ฉันไม่สามารถแก้ไขได้นอกเหนือจากการลบ 2 ค่าที่ถูกแทนที่ php ด้านบน

หวังว่านี่จะช่วยใครบางคนในอนาคตในขณะที่ฉันฆ่าไปสองสามชั่วโมงเพื่อหาสิ่งนี้ ขอบคุณทุกคนที่สละเวลาช่วยฉันในเรื่องนี้ (MrMage, Andrew)


อาจคุ้มค่าที่จะถามคำถามนี้ใน Serverfault โดยเฉพาะอย่างยิ่งหากปัญหาอยู่ในการตั้งค่าเซิร์ฟเวอร์ / htaccess
David กล่าวว่าคืนสถานะ Monica

5
ถ้าจำไม่ผิดขนาดควรระบุเป็น 'xxM' ไม่ใช่ 'xxMB' ดังนั้นฉันจึงสงสัยว่าอาจเกี่ยวข้องกับมันหรือไม่ ...
JC Inacio

4

ฉันสามารถแก้ปัญหาได้โดยใช้ enctype = "application / x-www-form-urlencoded" โดยค่าเริ่มต้นคือ "text / plain" เมื่อคุณเช็คอิน $ DATA ตัวคั่นจะเป็นช่องว่างสำหรับ "text / plain" และอักขระพิเศษสำหรับ "urlencoded"

ขอแสดงความนับถือ Frank


4
<form action="test.php" method="post">
                        ^^^^^^^^^^^^^

โอเคนี่มันโง่และฉันจะทำให้ตัวเองอับอายในที่สาธารณะ แต่ฉันเคาะสคริปต์ทดสอบเล็กน้อยสำหรับบางสิ่งใน PHP และเมื่อ $_POSTอาร์เรย์ว่างเปล่า StackOverflow เป็นที่แรกที่ฉันดูและฉันไม่พบคำตอบที่ต้องการ .

ฉันมีเพียงการเขียน

<form action="test.php">

และลืมระบุวิธีการว่าเป็นPOST!

ฉันแน่ใจว่าจะมีคนมาแอบอ้าง แต่ถ้าสิ่งนี้ช่วยคนอื่นที่ทำแบบเดียวกันฉันก็ไม่รังเกียจ! เราทุกคนทำเป็นครั้งคราว!


ไม่สามารถเชื่อฉันลืมสิ่งนั้นด้วย! ฉันแค่ลองเซิร์ฟเวอร์ใหม่และคิดว่านั่นเป็นสาเหตุของการกำหนดค่า ... อย่างไรก็ตามขอบคุณสำหรับการแจ้งเตือน!
Samuel Aiala Ferreira

4

ในกรณีของฉันเมื่อโพสต์จาก HTTP ไปยัง HTTPS $ _POST จะว่างเปล่า ปัญหาคือแบบฟอร์มมีการดำเนินการเช่นนี้ //example.com เมื่อฉันแก้ไข url เป็นhttps://example.comปัญหาก็หายไป


1
ฉันคิดว่าเป็นสิ่งที่เกี่ยวข้องกับการตั้งค่าเซิร์ฟเวอร์ ฉันมีปัญหาเดียวกันกับการใช้ GoDaddy เป็นโฮสต์ วิธีนี้ไม่สามารถแก้ปัญหาได้
acarlstein

วิธีนี้ช่วยแก้ปัญหาของฉันได้ ฉันมี headeach ที่ดี
gokaysatir

3

ฉบับเดียวกันที่นี่!

ฉันพยายามเชื่อมต่อกับรหัสเซิร์ฟเวอร์ในพื้นที่ของฉันผ่านคำขอโพสต์ในบุรุษไปรษณีย์และปัญหานี้ทำให้ฉันเสียเวลามาก!

สำหรับใครก็ตามที่ใช้โปรเจ็กต์ในพื้นที่ (เช่นบุรุษไปรษณีย์): ใช้ที่อยู่ IPv4 ของคุณ (พิมพ์ ipconfig ใน cmd) แทนคีย์เวิร์ด "localhost" ในกรณีของฉัน:

ก่อน:

localhost/app/login

หลังจาก:

192.168.1.101/app/login

บุรุษไปรษณีย์แจ้งปัญหาบางประการเกี่ยวกับค่า json ที่คัดลอกแล้วซึ่งมีเครื่องหมายคำพูดหรือช่องว่าง คาดว่าจะมีรูปแบบเฉพาะ
Tom Anderson

2

อ้างอิง: http://www.openjs.com/articles/ajax_xmlhttp_using_post.php

วิธีการโพสต์

เรากำลังจะทำการแก้ไขบางอย่างเพื่อจะใช้วิธี POST เมื่อส่งคำขอ ...

var url = "get_data.php";
var params = "lorem=ipsum&name=binny";
http.open("POST", url, true);

//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");

http.onreadystatechange = function() {//Call a function when the state changes.
  if(http.readyState == 4 && http.status == 200) {
    alert(http.responseText);
  }
}
http.send(params);

ต้องตั้งค่าส่วนหัว http บางรายการพร้อมกับคำขอ POST ดังนั้นเราจึงกำหนดไว้ในบรรทัดเหล่านี้ ...

http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");

ด้วยบรรทัดข้างต้นเรากล่าวโดยทั่วไปว่าข้อมูลที่ส่งอยู่ในรูปแบบของการส่งแบบฟอร์ม นอกจากนี้เรายังระบุความยาวของพารามิเตอร์ที่เรากำลังส่ง

http.onreadystatechange = function() {//Call a function when the state changes.
  if(http.readyState == 4 && http.status == 200) {
    alert(http.responseText);
  }
}

เราตั้งค่าตัวจัดการสำหรับเหตุการณ์การเปลี่ยนแปลง "สถานะพร้อม" นี่คือตัวจัดการเดียวกับที่เราใช้สำหรับเมธอด GET คุณสามารถใช้ http.responseText ได้ที่นี่ - แทรกลงใน div โดยใช้ innerHTML (AHAH), eval it (JSON) หรืออย่างอื่น

http.send(params);

สุดท้ายเราส่งพารามิเตอร์พร้อมคำขอ url ที่ระบุจะถูกโหลดหลังจากเรียกบรรทัดนี้เท่านั้น ในเมธอด GET พารามิเตอร์จะเป็นค่า null แต่ในวิธี POST ข้อมูลที่จะส่งจะถูกส่งเป็นอาร์กิวเมนต์ของฟังก์ชันส่ง ตัวแปร params ถูกประกาศในบรรทัดที่สองเป็นlorem=ipsum&name=binny- ดังนั้นเราจึงส่งพารามิเตอร์สองตัว - 'lorem' และ 'name' ด้วยค่า 'ipsum' และ 'binny' ตามลำดับ


2

ฉันรู้ว่ามันเก่า แต่อยากแบ่งปันวิธีแก้ปัญหาของฉัน

ในกรณีของฉันปัญหาอยู่ใน. htaccess ของฉันเมื่อฉันเพิ่มตัวแปรเพื่อเพิ่มขีด จำกัด การอัปโหลดสูงสุดของ PHP รหัสของฉันเป็นแบบนี้:

php_value post_max_size 50MB
php_value upload_max_filesize 50MB

ภายหลังฉันสังเกตเห็นว่าค่าควรเป็น xxM ไม่ใช่ xxMB และเมื่อฉันเปลี่ยนเป็น:

php_value post_max_size 50M
php_value upload_max_filesize 50M

ตอนนี้ $ _POST ของฉันส่งคืนข้อมูลตามปกติก่อนหน้านี้ หวังว่านี่จะช่วยใครบางคนในอนาคต


1

ในกรณีของฉันเป็นเพราะฉันใช้ jQuery เพื่อปิดการใช้งานอินพุตทั้งหมดบนหน้าก่อนที่จะใช้ jQuery เพื่อส่งแบบฟอร์ม ดังนั้นฉันจึงเปลี่ยน "ปิดใช้งานทุกอินพุตแม้กระทั่งประเภท" ซ่อน "":

$(":input").attr("disabled","disabled"); 

การ "ปิดใช้งานเฉพาะอินพุตประเภท" ปุ่ม ":

$('input[type=button]').attr('disabled',true);

สิ่งนี้ทำให้ผู้ใช้ไม่สามารถกดปุ่ม 'ไป' สองครั้งโดยไม่ได้ตั้งใจและต่อฐานข้อมูลของเรา! ดูเหมือนว่าหากคุณใส่แอตทริบิวต์ "ปิดใช้งาน" ในแบบฟอร์ม "ซ่อน" การป้อนค่าจะไม่ถูกส่งไปหากส่งแบบฟอร์ม


1

สำหรับฉัน. htaccess กำลังเปลี่ยนเส้นทางเมื่อไม่ได้ติดตั้ง mod_rewrite ติดตั้ง mod_rewite และทุกอย่างเรียบร้อยดี

โดยเฉพาะ:

<IfModule !mod_rewrite.c>
  ErrorDocument 404 /index.php
</Ifmodule>

กำลังดำเนินการ


1

ฉันใช้เวลาหลายชั่วโมงในการแก้ไขปัญหาที่คล้ายกัน ปัญหาในกรณีของฉันคือไฟล์

max_input_vars = "1000"

ตามค่าเริ่มต้นใน php.ini ฉันมีรูปร่างที่ใหญ่มากโดยไม่ต้องอัปโหลด php.ini ถูกตั้งค่าเป็น upload_max_filesize = "100M" และ post_max_size = "108M" และแน่นอนว่าไม่ใช่ปัญหาในกรณีของฉัน พฤติกรรมของ PHP จะเหมือนกันสำหรับ max_input_vars เมื่อมีตัวแปรเกิน 1,000 ตัวในรูปแบบ มันส่งกลับและอาร์เรย์ _POST ว่างเปล่า ฉันหวังว่าฉันจะได้พบว่าหนึ่งชั่วโมงและชั่วโมงที่แล้ว


0

นอกเหนือจากโพสต์ของ MRMage:

ฉันต้องตั้งค่าตัวแปรนี้เพื่อแก้ปัญหาที่$_POSTตัวแปรบางตัว (ที่มีอาร์เรย์ขนาดใหญ่> 1,000 รายการ) หายไป:

suhosin.request.max_vars = 2500

" request" ไม่ใช่ " post" คือทางออก ...


0

อาจไม่ใช่วิธีแก้ปัญหาที่สะดวกที่สุด แต่ฉันคิดออกว่าถ้าฉันตั้งค่าactionแอตทริบิวต์แบบฟอร์มเป็นโดเมนราก index.php สามารถเข้าถึงและรับตัวแปรที่โพสต์ได้ อย่างไรก็ตามหากฉันตั้งค่า URL ที่เขียนใหม่เป็นการดำเนินการจะไม่ทำงาน


0

นี่คือการจัดเรียงของคล้ายกับสิ่งที่ @icesar กล่าวว่า

แต่ฉันพยายามโพสต์สิ่งต่างๆใน api ของฉันซึ่งอยู่ในsite/api/index.phpโพสต์ไปเท่านั้นsite/apiเนื่องจากมันถูกส่งต่อไปยังindex.phpตัวมันเอง อย่างไรก็ตามสิ่งนี้ดูเหมือนจะทำให้บางอย่างยุ่งเหยิงขณะที่ฉัน$_POSTว่างเปล่าในทันที เพียงแค่โพสต์ไปที่site/api/index.phpโดยตรงแทนที่จะแก้ไขได้


0

ปัญหาของฉันคือฉันใช้<base>แท็กHTML เพื่อเปลี่ยน URL พื้นฐานของไซต์ทดสอบของฉัน เมื่อฉันลบแท็กนั้นออกจากส่วนหัว$_POSTข้อมูลจะกลับมา


0

ในกรณีของฉัน (หน้า php บนเซิร์ฟเวอร์ OVH รวมกัน) enctype="text/plain"ไม่ทำงาน ( $_POSTและข้อมูลที่เกี่ยวข้อง$_REQUESTว่างเปล่า) ตัวอย่างอื่น ๆ ด้านล่างใช้งานได้ `

<form action="?" method="post">
<!-- in this case, my google chrome 45.0.2454.101 uses -->
<!--     Content-Type:application/x-www-form-urlencoded -->
    <input name="say" value="Hi">
    <button>Send my greetings</button>
</form>

<form action="?" method="post" enctype="application/x-www-form-urlencoded">
    <input name="say" value="Hi">
    <button>Send my application/x-www-form-urlencoded greetings</button>
</form>

<form action="?" method="post"  enctype="multipart/form-data">
    <input name="say" value="Hi">
    <button>Send my multipart/form-data greetings</button>
</form>

<form action="?" method="post" enctype="text/plain"><!-- not working -->
    <input name="say" value="Hi">
    <button>Send my text/plain greetings</button>
</form>

`

เพิ่มเติมที่นี่: method = "post" enctype = "text / plain" เข้ากันไม่ได้?


0

ฉันได้รับข้อผิดพลาดต่อไปนี้จาก Mod Security:

Access denied with code 500 (phase 2). Pattern match "((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]|UNION SELECT.*\'.*\'.*,[0-9].*INTO.*FROM)" at REQUEST_BODY. [file "/usr/local/apache/conf/modsec2.user.conf"] [line "345"] [id "300013"] [rev "1"] [msg "Generic SQL injection protection"] [severity "CRITICAL"]

เมื่อฉันลบการกำหนดค่าความปลอดภัยของม็อดเพื่อทดสอบทุกอย่างก็ทำงานได้ตามที่คาดไว้ ตอนนี้ฉันต้องแก้ไขกฎของฉันเพื่อรักษาความปลอดภัย แต่ยืดหยุ่นเพียงพอสำหรับความต้องการของฉัน :)


0

ตรวจสอบให้แน่ใจว่าคุณใช้ name = " your_variable_name " ในแท็กอินพุต

ฉันใช้ id = " your_variable_name " ผิดพลาด

ฉันใช้เวลามากในการจับจุดบกพร่อง


0

ตรวจสอบให้แน่ใจว่าได้กำหนดnameคุณสมบัติของแต่ละฟิลด์

สิ่งนี้สร้าง POST ที่ว่างเปล่าบน PHP

<input type="text" id="Phone">

แต่จะได้ผล

<input type="text" name="Phone" id="Phone">

ฉันคิดว่าเป็นสิ่งที่เกี่ยวข้องกับการตั้งค่าเซิร์ฟเวอร์ ฉันมีปัญหาเดียวกันกับการใช้ GoDaddy เป็นโฮสต์ วิธีนี้ไม่สามารถแก้ปัญหาได้
acarlstein

.htaccessสำหรับผู้ที่สนใจที่คุณอาจจะต้องไปเป็นฝันร้ายของการตั้งค่าของคุณเอง
acarlstein

-1

ตกลงฉันคิดว่าฉันควรใส่กรณีของฉันที่นี่ .... ฉันได้รับอาร์เรย์โพสต์ว่างเปล่าในบางกรณี .. แบบฟอร์มใช้งานได้ดี แต่บางครั้งผู้ใช้บ่นว่ากดปุ่มส่งแล้วไม่มีอะไรเกิดขึ้น .... หลังจากขุดไปสักพักฉันพบว่า บริษัท โฮสติ้งของฉันมีโมดูลความปลอดภัยที่ตรวจสอบอินพุตของผู้ใช้และล้างอาร์เรย์โพสต์ทั้งหมด (ไม่ใช่เฉพาะข้อมูลที่เป็นอันตราย) หากพบ ในตัวอย่างของฉันครูคณิตศาสตร์พยายามป้อนสมการ: dy + dx + 0 = 0; และข้อมูลถูกล้างอย่างสมบูรณ์

ในการแก้ไขปัญหานี้ฉันแค่แนะนำให้เขาป้อนข้อมูลในพื้นที่ข้อความเป็น dy + dx + 0 = ศูนย์และตอนนี้ก็ใช้งานได้แล้ว .... สิ่งนี้สามารถช่วยใครบางคนได้บ้าง ..


5
การขอให้ผู้ใช้ให้ค่าเผื่อสำหรับรหัสที่ผิดพลาดนั้นไม่ใช่การเริ่มต้น
freeworlder

ไม่ใช่รหัสที่ผิดพลาด แต่คุณอาจพิจารณาผู้ให้บริการโฮสติ้งรายใหม่ หรือโพสต์อินพุตในรูปแบบอื่นเช่นการเข้ารหัส URL HTML
Tom Anderson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.