Re: Extra Data in POST response
| From: | George Langley | Date: | Mon, 13 Feb 2023 17:59:47 +0000 |
| Subject: | Re: Extra Data in POST response | ||
| References: | 1 2 3 4 5 6 7 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-328151@lists.php.net to get a copy of this message | ||
On Feb 13, 2023, at 7:35 AM, John Iliffe <john.iliffe@iliffe.ca> wrote:
>
> On Mon, 2023-02-13 at 04:13 +0000, Ashley Sheridan wrote:
>> On 13/02/2023 03:35, John Iliffe wrote:
>>> On Sun, 2023-02-12 at 22:41 +0000, Ashley Sheridan wrote:
>>>> On 12/02/2023 22:29, John Iliffe wrote:
>>>>> On Sun, 2023-02-12 at 21:15 +0000, Ashley Sheridan wrote:
>>>>>> On 12/02/2023 19:49, John Iliffe wrote:
>>>>>>> I seem to be getting extraneous data in the response sent to the
>>>>>>> browser by PHP.
>>>>>>>
>>>>>>> The server query is an AJAX request in json format which is received
>>>>>>> and
>>>>>>> processed correctly and the result is sent using the "echo"
>>>>>>> function. I have
>>>>>>> checked and the area where the response is constructed is empty when
>>>>>>> processing
>>>>>>> starts.
>>>>>>>
>>>>>>> The data received by the browser has BOTH the request json data
>>>>>>> followed by the
>>>>>>> correct response in the received string (result not HTML, just a string
>>>>>>> that
>>>>>>> will eventually be converted to json but so far will only be caught in
>>>>>>> the
>>>>>>> browser for display).
>>>>>>>
>>>>>>> I'm using XMLHttpObject in the browser and I haven't been
>>>>>>> able to find a way to
>>>>>>> separate the request from the response. Before I construct an elegant
>>>>>>> workaround does POST normally return the request? If not, what am I
>>>>>>> doing
>>>>>>> wrong? So far I have always used GET so I know it doesn't return
>>>>>>> the request.
>>>>>>>
>>>>>>> For completeness, here is what the server says it is sending to the
>>>>>>> browser
>>>>>>> (using echo) (The json may be wrong; I'm still just trying to
>>>>>>> receive it).
>>>>>>>
>>>>>>> ------
>>>>>>> sent to browser:
>>>>>>>
>>>>>>> "jres":[{"item_id":"5","i_type":"OL","i_name":"Student
>>>>>>> Success
>>>>>>>
>>>>>>> Pages","i_stock":"99924","i_price":"14.00","i_books_box":"0"},{"item_id":"13","i
>>>>>>> _type":"CD","i_name":"Basic Instructors
>>>>>>> Guide 9th
>>>>>>>
>>>>>>> Ed.","i_stock":"9983","i_price":"19.95","i_books_box":"0"},{"item_id":"20","i_ty
>>>>>>> pe":"SG","i_name":"Canadian Amateur Radio
>>>>>>> Basic Qualification Study
>>>>>>>
>>>>>>> Guide","i_stock":"274","i_price":"44.95","i_books_box":"20"},{"item_id":"21","i_
>>>>>>> type":"SG","i_name":"Canadian Amateur
>>>>>>> Radio Advanced Qualification Study
>>>>>>>
>>>>>>> Guide","i_stock":"1586","i_price":"49.95","i_books_box":"16"}]
>>>>>>> -----
>>>>>>>
>>>>>>> here is the original request from the browser, as decoded by server
>>>>>>> ------
>>>>>>> request method: POST
>>>>>>> requests: array (
>>>>>>> 'req' =>
>>>>>>> '{"func":"act","item":"438"}',
>>>>>>> )
>>>>>>>
>>>>>>> json last error message: No error
>>>>>>> decoded_args:
>>>>>>> func=act
>>>>>>> item=438
>>>>>>>
>>>>>>> -------
>>>>>>>
>>>>>>> and here is what the browser says it received back:
>>>>>>>
>>>>>>> -----
>>>>>>> received:-->array(2) {
>>>>>>> ["func"]=>
>>>>>>> string(3) "act"
>>>>>>> ["item"]=>
>>>>>>> string(3) "438"
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> "jres":[{"item_id":"5","i_type":"OL","i_name":"Student
>>>>>>> Success
>>>>>>>
>>>>>>> Pages","i_stock":"99924","i_price":"14.00","i_books_box":"0"},{"item_id":"13","i
>>>>>>> _type":"CD","i_name":"Basic Instructors
>>>>>>> Guide 9th
>>>>>>>
>>>>>>> Ed.","i_stock":"9983","i_price":"19.95","i_books_box":"0"},{"item_id":"20","i_ty
>>>>>>> pe":"SG","i_name":"Canadian Amateur Radio
>>>>>>> Basic Qualification Study
>>>>>>>
>>>>>>> Guide","i_stock":"274","i_price":"44.95","i_books_box":"20"},{"item_id":"21","i_
>>>>>>> type":"SG","i_name":"Canadian Amateur
>>>>>>> Radio Advanced Qualification Study
>>>>>>>
>>>>>>> Guide","i_stock":"1586","i_price":"49.95","i_books_box":"16"}]<--
>>>>>>> -----
>>>>>>>
>>>>>>> Thanks in advance for any suggestions you can give.
>>>>>>>
>>>>>>> John
>>>>>>> ======
>>>>>> Hi John,
>>>>>>
>>>>>> What does your PHP code look like? Something in it must be outputting
>>>>>> the request, as that's not something that would just occur all by
>>>>>> itself.
>>>>>>
>>>>>> Regards,
>>>>>> Ash
>>>>> Thanks for the quick response Ash. That's what I have been asking myself
>>>>> and I
>>>>> wondered if returning the query is a requirement of the POST protocol. Without
>>>>> sending the entire script, I can say that there are only two "echo"
>>>>> statements
>>>>> in it (by doing a grep for echo) and they are mutually exclusive:
>>>>>
>>>>> -----
>>>>> [John@prod04 test]$ grep -n echo ./XXXXXXb.php
>>>>> 140: echo $json_resp;
>>>>> 145: echo "<br />XXXXXb: Either func or item was not set<br
>>>>> />err is true,
>>>>> errno=" . $errno . "<br />";
>>>>> -----
>>>>> <?php
>>>>> ob_start();
>>>>> /* XXXXXXb responds to AJAX inventory report requests
>>>>> * from updated XXXXXXXX.
>>>>> *
>>>>> * Written J Iliffe 2/2023
>>>>> * copyright John Iliffe, 2023, all rights reserved.
>>>>> */
>>>>> //header('Content-Type: application/json; charset=utf-8');
>>>>> header('Content-Type: text/plain; charset=utf-8');
>>>>> $func = "";
>>>>> $item = 0;
>>>>> $err = false;
>>>>> $errno = 0;
>>>>>
>>>>> $fx = fopen("/tmp/XXXXXb.txt","w");
>>>>>
>>>>> fwrite($fx,("\nrequest method: " .
>>>>> $_SERVER['REQUEST_METHOD']));
>>>>> fwrite($fx,("\nrequests: " . var_export($_REQUEST,true)));
>>>>>
>>>>> /* get the json request block as associative array */
>>>>> if (isset($_POST['req']))
>>>>> {
>>>>> $decoded_args =
>>>>> json_decode($_POST['req'],true,5,JSON_INVALID_UTF8_IGNORE);
>>>>>
>>>>> if ((isset($decoded_args['func'])) &&
>>>>> (isset($decoded_args['item'])))
>>>>> {
>>>>> $func = $decoded_args['func'];
>>>>> $item = $decoded_args['item'];
>>>>> fwrite($fx,("\nfunc and item isset as " . $func .
>>>>> " and " . $item .
>>>>> "\n"));
>>>>> }
>>>>> else
>>>>> {
>>>>> $err = true;
>>>>> $errno = 2;
>>>>> }
>>>>>
>>>>> fwrite($fx,("\njson last error message: " .
>>>>> json_last_error_msg() .
>>>>> "\n"));
>>>>> fwrite($fx,("decoded_args:" . var_dump($decoded_args) .
>>>>> "\n"));
>>>>> fwrite($fx,("func=" . $decoded_args['func'] .
>>>>> "\n"));
>>>>> fwrite($fx,("item=" . $decoded_args['item'] .
>>>>> "\n"));
>>>>> }
>>>>> else
>>>>> {
>>>>> $err = true;
>>>>> $errno = 1;
>>>>> }
>>>>>
>>>>> /* if we are good to go here, open database, create query */
>>>>> $json_resp = '"jres":['; //json opening
>>>>>
>>>>> ----I deleted the database activity from here---
>>>>>
>>>>> if (! $err)
>>>>> {
>>>>> if (! $res)
>>>>> {
>>>>> $err=true;
>>>>> $errno = 4;
>>>>> }
>>>>> else
>>>>> {
>>>>> for ($i=0;$i<$rows;$i++)
>>>>> {
>>>>> $r_arr = pg_fetch_array($res,null,PGSQL_ASSOC);
>>>>>
>>>>> $json_rec=json_encode($r_arr,0,16);
>>>>>
>>>>> if ($json_rec === false)
>>>>> {
>>>>> fwrite ($fx,("\nrecord at " . $i . " bad,
>>>>> " .
>>>>> json_last_error_msg() . "\n"));
>>>>> }
>>>>>
>>>>>
>>>>> if (($i < $rows) && ($i != 0)) // no opening or
>>>>> trailing ','
>>>>> {
>>>>> $json_resp .= ',';
>>>>> }
>>>>>
>>>>> $json_resp .= $json_rec;
>>>>> }
>>>>>
>>>>> $json_resp .= ']';
>>>>>
>>>>> fwrite($fx,("\njson sent to browser:\n -->" . $json_resp .
>>>>> "<---\n\n\n"));
>>>>> }
>>>>> }
>>>>> }
>>>>>
>>>>> if (! $err)
>>>>> {
>>>>> echo $json_resp;
>>>>> ob_flush();
>>>>> }
>>>>> else
>>>>> {
>>>>> echo "<br />adm9005b: Either func or item was not set<br
>>>>> />err is true,
>>>>> errno=" . $errno . "<br />";
>>>>> ob_flush();
>>>>> }
>>>>>
>>>>> exit;
>>>>> ?>
>>>>> ------
>>>>>
>>>>> This is pretty much what I have so far and why it has been driving me nuts for
>>>>> several days now...the query is never repeated anywhere in the echoed output.
>>>>> What actually comes back to the browser, as you can see above, is is the result
>>>>> generated by this; prepended with PHP's analysis of the original POST
>>>>> query.
>>>>>
>>>>> Thanks for taking the time to look.
>>>>>
>>>>> John
>>>>> ======
>>>> It might be some error output, which is being supressed by the
>>>> ob_start(), and then output when you do the ob_flush(). Why are you
>>>> using those, as it's unusual for what you appear to be doing here.
>>>>
>>>> Thanks,
>>>> Ash
>>>>
>>> Thanks for the suggestion Ash. I commented out the ob_start and ob_flush
>>> statements but the problem persists.
>>>
>>> I was using buffering because I have to send headers as part of the response, at
>>> the very least the content-type header when I convert the response to json. The
>>> reason it is a simple string at the moment is that I didn't want my inexperience
>>> with json to get involved with getting the communications working properly.
>>>
>>> Regards,
>>>
>>> John
>>> ======
>>
>> Have you tried attaching a debugger, to see at what point the extra
>> output is being shown? Is it being added to the response variable
>> somewhere, possibly from the code that you removed from your excerpt?
>>
>> Also, you don't need to use object buffers if you're sending headers.
>> Typically, you'd use output buffering if you wanted to prevent something
>> from making it to the final output, or if you needed to control the
>> output during a streamed response.
>>
>> Thanks,
>> Ash
> =======
> Thank you Ash. As it turned out, the note from Janis has the answer, var_dump
> outputs rather than returning a value so it was doing a sort of a phantom "echo"
> in the background. Sorry to have wasted your time.
>
> Also, thanks very much for the comments of the output buffering. I read
> somewhere that if it was necessary to send headers then I have to buffer the
> output to avoid having any html sent before the headers and I, mistakenly,
> assumed that I would have to do that here, even though no html is being sent.
> Works properly without buffering so I will delete that. That, I suppose, is the
> result of learning while doing! (I'm the only one here that works on the
> server, and I'm also the sysadmin, operator, and network guy)
>
> Regards, and thanks,
>
> John
> ======
————————
Not a waste of time if we all learn something!
George Langley