Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Referencje i funkcja z różną ilością argumentów
Crozin
post 11.08.2007, 22:43:27
Post #1





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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

Ten post edytował Crozin 11.08.2007, 22:46:03
Go to the top of the page
+Quote Post
akubiczek
post 12.08.2007, 08:27:47
Post #2





Grupa: Zarejestrowani
Postów: 189
Pomógł: 0
Dołączył: 4.07.2004
Skąd: z neostrady

Ostrzeżenie: (0%)
-----


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

Ten post edytował akubiczek 12.08.2007, 08:28:12


--------------------
pozdrawiam, Adam Kubiczek
kubiczek.eu
Go to the top of the page
+Quote Post
Crozin
post 12.08.2007, 09:46:05
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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,
Go to the top of the page
+Quote Post
UDAT
post 12.08.2007, 10:51:40
Post #4





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.06.2025 - 08:32