ตัวแปร PHP Pass ไปยังหน้าถัดไป


196

ดูเหมือนจะง่าย แต่ฉันไม่สามารถหาวิธีที่ดีในการทำ

พูดในหน้าแรกฉันสร้างตัวแปร

$myVariable = "Some text";

และการกระทำของแบบฟอร์มสำหรับหน้านั้นคือ "Page2.php" ดังนั้นใน Page2.php ฉันจะสามารถเข้าถึงตัวแปรนั้นได้อย่างไร ฉันรู้ว่าฉันสามารถทำกับเซสชัน แต่ฉันคิดว่ามันมากเกินไปสำหรับสตริงง่ายและฉันจะต้องผ่านสตริงง่าย ๆ (ชื่อไฟล์)

ฉันจะบรรลุสิ่งนี้ได้อย่างไร

ขอบคุณ!


สิ่งที่ดีที่สุดและง่ายที่สุดในการส่งตัวแปรคือวิธีที่ฉันอธิบายไว้ที่นี่: stackoverflow.com/questions/14465464/…
Jaro

คำตอบ:


450

HTML / HTTP นั้นไร้สัญชาติกล่าวอีกอย่างคือสิ่งที่คุณทำ / เห็นในหน้าก่อนหน้านั้นไม่มีการเชื่อมต่อกับหน้าปัจจุบันอย่างสมบูรณ์ ยกเว้นถ้าคุณใช้สิ่งต่าง ๆ เช่นเซสชันคุกกี้หรือตัวแปร GET / POST เซสชั่นและคุกกี้ค่อนข้างใช้งานง่ายโดยเซสชันมีความปลอดภัยมากกว่าคุกกี้ ปลอดภัยยิ่งขึ้น แต่ไม่ปลอดภัยอย่างสมบูรณ์

เซสชั่น:

//On page 1
$_SESSION['varname'] = $var_value;

//On page 2
$var_value = $_SESSION['varname'];

อย่าลืมเรียกใช้session_start();คำสั่งบนหน้าทั้งสองเหล่านี้ก่อนที่คุณจะพยายามเข้าถึง$_SESSIONอาร์เรย์และก่อนที่ผลลัพธ์ใด ๆ จะถูกส่งไปยังเบราว์เซอร์

คุกกี้:

//One page 1
$_COOKIE['varname'] = $var_value;

//On page 2
$var_value = $_COOKIE['varname'];

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

รับและโพสต์

คุณสามารถเพิ่มตัวแปรในลิงค์ไปยังหน้าถัดไป:

<a href="page2.php?varname=<?php echo $var_value ?>">Page2</a>

สิ่งนี้จะสร้างตัวแปร GET

อีกวิธีคือการรวมเขตข้อมูลที่ซ่อนอยู่ในแบบฟอร์มที่ส่งไปยังหน้าสอง:

<form method="get" action="page2.php">
    <input type="hidden" name="varname" value="var_value">
    <input type="submit">
</form>

จากนั้นในหน้าสอง:

//Using GET
$var_value = $_GET['varname'];

//Using POST
$var_value = $_POST['varname'];

//Using GET, POST or COOKIE.
$var_value = $_REQUEST['varname'];

เพียงเปลี่ยนวิธีสำหรับแบบฟอร์มเป็นpostหากคุณต้องการทำผ่านโพสต์ ทั้งสองอย่างไม่ปลอดภัยเท่ากันแม้ว่า GET จะง่ายต่อการแฮ็ก

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


2
ขอบคุณสิ่งนี้ช่วยได้ปัญหาคือฉันมีตัวแปรหลายตัวในหน้าแรกดังนั้นสิ่งที่ฉันทำคือสร้างอาร์เรย์ที่มีตัวแปรทั้งหมดแล้วส่งไปยังหน้าถัดไปโดยใช้เซสชัน
Carlo

Schweet :) ดีใจที่ฉันช่วยได้
Jrgns

5
Nitpick: เซสชันใน PHP นั้นจัดการโดยคุกกี้ด้วยเช่นกัน คุกกี้เซสชั่นไม่ใช่คุกกี้ถาวรและโดยปกติแล้วจะเก็บรหัสเซสชันเท่านั้น แต่มันก็ยังเป็นคุกกี้
Dabbler ที่มีคุณค่า

เพื่ออธิบายความคิดเห็นของตัวเองอย่างละเอียด เหตุผลก็คือเพราะอย่างที่คุณพูด HTTP นั้นไร้สัญชาติ ดังนั้น PHP ยังต้องการวิธีการระบุเซสชัน สิ่งนี้ทำได้โดยการจัดเก็บคุกกี้บนไคลเอนต์ด้วยรหัสเซสชัน หากคุกกี้ถูกปิดใช้งานไคลเอนต์บางครั้ง PHP ใช้ vars $ _GET เพื่อผนวกรหัสเซสชันเพื่อเชื่อมโยงระหว่างหน้า แต่โดยทั่วไปถือว่าไม่ปลอดภัยและมีการปิดใช้งานโดยทั่วไปสำหรับ webservers ส่วนใหญ่ (php.ini)
Dabbler ที่มีคุณค่า

@fireeyedboy ช่วง PHP สามารถแพร่กระจายโดยใช้ตัวแปร GET และ POST เช่นกัน ในตอนท้ายของวันเซสชันจะทำให้ตัวแปรส่งผ่านจากหน้าหนึ่งไปอีกหน้าหนึ่งทำได้ง่ายขึ้นโดยมีข้อมูลเพียงชิ้นเดียวที่จะถ่ายโอนนั่นคือรหัสเซสชัน รหัสเซสชันนั้นจะถูกใช้เพื่อดึงข้อมูลที่บันทึกไว้ก่อนหน้านี้
Jrgns

30

ขอบคุณสำหรับคำตอบข้างต้น นี่คือวิธีที่ฉันทำฉันหวังว่ามันจะช่วยคนที่ติดตาม ฉันต้องการส่งหมายเลขลงทะเบียนจากหน้าหนึ่งไปอีกหน้าหนึ่งดังนั้นregNameและregValue :

สร้างหน้าแรกของคุณเรียกมันว่าset_reg.php :

<?php

session_start();

$_SESSION['regName'] = $regValue;

?>

<form method="get" action="get_reg.php">
    <input type="text" name="regName" value="">
    <input type="submit">
</form>

สร้างหน้าสองของคุณเรียกมันว่าget_reg.php :

<?php

session_start();

$regValue = $_GET['regName'];

echo "Your registration is: ".$regValue.".";

?>

<p><a href="set_reg.php">Back to set_reg.php</a>

แม้ว่าจะไม่ครอบคลุมเท่าคำตอบข้างต้น แต่สำหรับวัตถุประสงค์ของฉันนี้แสดงให้เห็นถึงความสัมพันธ์ระหว่างองค์ประกอบต่าง ๆ ในแบบง่าย ๆ


13
ตัวอย่างของคุณทำงานโดยไม่มีเซสชันด้วยและในความเป็นจริงไม่ได้รับข้อมูลผ่านทางกลไกการประชุม (ใน get_reg.php) คุณกำลังส่ง regName ผ่านทางแบบฟอร์มพร้อมวิธีรับตามที่อธิบายโดย Jrgns ตัวแปรสามารถเข้าถึงได้ที่หน้า get_reg.php ผ่านอาร์เรย์ $ _GET
เมตาตรอน

16

ผ่านข้อมูลในคำขอ

คุณสามารถฝังเป็นเขตข้อมูลที่ซ่อนอยู่ในแบบฟอร์มของคุณหรือเพิ่ม URL การกระทำของฟอร์ม

 echo '<input type="hidden" name="myVariable" value="'.
     htmlentities($myVariable).'">';

หรือ

echo '<form method="POST" action="Page2.php?myVariable='.
    urlencode($myVariable).'">";

หมายเหตุสิ่งนี้ยังแสดงให้เห็นถึงการใช้htmlentitiesและurlencodeเมื่อส่งข้อมูลไปรอบ ๆ

การส่งผ่านข้อมูลในเซสชัน

หากไม่จำเป็นต้องส่งข้อมูลไปยังฝั่งไคลเอ็นต์เซสชันนั้นอาจเหมาะสมกว่า เพียงแค่เรียกsession_start ()ที่จุดเริ่มต้นของแต่ละหน้าและคุณสามารถรับและตั้งค่าข้อมูลเป็นอาร์เรย์ $ _SESSION

ความปลอดภัย

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

ในขณะที่คุณเพิ่งเริ่มต้นที่นี่มันคุ้มค่าที่จะเตือนว่าข้อมูลนี้จะมาถึงใน $ _GET, $ _POST หรือ $ _COOKIE - ถือว่าศัตรูที่เลวร้ายที่สุดของคุณสร้างเนื้อหาของอาร์เรย์เหล่านั้นและรหัสตาม!


9

มีสามวิธีในการส่งผ่านค่าใน php

  • ทางไปรษณีย์
  • โดยรับ
  • โดยทำให้ตัวแปรเซสชั่น

วิธีการทั้งสามนี้ใช้เพื่อจุดประสงค์ที่แตกต่างกันตัวอย่างเช่นหากเราต้องการรับค่าของเราในหน้าถัดไปเราสามารถใช้วิธี 'post' ($ _POST) เป็น: -

$a=$_POST['field-name'];

หากเราต้องการค่าของตัวแปรในมากกว่าหนึ่งหน้าเราสามารถใช้ตัวแปรเซสชันเป็น: -

$a=$_SESSION['field-name];

ก่อนที่จะใช้ไวยากรณ์นี้สำหรับการสร้างตัวแปร SESSION เราต้องเพิ่มแท็กนี้ที่จุดเริ่มต้นของหน้า php ของเราก่อน

session_start(); 

วิธีการ GET โดยทั่วไปจะใช้ในการพิมพ์ข้อมูลในหน้าเดียวกันซึ่งใช้ในการป้อนข้อมูลจากผู้ใช้ ไวยากรณ์ของมันคือ:

$a=$_GET['field-name'];

โดยทั่วไปแล้ววิธีการ POST นั้นใช้ความปลอดภัยมากกว่า GET เพราะเมื่อเราใช้วิธีการรับมากกว่าที่จะสามารถแสดงข้อมูลในแถบ URL หากข้อมูลนั้นเป็นข้อมูลที่มีความอ่อนไหวมากกว่าเช่นรหัสผ่าน


7

การประชุมจะเป็นวิธีที่ดีเพียงอย่างเดียวคุณสามารถใช้ GET / POST ได้ แต่นั่นอาจไม่ปลอดภัย


6

ลองรหัสนี้

ใช้เขตข้อมูลที่ซ่อนอยู่เราสามารถส่ง php varibale ไปยังหน้าอื่น

page1.php

<?php $myVariable = "Some text";?>
<form method="post" action="page2.php">
 <input type="hidden" name="text" value="<?php echo $myVariable; ?>">
 <button type="submit">Submit</button>
</form>

ส่งตัวแปร php ไปยังค่าฟิลด์ที่ซ่อนไว้เพื่อให้คุณสามารถเข้าถึงตัวแปรนี้ไปยังหน้าอื่น

page2.php

<?php
 $text=$_POST['text'];
 echo $text;
?>

1
**page 1**
<form action="exapmple.php?variable_name=$value" method="POST"> 
    <button>
        <input  type="hidden" name="x">
    </button>
</form>`

หน้า 2

if(isset($_POST['x'])) {
    $new_value=$_GET['variable_name'];
}

1

การประชุมจะเป็นวิธีที่ดีเพียงอย่างเดียวคุณสามารถใช้ GET / POST ได้ แต่นั่นอาจไม่ปลอดภัย

การส่งข้อมูลในเซสชันหากข้อมูลไม่จำเป็นต้องส่งผ่านไปยังฝั่งไคลเอ็นต์เซสชันนั้นอาจเหมาะสมกว่า เพียงแค่เรียก session_start () ที่จุดเริ่มต้นของแต่ละหน้าและคุณสามารถรับและตั้งค่าข้อมูลเป็นอาร์เรย์ $ _SESSION

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

เนื่องจากคุณเพิ่งเริ่มต้นอย่างชัดเจนที่นี่เป็นสิ่งที่ควรค่าแก่การเตือนว่าจะมีข้อมูลใด ๆ ที่มาถึง $ _GET, $ _POST หรือ $ _COOKIE - ถือว่าศัตรูที่ร้ายที่สุดของคุณสร้างเนื้อหาของอาร์เรย์เหล่านั้นและรหัสตาม!

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