How to check if php://input is set?
Asked Answered
M

4

13

I need to check if php://input exists/isset. Does it work with PHP isset() ? What is the proper way to check it?

Madaih answered 25/9, 2013 at 17:43 Comment(2)
Look it's Schrodinger's Cat! You can't know it until you fopen it! :)Hhd
If it's std web request, you can check for $_SERVER['CONTENT_LENGTH'], apart of that there's no other way. Functions like fstat or stream_get_meta_data doesn't work in this case. :(Recollected
O
20

Try to test it with file_get_contents() (for reading) + empty() or boolean conversion (for testing):

<?php
$input = file_get_contents('php://input');

if ($input) {
   // exists
} else {
   // not exists
}

From php.net:

Note: Prior to PHP 5.6, a stream opened with php://input could only be read once; the stream did not support seek operations. However, depending on the SAPI implementation, it may be possible to open another php://input stream and restart reading. This is only possible if the request body data has been saved. Typically, this is the case for POST requests, but not other request methods, such as PUT or PROPFIND.

Orvieto answered 25/9, 2013 at 17:46 Comment(5)
In this case i`m reading base64 data from a file upload, file_get_contents only return something if it reads a true file? (i mean, if the user send a fake base64, just text, but pre formated to look like base 64, but not a true file, what would result from $input?)Madaih
@sagits yes. file_get_contents(), when using this URL-wrapper, reads any content, if it is there. No matter of content structure.Orvieto
Thank your @CORRUPT, i got a little confused about your answer, you mean that it can read the fake base 64, but will return false, or it would return true? I read on the function manual that it returns false if it can`t read the content. Can you explain me that? Thank you for your timeMadaih
@sagits it will return any content, except empty string (''), that was posted to php://input. I mean, if even fake base64 string would be there, it will return it as string.Orvieto
Thank you, im going to use [base64_decode](http://php.net/manual/pt_BR/function.base64-decode.php) to check for errors in this case.Madaih
M
2

You can get the contents of php://input using file_get_contents and check the return value to see if it's actually set:

$input = file_get_contents("php://input");
if ($input) {    
    // set     
}
else {
   // not set
}
Medlock answered 25/9, 2013 at 17:45 Comment(4)
isset() will always return true in this scenario, use !empty() or just get rid of that condition.Grivet
file_get_contents() returns string on success.Orvieto
@SamT: I think it's a good idea to check if $input is TRUE instead.Medlock
@AmalMurali I agree, strictly ;)Grivet
D
1

it returns true if variable exist and its not null

$foo = 'bar';
var_dump(isset($foo));        -> true

$baz = null;
var_dump(isset($baz));        -> false

var_dump(isset($undefined));  -> false
Disconnect answered 14/10, 2013 at 10:51 Comment(0)
R
-2

Suppose you are getting user input from a POST request you can check if it's a set like this

 if(isset($_POST['var_name']))
 {
      //for additional checking  like if  it's not  empty do this
      if(!empty($_POST['var_name']))
      {
           //Do whatever you want here
      }
 }
Reimers answered 25/9, 2013 at 17:50 Comment(3)
php://input is where POST or PUT data is located, not GET parameters.Polad
Better, although it will only work if the data is formatted properly as form data. Usually the reason to use php://input is because you need to access the raw data.Polad
agreed but i guess i just wanted to give an example of how to use iseet functionReimers

© 2022 - 2024 — McMap. All rights reserved.