Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP $_POST array variables are truncated

I am using PHP 5.3.8 with Apache 2.0. I am also using Symfony 2 but that's not where the script is failing. I have a form with array variables:

<form action="/app_dev.php/admin/position/create" method="post">
  <input type="text" id="po_name" name="po[name]" required="required" maxlength="50">
  <input type="text" id="po_role" name="po[role]" required="required" maxlength="20">
</form>

Directly in the app_dev.php file (to rule out Symfony from the problem) I do:

echo file_get_contents("php://input"); // outputs: po%5Bname%5D=Developer&po%5Brole%5D=ROLE_USER
var_dump($_POST); // outputs: array(1) { ["po"]=> array(1) { ["name"]=> string(9) "Developer" } }
die();

Basically it keeps only the first variable in the array. If I change the name of the variable from po[role] to ba[role] then $_POST outputs:

array(1) {
  ["po"]=> array(1) { ["name"]=> string(9) "Developer" },
  ["ba"]=> array(1) { ["role"]=> string(9) "ROLE_USER" }
}

Typical problems I have found that can cause this issue are due to the following php.ini configuration, I also give you what are my values:

max_execution_time = 30
max_input_time = 60 
max_input_nesting_level = 64
max_input_vars = 1000
post_max_size = 8M
upload_max_filesize = 2M
memory_limit = 128M

These values seems reasonable and I think don't cause the problem, but cannot be 100% sure.

I do not have suhosin installed as I've read it can cause similar problems too.

It is also similar to this problem but the solution given would require me to rewrite the HttpFoundation Symfony component.

Also I don't want to have to rewrite the form variable without and array (e.g. po[name] to po_name) as the form are automatically generated by Symfony and this seems to be a basic feature that PHP should be able to handle.

Does someone have any idea about this problem ?

PS: this is similar to the problem described in here. Plus the problem happens on the same version of Suse (SUSE Linux Enterprise Server 11 ).

like image 951
Sylvain Avatar asked Oct 02 '12 04:10

Sylvain


People also ask

What does $_ POST do in PHP?

PHP $_POST is a PHP super global variable which is used to collect form data after submitting an HTML form with method="post". $_POST is also widely used to pass variables.

Is $_ POST an array?

The PHP built-in variable $_POST is also an array and it holds the data that we provide along with the post method.

How do you unset multiple values in PHP?

You have to use for loop for this. you can use foreach loop but it will not unset all variable one variable still remains.


2 Answers

What you're proposing works fine for me. Full test code:

<html>
<body>
<pre>
<?php
if (isset($_POST) && !empty($_POST))
{
        echo file_get_contents("php://input");
        echo "\n\n";
        var_dump($_POST);
}
?>
</pre>
<form action="" method="post">
  <input type="text" id="po_name" name="po[name]">
  <input type="text" id="po_role" name="po[role]">
  <input type="submit">
</form>
</html>

Result snippet with 'one' and 'two' values:

po%5Bname%5D=one&po%5Brole%5D=two

array(1) {
  ["po"]=>
  array(2) {
    ["name"]=>
    string(3) "one"
    ["role"]=>
    string(3) "two"
  }
}

My PHP:

PHP Version 5.3.3-7+squeeze14
CGI/FastCGI
Apache/2.2
Suhosin Patch 0.9.9.1

No issues here, so it should clearly work. If this test code doesn't work for you, my best bet is a PHP bug in the version you have (or a bug in some seemingly unrelated functionality that hasn't been mentioned anywhere).

like image 195
eis Avatar answered Nov 01 '22 04:11

eis


We finally decided to update our version of PHP to a more recent version (5.3.15) and it works fine now. So this was for sure a problem with this 5.3.8, at least the version we had.

like image 1
Sylvain Avatar answered Nov 01 '22 02:11

Sylvain