I have form that have input fields with multidimensional keys. And keys contains XPath queries.
When i submit my form, keys of array spoiling.
This is simple example of my code.
<!DOCTYPE html>
<html>
<body>
<?php if (isset($_POST['key'])){
var_dump($_POST['key']);
}
$attr = '//*[self::textarea or self::input]/@placeholder';
?>
<form action="" method="post">
<input type="text" name="key[1][<?php echo $attr;?>]">
<input type="submit" value="Submit">
</form>
</body>
</html>
Response of var_dump
array(1) {
[1]=>
array(1) {
["//*[self::textarea or self::input"]=>
string(3) "asd"
}
}
How can i escape keys. I hope someone can give an answer.
Please do not offer to resolve this issue with json or with another way.
Advertisement
Answer
You can use urlencode to escape the $attr value, and then use array_walk over $_POST['key'] to replace the keys with their urldecode version:
if (isset($_POST['key'])) {
array_walk($_POST['key'], function (&$a) {
$a = array(urldecode(key($a)) => current($a));
});
}
var_dump($_POST);
$attr = '//*[self::textarea or self::input]/@placeholder';
?>
<form action="" method="post">
<input type="text" name="key[1][<?php echo urlencode($attr);?>]">
<input type="submit" value="Submit">
</form>
Output:
array(1) {
["key"]=>
array(1) {
[1]=>
array(1) {
["//*[self::textarea or self::input]/@placeholder"]=>
string(3) "asd"
}
}
}
If you have multiple elements under each numeric key value, you will need to use a foreach within the array_walk:
if (isset($_POST['key'])) {
array_walk($_POST['key'], function (&$a) {
foreach ($a as $key => $value) {
$a[urldecode($key)] = $value;
unset($a[$key]);
}
});
}