[PHP]Filtrowanie danych.

0

Gdy filtruje dane w ten sposób:

 
function zabezpieczenie($dane)
{
	if(!get_magic_quotes_gpc)
	{
		addslashes($dane);
	}
	htmlspecialchars($dane);
	trim($dane);
	stripslashes($dane);
	return $dane;
}

$login=zabezpieczenie($_POST['login']);

to otrzymuje błędy

Warning: htmlspecialchars() expects parameter 1 to be string, array given in C:\xampp\htdocs\sklep\rejestracja.php on line 30

Warning: trim() expects parameter 1 to be string, array given in C:\xampp\htdocs\sklep\rejestracja.php on line 31

Warning: stripslashes() expects parameter 1 to be string, array given in C:\xampp\htdocs\sklep\rejestracja.php on line 32

Wie ktoś może jak temu zaradzić?
Czy są lepsze sposoby na filtrowanie danych?

0

Wygląda na to, że $dane to tablica, a funkcje oczekują łańcucha. Więc jeśli $dane to tablica łańcuchów rób to wszystko w pęli

function zabezpieczenie($dane)
{
for($x = 0; $x < count($dane); $x++)
   {
   if(!get_magic_quotes_gpc())
      $dane[$x] = addslashes($dane[$x]);
   $dane[$x] = htmlspecialchars($dane[$x]);
   $dane[$x] = trim($dane[$x]);
   $dane[$x] = stripslashes($dane[$x]);
   }
return $dane;
}
0

Zauważ proszę, że Twoja funkcja... w ogóle nie działa. Zwraca to samo, co otrzymała.

Funkcje takie jak trim, addslashes, stripslashes, htmlspecialchars NIE modyfikują danych wejściowych. One oczekują, że podasz im jako parametr jeden ciąg znaków i zwracają inny ciąg znaków. Tego podanego jako parametr nie modyfikują.

Jeśli napiszesz coś takiego:

$dane = '  foo  ';
trim($dane);
echo "[$dane]";

To funkcja trim() nic nam nie da. Wyświetlone zostanie [ foo ], czyli spacje z początku i końca ciągu nie będą ucięte. Bo funkcja trim nie modyfikuje parametru $dane. Ona zwraca nowy ciąg, pozbawiony spacji na początku i na końcu. Ale my ten zwracany ciąg ignorujemy. Powinniśmy go przypisać do zmiennej, w ten sposób:

$dane = '  foo  ';
$danePrzefiltrowane = trim($dane);
echo "[$danePrzefiltrowane]";

Teraz zapisujemy wynik działania funkcji trim w zmiennej $danePrzefiltrowane, a potem wyświetlamy tę zmienną. Tym razem to zadziała, wyświetlony będzie ciąg [foo].

Nic nie stoi na przeszkodzie, żeby wynik funkcji zapisać nie do nowej zmiennej ($danePrzefiltrowane), tylko z powrotem do zmiennej $dane. Wtedy wygląda to tak:

$dane = '  foo  ';
$dane = trim($dane);
echo "[$dane]";

Zrozum to i zapamiętaj sobie, że jeśli chcesz zmodyfikować zmienną przekazaną do funkcji takich jak trim, stripslashes itp., to robisz to nie tak:

// źle! to nie robi nic pożytecznego! zmienna $dane nie jest modyfikowana!
trim($dane);
stripslashes($dane);

tylko tak:

// źle! to nie robi nic pożytecznego!
$dane = trim($dane);
$dane = stripslashes($dane);

To BARDZO ważne, bo bez tego Twoja funkcja niczego pożytecznego nie robi (!). Dziwne, że nikt tego nie zauważył. Szczególnie Tobie, elektroniku, powinno wyjść w testach, że funkcja w ogóle niczego nie robi...

0

Zgodnie z sugestią powyżej przede wszystkim sprawdziłbym co trafia do funkcji modyfikując ją:

function zabezpieczenie($dane)
{
   print_r($dane);
   exit;
  //reszta kodu 
}
0

@elektronik:
Upewnij się po prostu, że faktycznie przekazujesz do funkcji $_POST['login'], a nie np. samo $_POST. Upewnij się, że nie majstrujesz wcześniej przy $_POST['login'] i że w HTML-u formularza nazwę (name) login ma jakieś normalne pole tekstowe.

madmike słusznie zauważył, że funkcja zabezpieczenie otrzymuje tablicę, a nie ciąg znaków, i napisał odpowiedni kod kompensujący. Ja się jednak obawiam, że być może wcale nie chcesz przekazywać funkcji tablicy i myślisz, że przekazujesz jej ciąg, a w rzeczywistości tak nie jest. To sugeruje, że błąd jest na innym poziomie, a funkcja zabezpieczenie powinna operować na ciągach, a nie na tablicach (jak w kodzie kompensującym madmike'a -- który to kod może kompensować błąd zupełnie w innym miejscu; my powinniśmy znaleźć ten oryginalny błąd).

0

Dzięki za pomoc, problem już rozwiązałem dzięki waszej pomocy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1