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:

  1. UPLOAD_ERR_OK - Det finns inget fel, filen laddas upp med framgång.
  2. UPLOAD_ERR_INI_SIZE - Den överförda filen överskrider direktivet php.ini i php.ini .
  3. UPLOAD_ERR_PARTIAL - Den överförda filen överskrider MAX_FILE_SIZE-direktivet som anges i HTML-formuläret.
  4. UPLOAD_ERR_NO_FILE - Ingen fil laddades upp.
  5. UPLOAD_ERR_NO_TMP_DIR - Saknar en tillfällig mapp. (Från PHP 5.0.3).
  6. UPLOAD_ERR_CANT_WRITE - Det gick inte att skriva filen till disken. (Från PHP 5.1.0).
  7. 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";
7,0
$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";
7,0
$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);
5,6

$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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow