2011-01-24 36 views
5

Cách xử lý biểu mẫu trên cùng một trang so với sử dụng trang quy trình riêng. Ngay bây giờ cho đăng ký, gửi bình luận, vv Tôi sử dụng một trang thứ hai để xác minh dữ liệu và sau đó gửi và các tuyến đường trở về home.php. Làm thế nào tôi có thể làm cho nó để gửi, bản thân trang xác minh hơn là sử dụng một trang thứ hai.Xử lý trang giống nhau

+1

tại sao không chỉ bao gồm trang thứ hai đó? –

+3

loại công việc lộn xộn của nó, không 'bạn nghĩ sao? Nó sẽ trông gọn gàng nếu nó trên cùng một trang. – AAA

Trả lời

11

Bạn có thể yêu cầu biểu mẫu gửi tới bản thân PHP, sau đó kiểm tra các biến số $_POST để xử lý biểu mẫu. Phương pháp này rất tốt để kiểm tra lỗi khi bạn có thể đặt lỗi và sau đó tải lại biểu mẫu với bất kỳ thông tin nào mà người dùng đã gửi trước đây của bạn vẫn còn nguyên vẹn (nghĩa là họ không bị mất nội dung gửi của họ).

Khi nút "gửi" được nhấp, nút này sẽ BẬT thông tin đến cùng một trang, chạy mã PHP ở trên cùng. Nếu một lỗi xảy ra (dựa trên kiểm tra của bạn), biểu mẫu sẽ tải lại cho người dùng với các lỗi được hiển thị và bất kỳ thông tin nào mà người dùng đã cung cấp vẫn còn trong các trường. Nếu một lỗi không xảy ra, bạn sẽ hiển thị một trang xác nhận thay vì biểu mẫu.

<?php 
//Form submitted 
if(isset($_POST['submit'])) { 
    //Error checking 
    if(!$_POST['yourname']) { 
    $error['yourname'] = "<p>Please supply your name.</p>\n"; 
    } 
    if(!$_POST['address']) { 
    $error['address'] = "<p>Please supply your address.</p>\n"; 
    } 

    //No errors, process 
    if(!is_array($error)) { 
    //Process your form 

    //Display confirmation page 
    echo "<p>Thank you for your submission.</p>\n"; 

    //Require or include any page footer you might have 
    //here as well so the style of your page isn't broken. 
    //Then exit the script. 
    exit; 
    } 
} 
?> 

<form method="post" action="<?=$_SERVER['PHP_SELF']?>"> 
    <?=$error['yourname']?> 
    <p><label for="yourname">Your Name:</label><input type="text" id="yourname" name="yourname" value="<?=($_POST['yourname'] ? htmlentities($_POST['yourname']) : '')?>" /></p> 
    <?=$error['address']?> 
    <p><label for="address">Your Address:</label><input type="text" id="address" name="address" value="<?=($_POST['address'] ? htmlentities($_POST['address']) : '')?>" /></p> 
    <p><input type="submit" name="submit" value="Submit" /></p> 
</form> 
+0

Cảm ơn Michael. Chỉ là điều tôi đang tìm kiếm. Tuy nhiên, thay vì nói cảm ơn bạn đã gửi, làm cách nào tôi có thể làm mới trang đó để trang có thể tải thông tin mới. Không thể làm Ajax vào thời điểm này, mới cho trò chơi lập trình! – AAA

+0

Nếu bạn xử lý biểu mẫu trước khi tìm nạp dữ liệu (Như tôi đã đề xuất), dữ liệu mới sẽ được tự động tính đến. – Jonas

+2

@AAA Tôi không hiểu câu hỏi của bạn. Phương pháp trên là mô hình chính xác tôi sử dụng trong 90% biểu mẫu của mình và là một ví dụ mở rộng về những gì @NeqO đã cung cấp. Bạn đang cố gắng hoàn thành điều gì trong việc "làm mới" trang? –

6

Việc xây dựng đơn giản nhất là để phát hiện xem các mảng $_POST là không có sản phẩm nào

if(isset($_POST['myVarInTheForm'])) { 
    // Process the form 
} 

// do the regular job 
1

bạn có thể kiểm tra xem nó là POST yêu cầu bên trong mã của trang và sau đó kiểm tra dữ liệu. Nếu đó là yêu cầu GET - chỉ cần hiển thị biểu mẫu. Tuy nhiên, hãy nhớ rằng thực tiễn tốt là hiển thị kết quả gửi biểu mẫu thành công trên một trang khác được phân phát qua yêu cầu GET, tức là mọi biểu mẫu POST thành công sẽ được trả lời với chuyển hướng đến trang thành công.

+1

Tại sao bạn đề xuất quy trình này là tốt? – diagonalbatman

+0

vì khi bạn hiển thị trang thông thường để trả lời POST, dữ liệu sẽ được gửi lại khi làm mới trang. Hầu hết các trình duyệt sẽ cảnh báo người dùng về điều đó (và hầu hết người dùng sẽ thực sự nhầm lẫn với cảnh báo này), một số, giống như Opera, sẽ lặng lẽ gửi lại tất cả dữ liệu POST. Trong mọi trường hợp, điều đó có lẽ sẽ không phải là hành vi mong muốn. Đó là lý do tại sao tôi khuyên bạn nên chuyển hướng đến trang kết quả nếu yêu cầu thành công. Đó là OK mặc dù để hiển thị kết quả xác nhận ngay sau khi POST, nếu có bất cứ điều gì sai với dữ liệu và yêu cầu người dùng sửa chữa đầu vào của nó. –

+0

:-) Lý do duy nhất tôi hỏi là bởi vì khi bạn đang học nó thường là hữu ích để hiểu tại sao một bình luận cụ thể được thực hiện. – diagonalbatman

1

Tất nhiên bạn có thể khám phá các yêu cầu AJAX, nơi bạn sẽ thực hiện cuộc gọi không đồng bộ với tập lệnh xử lý của mình, sau đó cập nhật rồi cập nhật trang gửi với thông báo thành công. Điều này mang lại ấn tượng về "Xử lý trang giống nhau" tức là trang không phải làm mới.

Nó thực sự phụ thuộc vào hiệu quả bạn đang cố gắng đạt được.

+0

Cảm ơn Andy. Đã thử triển khai Ajax. Không thể có được đầu của tôi aroudn nó. – AAA

+0

Có rất nhiều tài nguyên trực tuyến tốt, một trang web tôi khuyên bạn nên http://net.tutsplus.com - tải các hướng dẫn video để giúp bạn. – diagonalbatman

0

@ Michael Irigoyen: Nó hoạt động tốt, nhưng trên rn đầu tiên/tải, nó cho thấy:

"Thông báo: Không xác định biến: Lỗi trong C: \ xampp \ htdocs \ same_page.php trên đường dây 28 "

Cách xử lý thông báo này?

Đã nhận ngay bây giờ: "Đã sử dụng đồng nghĩa, @ v.v ... để chặn các lỗi ..." "Hoạt động như một sự quyến rũ !!!" "Bây giờ tôi sẽ thử trên mã của tôi ..."

0

Tôi đã lưu thư cảm ơn và làm mới bằng các biến phiên.

if(!is_array($error)){ 
    $_SESSION['message'] = 'Thank You!'; 
    header('Location: yourpage.php'); 
    exit(); 
} 

và sau đó sử dụng này trong top có dạng:

if(isset($_SESSION['message'])){ 
    echo $_SESSION['message']; 
    unset($_SESSION['message']; 
} 

này nên làm mới trang và hiển thị thông báo và sau đó nếu họ làm mới trang biến phiên rỗng nên cảm ơn bạn sẽ không hiển thị. Đây được gọi là tin nhắn flash.

Các vấn đề liên quan