2011-09-19 43 views
12

Tôi đang tạo một biểu mẫu và tôi chỉ tìm kiếm các cách hiệu quả hơn để làm việc. Những gì tôi có cho đến thời điểm này là:Viết tắt PHP cho mẫu đặt giá trị POST

<p><input type="text" name="transmission" value="" /></p> 
<p><input type="text" name="model" value="<?=$model;?>" /></p> 

Vì vậy, một số trong số đó sẽ có giá trị đã được đặt và một số sẽ trống. Những gì tôi muốn làm là xem form đã được thiết lập chưa, và nếu nó đã sử dụng $ _POST ['name'] làm giá trị, nếu không thì sử dụng hoặc là trống hoặc sử dụng biến trước đó mà tôi có.

<p><input type="text" name="name" value="<?php if isset($_POST['submit'])) { echo $_POST['name']; } else { echo ""; } ?>" /></p> 

Nhưng phải có cách làm ngắn hơn.

NẾU có ai có thể chỉ cho tôi theo hướng tôi thực sự sẽ đánh giá cao điều đó.

Cảm ơn bạn!

+3

ngắn hơn! = Tốt hơn –

+0

Không có gì tốt hơn 'trống ($ _ POST ['foo'])? '': $ _POST ['foo'] '- nhưng bạn có thể đặt nó vào một hàm để thuận tiện (bao gồm việc xác định một giá trị mặc định khác với' '' 'và bất kỳ phần tử nào khác mà bạn có thể yêu cầu). – Jon

Trả lời

17

Bạn có thể xác định các biến đầu kịch bản của bạn trước khi đầu ra HTML, ví dụ:

$name = isset($_POST['submit']) ? $_POST['name'] : null; 

trong phần html của bạn, bạn có thể in $ name mà không lo lắng nó không được định nghĩa

<p><input type="text" name="name" value="<?php echo $name ?>" /></p> 

Ngoài ra nếu $ _POST ['submit'] không chứa bất kỳ giá trị nào, bạn có nhiều khả năng nhận được báo cáo FALSE. Để tránh các vấn đề như vậy, hãy sử dụng array_key_exists

+0

câu trả lời hay nhưng thiếu một số tiêu chuẩn và tự động hóa. –

+0

Tôi đồng ý với bạn, xây dựng trình tạo biểu mẫu riêng là đường dẫn mà mọi nhà phát triển nên đi qua, đối với những người không muốn phát minh ra bánh xe của riêng mình, tôi khuyên bạn nên sử dụng thứ gì đó từ kho vũ khí Zend Framework. – Nazariy

+1

nhưng thẻ mở ngắn không dùng nữa vô nghĩa. –

0

Bạn có thể thử này ...

$_POST['submit'] ? echo $_POST['name'] : echo ''; 

Tôi đang sử dụng so sánh boolean thay vì chức năng isset (xem liên kết cho bảng)

http://www.php.net/manual/en/types.comparisons.php

hoặc một tùy chọn khác là ...

echo ($_POST['submit'] ? $_POST['name'] : ''); 
+0

Nếu biểu mẫu chưa được gửi, điều đó sẽ ném một thông báo. – animuson

1

Nếu không đi vào lý do không sử dụng <p> để cấu trúc các biểu mẫu của bạn, không có nhiều thứ có thể được thực hiện ngoài việc xóa else.

<p><input type="text" name="name" value="<?php if isset($_POST['name'])) echo $_POST['name']; ?>" /></p> 
5

Giống như Nazariy đã nói, bạn nên tránh nhiều PHP trong mẫu nhất có thể.
Thực tế, bạn chỉ nên có sẵn các biến mẫu đã chuẩn bị sẵn.

Vì vậy, trong mã của bạn có một cái gì đó như thế này

$FORM = array(); 
$form_fields = array('name','sex'); 
foreach($form_fields as $fname) { 
    if (isset($_POST[$fname])) { 
    $FORM[$fname] = htmlspecialchars($_POST[$fname]); 
    } else { 
    $FORM[$fname] =''; 
    } 
} 

và sau đó bạn có trơn tru và gọn gàng mẫu:

<p><input type="text" name="name" value="<?=$FORM['name']?>" /></p> 
+1

+1 cho câu trả lời nói chung và sử dụng 'htmlspecialchars()' là tốt. –

+0

Whats điểm trong điều này? Có vẻ lâu hơn với tôi. Bạn thậm chí không chỉ định charset, vì vậy bảo vệ chống lại XSS không thể là lý do. – Louis

0
<?= isset($_POST['submit'])? $_POST['name'] : ""; ?> 

là ngắn nhất bạn sẽ nhận được nó, ngoài giả sử <?= $_POST['name']; ?> (nếu tên chưa được đặt sẽ bị trống) - bạn có thể cần phải tắt cảnh báo.

Tất cả những gì được nói, đây là thực hành rất kém và mở bạn lên đến cross site scripting (XSS). Bạn nên KHÔNG làm việc này.Ngay cả trên mạng nội bộ, nếu kẻ tấn công sở hữu một máy tính có quyền truy cập vào nó, họ có thể sử dụng XSS để thực hiện bất kỳ hành động nào mà người dùng có thể.

Từ câu hỏi của bạn và mức độ chênh lệch bạn có đối với loại hình này đang lặp lại trên màn hình, tôi khuyên bạn nên sử dụng một số loại thư viện templating như Smarty. Điều này cho phép mã html của bạn trông giống như sau:

<p><input type="text" name="name" value="{name}" /></p> 
+0

Tôi đã kiểm tra Trình lọc HTML nhưng chưa hỗ trợ loại tài liệu HTML 5: ( – Drew

+0

Tôi sẽ sử dụng cách tiếp cận danh sách trắng trong thời gian này. Nếu bạn đang sử dụng tên, nó thực sự chỉ có một vài ký tự az, AZ, -, và 'nên là những thứ duy nhất cần có trong 99,99% trường hợp. – Louis

0

Tôi vừa thấy điều này từ tiêu chuẩn mã hóa wordpress. mặc dù họ không khuyến khích cho dễ đọc ..

isset($var) || $var = some_function(); 

tham khảo here

1

Shorthand <?=$_POST['name'] ?: ''?>

+0

Điều này sẽ vẫn ném một thông báo, bởi vì nó không giống như 'isset'. Nó sẽ kiểm tra liệu' $ _POST ['name'] 'rỗng hoặc không, nhưng nếu khóa không có, nó sẽ ném một thông báo –

+0

Không nếu bạn đặt' error_reporting (E_ALL & ~ E_NOTICE) 'Nếu không, như bạn nói, bạn sẽ nhận được giống như '[8] Biến không xác định: tên'. Nhưng tôi luôn báo cáo tất cả các lỗi và xử lý chúng tương ứng :) – Christian

+1

Đặt' error_reporting' để ẩn thông báo của bạn dưới tấm thảm là * không bao giờ * giải pháp. Giống như một câu nói đi: "Luôn luôn mã như thể người sẽ mã sau khi bạn là một kẻ giết người hàng loạt những người biết nơi bạn sống". I E. không giấu các lỗi, chỉ cần ngăn chặn chúng. –

0

Sử dụng các nhà điều hành php error control: @.

<?php 

    $posted_text = @$_POST['posted_text']; 
    echo $posted_text 

?> 

Nếu biến POST được đặt, nó sẽ bị loại bỏ. Nếu không, không có gì sẽ hiển thị.

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