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.
JavaScript
x
<!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
JavaScript
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:
JavaScript
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:
JavaScript
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
:
JavaScript
if (isset($_POST['key'])) {
array_walk($_POST['key'], function (&$a) {
foreach ($a as $key => $value) {
$a[urldecode($key)] = $value;
unset($a[$key]);
}
});
}