Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Referencje i funkcja z różną ilością argumentów
Forum PHP.pl > Forum > PHP
Crozin
Witajcie...
piszę małą aplikację i chciałem w jakiś "wygodny" sposób filtrować dane które trafiają do bazy (głównie mysql_real_escape_string).
Ale napotkałem na mały problem, a mianowicie:
  1. <?php
  2. $zmienna='test';
  3. $zmienna2='inny test "dalszy ciag" i jeszcze cos';
  4. $db->escape(&$zmienna, &$zmienna2);
  5. echo $zmienna.' | '.$zmienna2;
  6. ?>
I oczywiście metoda escape (przykładowa):
  1. <?php
  2. public function escape($a, $b){
  3. $a=mysql_real_escape_string($a, self::$connection);
  4. $b=mysql_real_escape_string($b, self::$connection);
  5. }
  6. ?>
Wynik jaki dostaniemy:
  1. test | inny test \"dalszy ciag\" i jeszcze cos
No i wszystko ładnie... ale chciałbym wprowadzić pewną elastyczność - czyli różną ilość argumentów. Próbowałem robić coś w tym stylu (kod #1 jest taki sam - zmiana jedynie kodu metody)
  1. <?php
  2. public function escape(){
  3. $amount=func_num_args();
  4.  
  5. for($i=0; $i<$amount; $i++){
  6. $zmienna=func_get_arg($i);
  7. $zmienna=mysql_real_escape_string($zmienna, self::$connection); 
  8. }
  9. }
  10. ?>
Ale nie za bardzo to działa winksmiley.jpg Probowałem też z func_get_args i foreach'em, ale efekt również "nieciekawy"

Nie bardzo w ogóle wiem czy to możliwe winksmiley.jpg Ale może jest jakiś sposób?

Pozdrawiam,

EDIT:
Można by zawsze ustawić 30 argumentów dla f-cji... i każy jako opcionalny, ale to nie jest za ciekawa wersja smile.gif
akubiczek
func_get_args - zwraca zawsze kopie argumentu funkcji

Zasadniczo, wg mojej wiedzy nie ma skutecznego rozwiązania. Można kombinować:

  1. <?php
  2. for($i=0; $i<$amount; $i++){
  3. $GLOBALS[func_get_arg($i)]=mysql_real_escape_string($GLOBALS[func_get_arg($i)]);
  4. ?>


Ale to nie zadziała dla zmiennych lokalnych funkcji.

Znalazłem jeszcze takie rozwiązanie:

  1. <?php 
  2. error_reporting(E_ALL); 
  3. define('STZ_MAX_ARGUMENTS', 1023); 
  4. $set_to_zero = create_function(  '&$a'. implode(',&$a', range(0, STZ_MAX_ARGUMENTS)),  'for ($i=0; $i <= STZ_MAX_ARGUMENTS; $i++) ${"a$i"} = 0;' ); 
  5. $a = 1; $b = 2; $c = 3; 
  6. @$set_to_zero($a, $b, $c); 
  7. echo "$a $b $c"; // prints "0 0 0"; 
  8. ?>


Ale to raczej też nie zachwyca smile.gif
Crozin
Pomysł tak szybko jak wymyśliłem, równie szybko porzuciłem winksmiley.jpg
Poprostu często używam/będę używać danych w taki sposób:
Kod
zmienna='test"test'
tutaj jakies zapytanie - zmienna przyjmuje wartosc test\"test
tutaj dalsze operacje... ale niestety zmienna 'zmienna' ma jakies krzaczki, ktorych nie chce;)
Dodatkowo zrobilem mały test wydajności winksmiley.jpg
$set_to_zero przy 1000 powtórzeń - średnio równa sekunda winksmiley.jpg
zwykla f-cja z trzeba arg, robiąca to samo - średnio 0.0003sekundy
(chociaż muszę zaznaczyć, że w chwili testów komuter "ledwo żył")

Pozostaje pisanie za każdym razem ręcznie $db->escape() ale przecież nie będę szczędził klawiszy dla bezpieczeństa winksmiley.jpg

Pozdrawiam,
UDAT
A nie możesz, po prostu, przekazywać argumentów jako tablicy przekazywanej przez referencję?

Poza tym nie radzę używać funkcji create_function - create_function() is not your friend
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.