2011-01-17 37 views
7

Bạn cần trợ giúp trong một tình huống bất thường. Tôi cần phải cắt tất cả các biến $ _POST.

Có cách nào để tôi có thể thực hiện điều đó tại một ảnh duy nhất tức là sử dụng một chức năng duy nhất không?

Tôi biết trim ($ _ POST) sẽ không làm, tôi phải thực hiện một số chức năng như

function sanatize_post(){ 
    foreach ($_POST as $key => $val) 
     $_POST[$key] = trim($val); 
} 

Nhưng, nếu bạn có bất cứ đề nghị hoặc nhận xét khác, xin vui lòng giúp tôi.

Cảm ơn

+0

Nếu bạn đang viết một thư viện hay một khuôn khổ thì bạn nên cung cấp thêm hơn 'trim'. Nếu không, đối với một trang hoặc một dự án cụ thể, bạn không nên xử lý toàn bộ một cách mù quáng toàn bộ '$ _POST'. Bạn nên biết chính xác giá trị nào bạn cần từ '$ _POST []', chỉ nhận chúng và xử lý từng giá trị theo cách cụ thể của nó (fe, một số giá trị có thể là số, chuyển đổi thành số nguyên hoặc float tốt hơn là chỉ cắt các khoảng trống). – axiac

Trả lời

6

sử dụng array_walk với một chức năng tùy chỉnh

$clean_values = array(); 
array_walk($_POST, 'sanitize_post'); 

function sanitize_post($item, $key) 
{ 
    $clean_values[$key] = trim($item); 
    //optional further cleaning ex) htmlentities 
} 
+1

Sử dụng 'mảng_walk_recursive' thay vì' array_walk' sẽ bao gồm các trường hợp khi các trường được nhóm trong biểu mẫu – Adam

+0

@ brian_d Trong câu trả lời này, bạn đã viết một hàm tùy chỉnh chấp nhận params $ tem và $ key, chúng được truyền vào hàm như thế nào? –

+0

@SwapnilShende: Bạn đã đọc tài liệu của 'array_walk' ?! – ThiefMaster

9

array_walk($_POST, 'trim') (lưu ý rằng đây và ý tưởng có thể bị phá vỡ như là đầu vào name = foo [thanh] được dịch sang một mảng)

Edit: ở trên là không chính xác. Hãy thử $_POST = array_map('trim', $_POST);.

+2

Ngoài ra còn có 'đệ quy thân của mình http://php.net/manual/en/function.array-walk-recursive.php –

+0

bạn có thể giải thích cho tôi ý bạn là gì không? "(Lưu ý rằng điều này và ý tưởng có thể là bị hỏng khi tên đầu vào = foo [thanh] được dịch thành một mảng) " –

+0

@ IM-JM: xem này: http: // stackoverflow.com/a/5806722/2093695 –

1

Đơn giản chỉ cần sử dụng này:

array_walk($_POST, create_function('&$val', '$val = trim($val);')); 

và $ _POST của bạn bây giờ được tỉa.

7

Đơn giản chỉ cần:

$_POST = array_map("trim", $_POST); 
1

Tôi nghĩ rằng nó tốt hơn để sử dụng chức năng ẩn danh:

array_walk($_POST, function(& $value){ 
    $value = trim($value); 
}); 
1

Bạn cũng có thể sử dụng mã này tôi đã viết trong trường hợp bạn muốn để khử trùng một chuỗi hoặc một mảng với một chức năng:

function sanitize ($value) { 
    // sanitize array or string values 
    if (is_array($value)) { 
     array_walk_recursive($value, 'sanitize_value'); 
    } 
    else { 
     sanitize_value($value); 
    } 

    return $value; 
} 

function sanitize_value (&$value) { 
    $value = trim(htmlspecialchars($value)); 
} 

Đơn giản chỉ cần sử dụng nó như thế này:

$post_sanitized = sanitize($_POST); 
$apple_sanitized = sanitize('apple'); 
1
$_POST = array_map("trim", $_POST); 

tôi nghĩ điều đó có thể giúp bạn!

0

Các câu trả lời khác không hoạt động tốt với các mảng kết hợp. Hàm đệ quy này sẽ cắt tất cả các giá trị bên trong một mảng $ _POST tất cả các cấp xuống.

// Trim all values of associative array 
function trim_associative_array(&$input_array) { 
    if (is_array($input_array)) { 
     foreach ($input_array as $key => &$val) { 
      if (is_array($val)) { 
       trim_associative_array($val); 
      } else { 
       $input_array[$key] = trim($val); 
      } 
     } 
    } 
} 
0

Dưới đây là một lớp lót đó cũng sẽ làm việc, hoặc trên các giá trị duy nhất hoặc đệ quy trên mảng:

$_POST = filter_var($_POST, \FILTER_CALLBACK, ['options' => 'trim']); 
Các vấn đề liên quan