2011-09-30 10 views
7

Czy ktoś może mi wyjaśnić, dlaczego nie możesz przekazać klucza jako referencji?Alternatywy do przekazania klucza i wartości przez odniesienie:

Ex:

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

Zgłasza:

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

Czy mogę zrobić coś podobnego przy użyciu array_map? Wszystko, co chcę zrobić, to iterować po tablicy asocjacyjnej, a także uciec z klucza i wartości za pomocą funkcji sec().

Array mapa jest dla mnie trudne do zrozumienia:

Próbowałem wielu rzeczy z array_map, ale nie mogę zmusić go do działania na klawiszach bezpośrednio.

Czy dostanę jakąkolwiek korzyść z wydajności przy użyciu mapy tablicowej niż po prostu używając pętli foreach?

Co mi się nie podoba foreach jest to, że nie może działać na tablicy bezpośrednio, a mamy do czynienia z tworzeniem tymczasowych tablic i ich rozbrajania:

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

To może zakończyć się niepowodzeniem, jeżeli stwierdzi coś uciec w kluczu, dodając nowy element i utrzymując go bez ruchu.

Więc utknąłem z czymś takim?

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

Jakieś alternatywy?

+0

To zasługuje na wielkie stare * Dlaczego *? Co jeśli 'sec ($ key)' spowoduje wartość innego istniejącego klucza? Czy po prostu nadpisujesz istniejący klucz? Musisz wyjaśnić, dlaczego w aplikacji klucz może być niebezpieczny. – webbiedave

+0

Dlaczego nie może być niebezpieczne? Możesz łatwo zmieniać klucze $ _POST na formularzach lub z czymś takim jak Tamperdata. Niektóre klucze używam w zapytaniach mysql. – Ben

+0

Nie powiedziałem, że nie mogą być. Powiedziałem, że musisz wyjaśnić, dlaczego w * twojej aplikacji * klucz może być niebezpieczny. To nam powie najlepsze podejście do twojej sytuacji. – webbiedave

Odpowiedz

8

Czy ktoś może mi wyjaśnić, dlaczego nie można przekazać klucz jako odniesienia?

Ponieważ język nie obsługuje tego. Trudno byłoby znaleźć tę umiejętność w większości języków, stąd nazwa klucz.

Więc utknąłem z czymś takim?

Tak. Najlepszym sposobem jest utworzenie nowej tablicy za pomocą odpowiednich kluczy.

Wszelkie alternatywy?

Jedynym sposobem na zapewnienie lepszej alternatywy jest poznanie konkretnej sytuacji. Jeśli twoje klucze są odwzorowane na nazwy kolumn tabeli, najlepszym sposobem jest pozostawienie kluczy w takiej postaci, w jakiej są, i unikanie ich w momencie użycia ich w SQL.

0

Dlaczego to jest problem? Spraw, aby była to funkcja. Funkcja pobiera dane wejściowe i podaje dane wyjściowe. Wprowadzane przez ciebie funkcje będą twoją "niezabezpieczoną" tablicą. Twoje wyniki będą wynikiem zabezpieczenia tablicy.

Wtedy po prostu zrobić

$where = secureMyArray($where); 

Dlatego masz zdolność do podejmowania funkcji ...

Powiązane problemy