Biến PHP Pass sang trang tiếp theo


196

Nó có vẻ khá đơn giản nhưng tôi không thể tìm thấy một cách tốt để làm điều đó.

Nói trong trang đầu tiên tôi tạo một biến

$myVariable = "Some text";

Và hành động của biểu mẫu cho trang đó là "Trang2.php". Vậy trong Page2.php, làm thế nào tôi có thể có quyền truy cập vào biến đó? Tôi biết tôi có thể làm điều đó với các phiên nhưng tôi nghĩ rằng nó quá nhiều cho một chuỗi đơn giản và tôi chỉ cần truyền một chuỗi đơn giản (tên tệp).

Làm thế nào tôi có thể đạt được điều này?

Cảm ơn!


Điều tốt nhất và dễ nhất để vượt qua các biến là cách tôi giải thích nó ở đây: stackoverflow.com/questions/14465464/
mẹo

Câu trả lời:


450

HTML / HTTP là không trạng thái, nói cách khác, những gì bạn đã làm / thấy trên trang trước đó, hoàn toàn không được kết nối với trang hiện tại. Ngoại trừ nếu bạn sử dụng một cái gì đó như phiên, cookie hoặc biến GET / POST. Phiên và cookie khá dễ sử dụng, với phiên an toàn hơn nhiều so với cookie. An toàn hơn, nhưng không hoàn toàn an toàn.

Phiên:

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

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

Hãy nhớ chạy session_start();câu lệnh trên cả hai trang này trước khi bạn cố gắng truy cập $_SESSIONmảng và trước khi bất kỳ đầu ra nào được gửi đến trình duyệt.

Bánh quy:

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

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

Sự khác biệt lớn giữa phiên và cookie là giá trị của biến sẽ được lưu trữ trên máy chủ nếu bạn đang sử dụng phiên và trên máy khách nếu bạn đang sử dụng cookie. Tôi không thể nghĩ ra bất kỳ lý do chính đáng nào để sử dụng cookie thay vì phiên, ngoại trừ nếu bạn muốn dữ liệu tồn tại giữa các phiên, nhưng thậm chí sau đó có lẽ tốt hơn là lưu trữ nó trong DB và truy xuất nó dựa trên tên người dùng hoặc id.

NHẬN VÀ BÀI VIẾT

Bạn có thể thêm biến trong liên kết đến trang tiếp theo:

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

Điều này sẽ tạo ra một biến GET.

Một cách khác là bao gồm một trường ẩn trong một biểu mẫu gửi đến trang hai:

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

Và sau đó trên trang hai:

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

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

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

Chỉ cần thay đổi phương thức cho biểu mẫu thành postnếu bạn muốn làm điều đó qua bài viết. Cả hai đều không an toàn như nhau, mặc dù GET dễ hack hơn.

Thực tế là mỗi yêu cầu mới, ngoại trừ dữ liệu phiên, một phiên bản hoàn toàn mới của tập lệnh đã bắt gặp tôi khi tôi bắt đầu viết mã bằng PHP. Khi bạn đã quen với nó, nó khá đơn giản.


2
Cảm ơn điều này đã giúp, vấn đề là tôi đã có một loạt các biến trong trang đầu tiên, vì vậy những gì tôi đã làm là tạo một mảng với tất cả các biến đó và gửi nó đến trang tiếp theo bằng các phiên.
Carlo

Schweet :) Vui mừng tôi có thể giúp đỡ.
Jrgns

4
Nitpick: các phiên trong PHP thường được xử lý bởi cookie. Cookie phiên không phải là cookie liên tục và thường chỉ giữ id phiên. Nhưng nó vẫn là một cookie.
Dabbler Decent

Để giải thích trên bình luận của riêng tôi. Lý do là bởi vì, như bạn đã nói, HTTP là không trạng thái. Do đó PHP vẫn cần một cách để xác định phiên. Điều này được thực hiện bằng cách lưu trữ cookie trên máy khách với id phiên. Nếu cookie bị vô hiệu hóa ứng dụng khách, PHP đôi khi sử dụng các vars $ _GET để nối id phiên vào các liên kết giữa các trang. Nhưng điều này thường được coi là không an toàn và thường bị vô hiệu hóa đối với hầu hết các máy chủ web (php.ini).
Dabbler Decent

Các phiên PHP @fireeyedboy cũng có thể được truyền bá bằng cách sử dụng các biến GET và POST. Vào cuối ngày, phiên đơn giản hóa việc chuyển các biến từ trang này sang trang tiếp theo bằng cách chỉ có một phần dữ liệu cần truyền: id phiên. Id phiên đó sau đó được sử dụng để lấy dữ liệu đã lưu trước đó.
Jrgns

30

Cảm ơn câu trả lời ở trên. Đây là cách tôi đã làm, tôi hy vọng nó sẽ giúp những người theo dõi. Tôi đang tìm cách chuyển số đăng ký từ trang này sang trang khác, do đó regNameregValue :

Tạo trang đầu tiên của bạn, gọi nó là 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>

Tạo trang thứ hai của bạn, gọi nó là 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>

Mặc dù không toàn diện như câu trả lời ở trên, nhưng với mục đích của tôi, điều này minh họa một cách đơn giản mối quan hệ giữa các yếu tố khác nhau.


13
Ví dụ của bạn cũng hoạt động mà không có phiên và trên thực tế không nhận được dữ liệu thông qua cơ chế phiên (trong get_reg.php). Bạn đang gửi regName thông qua một biểu mẫu với phương thức get như được giải thích bởi Jrgns. Do đó, biến có thể truy cập được tại trang get_reg.php thông qua mảng $ _GET.
metatron

16

Truyền dữ liệu trong yêu cầu

Bạn có thể nhúng nó dưới dạng một trường ẩn trong biểu mẫu của bạn hoặc thêm URL hành động biểu mẫu của bạn

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

hoặc là

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

Lưu ý điều này cũng minh họa việc sử dụng htmlentityurlencode khi truyền dữ liệu xung quanh.

Truyền dữ liệu trong phiên

Nếu dữ liệu không cần phải được chuyển đến phía máy khách, thì các phiên có thể phù hợp hơn. Chỉ cần gọi session_start () ở đầu mỗi trang và bạn có thể lấy và đặt dữ liệu vào mảng $ _SESSION.

Bảo vệ

Vì bạn tuyên bố giá trị của bạn thực sự là một tên tệp, bạn cần lưu ý đến các phân nhánh bảo mật. Nếu tên tệp đã đến từ phía máy khách, giả sử người dùng đã can thiệp vào giá trị. Kiểm tra tính hợp lệ! Điều gì xảy ra khi người dùng chuyển đường dẫn đến một tệp hệ thống quan trọng hoặc một tệp dưới sự kiểm soát của họ? Tập lệnh của bạn có thể được sử dụng để "thăm dò" máy chủ cho các tập tin tồn tại hoặc không tồn tại không?

Vì bạn rõ ràng chỉ mới bắt đầu ở đây, nên nhắc nhở rằng điều này phù hợp với bất kỳ dữ liệu nào có trong $ _GET, $ _POST hoặc $ _COOKIE - giả sử kẻ thù tồi tệ nhất của bạn đã tạo ra nội dung của các mảng đó và mã hóa theo đó!


9

Có ba phương thức để truyền giá trị trong php.

  • Qua đường bưu điện
  • Bằng cách nhận
  • Bằng cách biến phiên

Ba phương thức này được sử dụng cho các mục đích khác nhau. Ví dụ: nếu chúng tôi muốn nhận giá trị của mình trên trang tiếp theo thì chúng tôi có thể sử dụng phương thức 'post' ($ _POST) như: -

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

Nếu chúng tôi yêu cầu giá trị của biến trên nhiều trang thì chúng tôi có thể sử dụng biến phiên là: -

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

Trước khi sử dụng Cú pháp này để tạo biến SESSION, trước tiên chúng ta phải thêm thẻ này vào đầu trang php của chúng tôi

session_start(); 

Phương thức GET thường được sử dụng để in dữ liệu trên cùng một trang được sử dụng để lấy đầu vào từ người dùng. Cú pháp của nó là:

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

Phương thức POST thường tiêu thụ an toàn hơn GET vì khi chúng tôi sử dụng phương thức Get hơn nó có thể hiển thị dữ liệu trên thanh URL. Nếu dữ liệu là dữ liệu nhạy cảm hơn như mật khẩu thì nó có thể là inggeris.


7

Phiên sẽ là cách tốt duy nhất, bạn cũng có thể sử dụng GET / POST nhưng điều đó sẽ không an toàn.


6

thử mã này

sử dụng trường ẩn chúng ta có thể truyền php varibale sang một trang khác

trang1.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>

chuyển biến php sang giá trị trường ẩn để bạn có thể truy cập biến này vào trang khác

trang2.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>`

trang 2

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

1

Phiên sẽ là cách tốt duy nhất, bạn cũng có thể sử dụng GET / POST nhưng điều đó sẽ không an toàn.

Truyền dữ liệu trong phiên Nếu dữ liệu không cần phải được chuyển sang phía máy khách, thì các phiên có thể phù hợp hơn. Chỉ cần gọi session_start () ở đầu mỗi trang và bạn có thể nhận và đặt dữ liệu vào mảng $ _SESSION.

Bảo mật Vì bạn nêu giá trị của mình thực sự là một tên tệp, bạn cần lưu ý đến các phân nhánh bảo mật. Nếu tên tệp đã đến từ phía máy khách, giả sử người dùng đã can thiệp vào giá trị. Kiểm tra tính hợp lệ! Điều gì xảy ra khi người dùng chuyển đường dẫn đến một tệp hệ thống quan trọng hoặc một tệp dưới sự kiểm soát của họ? Tập lệnh của bạn có thể được sử dụng để "thăm dò" máy chủ cho các tập tin tồn tại hoặc không tồn tại không?

Vì bạn rõ ràng chỉ mới bắt đầu ở đây, điều đáng lưu ý là điều này phù hợp với bất kỳ dữ liệu nào có trong $ _GET, $ _POST hoặc $ _COOKIE - giả sử kẻ thù tồi tệ nhất của bạn đã tạo ra nội dung của các mảng đó và mã hóa theo đó!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.