PHP
Uppgifter om läsbegäran
Sök…
Anmärkningar
Att välja mellan GET och POST
GET- förfrågningar är bäst för att tillhandahålla data som behövs för att visa sidan och kan användas flera gånger (sökfrågor, datafilter ...). De är en del av URL: en, vilket betyder att de kan bokmärks och ofta återanvändas.
POST- förfrågningar å andra sidan är avsedda för att skicka data till servern bara en gång (kontaktformulär, inloggningsformulär ...). Till skillnad från GET, som bara accepterar ASCII, tillåter POST-förfrågningar också binär data, inklusive filuppladdningar .
Du kan hitta en mer detaljerad förklaring av deras skillnader här .
Begär datasäkerhetsproblem
Titta också på: vilka är sårbarheterna vid direkt användning av GET och POST?
Att hämta data från superglobalerna $ _GET och $ _POST utan någon validering anses vara dålig praxis och öppnar metoder för användare att potentiellt komma åt eller kompromissa med data genom kod- och eller SQL-injektioner . Ogiltiga data bör kontrolleras och avvisas för att förhindra sådana attacker.
Förfrågningsdata bör undvikas beroende på hur de används i kod, som anges här och här . Några olika flyktfunktioner för vanliga datainvändningsfall kan hittas i detta svar .
Hantering av filuppladdningsfel
$_FILES["FILE_NAME"]['error']
(där "FILE_NAME"
är värdet på "FILE_NAME"
, som finns i din form) kan innehålla ett av följande värden:
-
UPLOAD_ERR_OK
- Det finns inget fel, filen laddas upp med framgång. -
UPLOAD_ERR_INI_SIZE
- Den överförda filen överskrider direktivetphp.ini
iphp.ini
. -
UPLOAD_ERR_PARTIAL
- Den överförda filen överskrider MAX_FILE_SIZE-direktivet som anges i HTML-formuläret. -
UPLOAD_ERR_NO_FILE
- Ingen fil laddades upp. -
UPLOAD_ERR_NO_TMP_DIR
- Saknar en tillfällig mapp. (Från PHP 5.0.3). -
UPLOAD_ERR_CANT_WRITE
- Det gick inte att skriva filen till disken. (Från PHP 5.1.0). -
UPLOAD_ERR_EXTENSION
- Ett PHP-tillägg stoppade uppladdningen av filen. (Från PHP 5.2.0).
Ett grundläggande sätt att kontrollera om felet är:
<?php
$fileError = $_FILES["FILE_NAME"]["error"]; // where FILE_NAME is the name attribute of the file input in your form
switch($fileError) {
case UPLOAD_ERR_INI_SIZE:
// Exceeds max size in php.ini
break;
case UPLOAD_ERR_PARTIAL:
// Exceeds max size in html form
break;
case UPLOAD_ERR_NO_FILE:
// No file was uploaded
break;
case UPLOAD_ERR_NO_TMP_DIR:
// No /tmp dir to write to
break;
case UPLOAD_ERR_CANT_WRITE:
// Error writing to disk
break;
default:
// No error was faced! Phew!
break;
}
Läser POST-data
Data från en POST-begäran lagras i superglobal $_POST
i form av en associerande matris.
Observera att åtkomst till ett icke-existerande arrayobjekt genererar ett meddelande, så att existensen alltid ska kontrolleras med isset()
eller empty()
eller med null coalesce-operatören.
Exempel:
$from = isset($_POST["name"]) ? $_POST["name"] : "NO NAME";
$message = isset($_POST["message"]) ? $_POST["message"] : "NO MESSAGE";
echo "Message from $from: $message";
$from = $_POST["name"] ?? "NO NAME";
$message = $_POST["message"] ?? "NO MESSAGE";
echo "Message from $from: $message";
Läser GET-data
Data från en GET-begäran lagras i superglobal $_GET
i form av ett associerande array.
Observera att åtkomst till ett icke-existerande arrayobjekt genererar ett meddelande, så att existensen alltid ska kontrolleras med isset()
eller empty()
eller med null coalesce-operatören.
Exempel: (för URL /topics.php?author=alice&topic=php
)
$author = isset($_GET["author"]) ? $_GET["author"] : "NO AUTHOR";
$topic = isset($_GET["topic"]) ? $_GET["topic"] : "NO TOPIC";
echo "Showing posts from $author about $topic";
$author = $_GET["author"] ?? "NO AUTHOR";
$topic = $_GET["topic"] ?? "NO TOPIC";
echo "Showing posts from $author about $topic";
Läser rå POST-data
Vanligtvis är data som skickas i en POST-begäran strukturerade nyckel- / värdepar med en MIME-typ av application/x-www-form-urlencoded
. Men många applikationer som webbtjänster kräver rådata, ofta i XML- eller JSON-format, skickas istället. Dessa data kan läsas med hjälp av en av två metoder.
php://input
är en ström som ger åtkomst till den råa förfrågningsorganen.
$rawdata = file_get_contents("php://input");
// Let's say we got JSON
$decoded = json_decode($rawdata);
$HTTP_RAW_POST_DATA
är en global variabel som innehåller rå POST-data. Det är endast tillgänglig om always_populate_raw_post_data
direktivet php.ini
är aktiverad.
$rawdata = $HTTP_RAW_POST_DATA;
// Or maybe we get XML
$decoded = simplexml_load_string($rawdata);
Denna variabel har avskrivits sedan PHP version 5.6 och togs bort i PHP 7.0.
Observera att ingen av dessa metoder är tillgängliga när innehållstypen är inställd på multipart/form-data
, som används för filuppladdningar.
Ladda upp filer med HTTP PUT
PHP ger stöd för HTTP PUT-metoden som används av vissa klienter för att lagra filer på en server. PUT-förfrågningar är mycket enklare än en filuppladdning med POST-förfrågningar och de ser ut så här:
PUT /path/filename.html HTTP/1.1
I din PHP-kod skulle du sedan göra något liknande:
<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");
/* Open a file for writing */
$fp = fopen("putfile.ext", "w");
/* Read the data 1 KB at a time
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);
/* Close the streams */
fclose($fp);
fclose($putdata);
?>
Även här kan du läsa intressanta SO-frågor / svar om mottagande av fil via HTTP PUT.
Vidarebefordra matriser från POST
Vanligtvis resulterar ett HTML-formelement som skickas till PHP i ett enda värde. Till exempel:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo" value="bar"/>
<button type="submit">Submit</button>
</form>
Detta resulterar i följande utgång:
Array
(
[foo] => bar
)
Det kan dock finnas fall där du vill överföra en mängd värden. Detta kan göras genom att lägga till ett PHP-liknande suffix till namnet på HTML-elementen:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[]" value="bar"/>
<input type="hidden" name="foo[]" value="baz"/>
<button type="submit">Submit</button>
</form>
Detta resulterar i följande utgång:
Array
(
[foo] => Array
(
[0] => bar
[1] => baz
)
)
Du kan också ange arrayindex, antingen som nummer eller strängar:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[42]" value="bar"/>
<input type="hidden" name="foo[foo]" value="baz"/>
<button type="submit">Submit</button>
</form>
Vilket returnerar denna utgång:
Array
(
[foo] => Array
(
[42] => bar
[foo] => baz
)
)
Den här tekniken kan användas för att undvika efterbehandlingsslingor över $_POST
arrayen, vilket gör din kod smalare och mer kortfattad.