user1416732
user1416732

Reputation:

Calling PHP function in itself

In the following script function clean($data) calls it within it, that I understand but how it is cleaning data in the statement $data[clean($key)] = clean($value);??? Any help is appreciated.. I am trying to figure it out as I am new to PHP. Regards.

if (ini_get('magic_quotes_gpc')) {
function clean($data) {
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $data[clean($key)] = clean($value);
        }
    } else {
        $data = stripslashes($data);
    }

    return $data;
}           

$_GET = clean($_GET);
$_POST = clean($_POST);
$_REQUEST = clean($_REQUEST);
$_COOKIE = clean($_COOKIE);

}

Upvotes: 0

Views: 829

Answers (4)

Cranio
Cranio

Reputation: 9847

The main purpose of the function is to clean an associative array or a single variable. An associative array is an array where you define keys and values for that keys; so are special arrays used in PHP like $_GET $_POST and so on.

The meaning of "cleaning" is to check whether magic quotes are active - this causes some characters in these arrays to be escaped with backslashes when you post dynamic data to a PHP page. $_GET["Scarlett"] = "O' Hara" becomes with magic quotes $_GET["Scarlett"] = "O\' Hara"

So if magic quotes are active, the function takes care of this, and slashes are stripped so that the strings retain their correct, not escaped value.

The algorithm checks if the data passed to the function is an array, if not it cleans directly the value.

$string = "Escapes\'in\'a string";
clean($string);
  • is it an array? No. Then return stripslashes(my data)

    $array = array("key\'with\'escapes"=>"value\'with\'escapes", "another\'key"=>"another value"); clean($array)

  • is it an array? Yes. So cycle through each key/value pair with foreach, take the key and clean it like the first example; then take the value and do the same and put the cleaned versions in the array.

As you see the function has two different behaviours differentiated by that "if" statement. If you pass an array, you activate the second behaviour that in turns passes couples of strings, not arrays, triggering the first behaviour.

My thought is that this function doesn't work properly, though. Anyone got the same sensation? I have it not tested yet but it seems it's not "cleaning" the key/values in the sense of replacing them, but adds the cleaned versions along the uncleaned ones.

Upvotes: 0

Muhammad Hasan Khan
Muhammad Hasan Khan

Reputation: 35126

Your Question:

So if I undertsand correctly you want to know what is the function doing in the line

 $data[clean($key)] = clean($value);

The Answer:

See the prime purpose of the function is to remove slashes from string with php's stripslashes method.

If the input item is an array then it tries to clean the keys of the array as well as the values of the array by calling itself on the key and value.

In php arrays are like hashmaps and you can iterate over the key and value both with foreach loop like following

 foreach ($data as $key => $value) {....}

So if you want to summarize the algorithm in your code snippet it would be as under

  1. Check if the input is array. If it is not then go to step 4
  2. For each item of array clean the key and value by calling clean method on it (Recursively)
  3. Return the array
  4. clean the input string using stripslashes method 5 return the cleaned input

Upvotes: 1

Dorn
Dorn

Reputation: 46

Maybe you'll understand the code better if it's put this way:

foreach ($data as $key => $value) {
            $key = clean($key); // Clean the key, the
            $value = clean($value); // Clean the value
            $data[$key] = $value; // Put it in the array that will be returned
        }

Assuming you have an array like this: $_POST = array(0 => 'foo', 1 => array('bar' => 'baz')); the following will happen:

Call clean($_POST);
call clean 0
call clean 'foo'
$return[0] = 'foo'
call clean 1
call clean 'bar'
call clean 'baz'
$return[1] = array('bar' => 'baz');

You should probably read this: http://www.codewalkers.com/c/a/Miscellaneous/Recursion-in-PHP/

Upvotes: 0

tim
tim

Reputation: 2724

From my understanding it's not cleaning the key but creates a new element with a clean key while the uncleaned key remains.

$a['foo\bar'] : val\ue

becomes

$a['foo\bar'] : val\ue

$a['foobar'] : value

Someone correct me if im wrong.

Upvotes: 0

Related Questions