2011-09-30 22 views
7

Ai đó có thể giải thích cho tôi lý do bạn không thể chuyển khóa làm tài liệu tham khảo?Giải pháp thay thế để chuyển cả khóa và giá trị theo tham chiếu:

Ex:

if(is_array($where)){ 
    foreach($where as &$key => &$value){ 
     $key = sec($key); 
     $value = sec($value); 
    } 
    unset($key, $value); 
} 

Ném:

Fatal error: Key element cannot be a reference in linkstest.php on line 2 

Tôi có thể làm điều gì đó tương tự như sử dụng array_map? Tất cả những gì tôi muốn làm là lặp qua một mảng kết hợp, và thoát cả khóa và giá trị bằng hàm sec() của tôi.

đồ Mảng là khó cho tôi để hiểu:

Tôi đã thử nhiều thứ với array_map, nhưng tôi không thể làm cho nó hoạt động trên các phím trực tiếp.

Tôi có nhận được bất kỳ lợi ích hiệu suất nào khi sử dụng bản đồ mảng hơn là chỉ sử dụng vòng lặp foreach không?

Những gì tôi không thích về foreach là tôi không thể hoạt động trên các mảng trực tiếp, và phải đối phó với việc tạo ra các mảng tạm thời và unset họ:

foreach($where as $key => $value){ 
$where[secure($key)] = secure($value); 
} 

này có thể thất bại nếu nó tìm thấy một cái gì đó để thoát khỏi khóa, thêm một phần tử mới và giữ nguyên tố chưa thoát.

Vì vậy, tôi bị mắc kẹt với một cái gì đó như thế này?

$temparr = array(); 
foreach($where as $key => $value){ 
$temparr[secure($key)] = secure($value); 
} 
$where = $temparr; 
unset($temparr); 

Bất kỳ giải pháp thay thế nào?

+0

Điều này xứng đáng là một tuổi lớn * Tại sao *? Điều gì sẽ xảy ra nếu kết quả 'sec ($ key)' trong giá trị của một khóa hiện có khác? Bạn chỉ cần ghi đè khóa hiện có? Bạn cần phải giải thích lý do tại sao trong ứng dụng của bạn một chìa khóa có thể nguy hiểm. – webbiedave

+0

Tại sao nó không nguy hiểm? Bạn có thể dễ dàng thay đổi các phím $ _POST trên các biểu mẫu, hoặc với một cái gì đó như Tamperdata. Một số khóa tôi sử dụng trong các truy vấn mysql. – Ben

+0

Tôi không nói rằng họ không thể. Tôi nói bạn cần giải thích lý do tại sao trong * ứng dụng của bạn * một chìa khóa có thể nguy hiểm. Điều đó sẽ cho chúng tôi biết cách tiếp cận tốt nhất để sử dụng cho tình huống của bạn. – webbiedave

Trả lời

8

Ai đó có thể giải thích cho tôi tại sao bạn không thể vượt qua một chìa khóa để tham khảo?

Vì ngôn ngữ không hỗ trợ điều này. Bạn sẽ khó có thể tìm thấy khả năng này ở hầu hết các ngôn ngữ, do đó thuật ngữ là khóa.

Vì vậy, tôi bị kẹt với một cái gì đó như thế này?

Có. Cách tốt nhất là tạo một mảng mới với các phím thích hợp.

Bất kỳ lựa chọn thay thế nào?

Cách duy nhất để cung cấp giải pháp thay thế tốt hơn là biết tình huống cụ thể của bạn. Nếu các khóa của bạn ánh xạ tới các tên cột trong bảng, thì cách tiếp cận tốt nhất là để lại các khóa như là và thoát chúng tại thời điểm sử dụng trong SQL của bạn.

0

tại sao lại có vấn đề? Biến nó thành một hàm. Một hàm nhận đầu vào và cho đầu ra. Đầu vào chức năng của bạn sẽ là mảng "không an toàn" của bạn. Đầu ra của bạn sẽ là kết quả của việc bảo vệ mảng.

Sau đó, bạn chỉ cần làm

$where = secureMyArray($where); 

Đó là lý do tại sao bạn có khả năng thực hiện chức năng ...