Re: Extra Data in POST response

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Feb 13, 2023, at 7:35 AM, John Iliffe <john.iliffe@xxxxxxxxx> 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




[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux