PHP හි ඉල්ලීම් වර්ගය හඳුනාගැනීම (GET, POST, PUT හෝ DELETE)


943

PHP හි භාවිතා කළ ඉල්ලීම් වර්ගය (GET, POST, PUT හෝ DELETE) හඳුනා ගන්නේ කෙසේද?


21
HEAD =) අමතක නොකරන්න (විකල්ප, TRACE සහ CONNECT, නමුත් PHP කවදාවත් ඒවා ලබා ගනී යැයි මම නොසිතමි).
gnud

4
කොහොමද PATCH?
Pmpr

1
පැච් ද හොඳින් ක්‍රියාත්මක වේ. $_SERVER['REQUEST_METHOD'] === 'PATCH'
ursuleacv

Answers:


1348

භාවිතා කිරීම මගින්

$_SERVER['REQUEST_METHOD']

උදාහරණයක්

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
     // The request is using the POST method
}

වැඩි විස්තර සඳහා කරුණාකර $ _SERVER විචල්‍යය සඳහා වන ප්‍රලේඛනය බලන්න .


129
+1 ඒ සඳහා - සැකයක් ඇති විට, var_dump ($ _ SERVER) සහ පිළිතුර බොහෝ විට පවතිනු ඇත.
පෝල් ඩික්සන්

10
ඔබ mypage.php වෙත තැපැල් කළහොත් කුමක් සිදුවේද? Var = යමක්?
nickf

2
ක්‍රමය POST වනු ඇත, නමුත් එම විචල්‍යයන් ලබා ගැනීම සඳහා ඔබට $ _GET භාවිතා කිරීමට සිදුවුවහොත් මට විශ්වාස නැත.
OIS

24
මගේ අත්දැකීම් අනුව එය වැරදිය. ඔබ mypage.php? Var = යමක් වෙත තැපැල් කළහොත් 'යමක්' ඇතුලත් වේ $_GET['var'].
ඩේවිඩ් ගැලගර්

15
$_POSTහා $_GETතරමක් අවාසනාවකට නම් කර ඇත. $_GETHTTP ක්‍රමය නොසලකා URL හි විමසුම් සංරචකයේ විචල්‍යයන් අඩංගු වේ. $_POSTඉල්ලීම යවා ඇත්නම් පෝරම ක්ෂේත්‍ර අඩංගු වේ application/x-www-form-urlencoded.
පී.ජේ ඩීට්ස්

224

PHP හි REST ඉතා සරල ලෙස කළ හැකිය. Http://example.com/test.php සාදන්න (පහත දක්වා ඇත). REST ඇමතුම් සඳහා මෙය භාවිතා කරන්න, උදා: http://example.com/test.php/testing/123/hello . මෙය Apache සහ Lighttpd සමඟ පිටතින් ක්‍රියාත්මක වන අතර නැවත ලිවීමේ නීති අවශ්‍ය නොවේ.

<?php
$method = $_SERVER['REQUEST_METHOD'];
$request = explode("/", substr(@$_SERVER['PATH_INFO'], 1));

switch ($method) {
  case 'PUT':
    do_something_with_put($request);  
    break;
  case 'POST':
    do_something_with_post($request);  
    break;
  case 'GET':
    do_something_with_get($request);  
    break;
  default:
    handle_error($request);  
    break;
}

20
ඔබේ API ලබා ගැනීමට ඔබට අවශ්‍ය නම්, ඔබ භාවිතා කරන අර්ථකථන එන්ජිම උපුටා දක්වන්නේ නැතිව, RewriteRule ^ api /(.*)$ api.php / $ 1 හි RewriteEngine අඩංගු .htaccess ගොනුවක් එක් කරන්න. මෙය ඔබගේ API ගොනුව api ලෙස හැඳින්වේ. php. එසේම, ඉහත කේත කොටස ලියා ඇති බැවින්, PHP සංවර්ධකයින් විසින් භේදයේ ක්‍රියාකාරිත්වය ක්ෂය කර ඇත. ඔබ භේදය පුපුරා යාම වෙනුවට ආදේශ කළහොත් එය හොඳින් ක්‍රියාත්මක වේ.
JonTheNiceGuy

10
සමග මොකක්ද @ක දී ඉදිරිපිට $_SERVER['PATH_INFO']?
ස්විෂ්

10
@ ස්විෂ්, ඔබ දුටු මොනතරම් විස්තරයක්ද! PHP Notice: Undefined index: PATH_INFOPATH_INFO නොමැති විට එය ඉවත් වේ $_SERVER. මම මේ මොහොතේම මගේ උපක්‍රම මල්ලට එකතු කරමි! එය "මෙම අරාව තුළ ඒ ආකාරයෙන් නම් කිරීමක් නොතිබිය හැකි බව මම දනිමි. මම ඒ සඳහා සුදානම්ය, එබැවින් කට වසාගෙන මම ඔබට කියන දේ කරන්න". :) ස්තූතියි යාලුවනේ, මේ පිළිතුර පළ කිරීම ගැනත් එහි ඇති එම චරිතය කෙරෙහි මගේ අවධානය යොමු කිරීම ගැනත්.
inkredibl

16
මම සාමාන්‍යයෙන් use වෙනුවට හිස් එකක් භාවිතා කරමි. වඩා හොඳ පුහුණුව?
ජිල්ට්

8
විචල්ය ක්‍රම භාවිතා කරමින් වඩාත් සංක්ෂිප්ත ක්‍රමයක් ලෙස: <?php $request = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); $rest = 'rest_'.strtolower($_SERVER['REQUEST_METHOD']); if (function_exists($rest)) call_user_func($rest, $request); ?>
සැන්ඩ්විර්ම්

21

REQUEST METHODපහත දැක්වෙන කේත ස්නිපටය භාවිතයෙන් HTTP ක්‍රමය හෝ ඊනියා හඳුනා ගැනීම කළ හැකිය.

$method = $_SERVER['REQUEST_METHOD'];
if ($method == 'POST'){
    // Method is POST
} elseif ($method == 'GET'){
    // Method is GET
} elseif ($method == 'PUT'){
    // Method is PUT
} elseif ($method == 'DELETE'){
    // Method is DELETE
} else {
    // Method unknown
}

ප්‍රකාශයට switchවඩා ඔබ මෙය කැමති නම් ඔබට එය භාවිතා කළ හැකිය if-else.

හැර වෙනත් ක්රමයක් නම්, GETහෝ POSTලෙස HTML ස්වරූපයෙන් අවශ්ය වේ, බොහෝ විට ස්වරූපයෙන් සඟවා ක්ෂේත්රයේ විසදිය ඇත.

<!-- DELETE method -->
<form action='' method='POST'>
    <input type="hidden" name'_METHOD' value="DELETE">
</form>

<!-- PUT method -->
<form action='' method='POST'>
    <input type="hidden" name'_METHOD' value="PUT">
</form>

HTTP ක්‍රම පිළිබඳ වැඩි විස්තර සඳහා මම පහත දැක්වෙන StackOverflow ප්‍රශ්නය වෙත යොමු වීමට කැමැත්තෙමි:

HTTP ප්‍රොටෝකෝලයෙහි PUT සහ DELETE සහ PHP හි ඒවායේ භාවිතය


12

ආදාන සනීපාරක්ෂාව තුළින් ආරක්ෂාව සපයන අතරම ඉල්ලීම් ක්‍රමය හඳුනා ගැනීමට අපට input_filter භාවිතා කළ හැකිය .

$request = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_ENCODED);


9

මෙය REST ගැන වන බැවින්, සේවාදායකයෙන් ඉල්ලීම් ක්‍රමය ලබා ගැනීම පමණක් ප්‍රමාණවත් නොවේ. ඔබට RESTful මාර්ග පරාමිතීන් ද ලැබිය යුතුය. RESTful පරාමිතීන් සහ GET / POST / PUT පරාමිතීන් වෙන් කිරීමට හේතුව සම්පතක් හඳුනා ගැනීම සඳහා තමන්ගේම අද්විතීය URL එකක් තිබිය යුතුය.

සිහින් භාවිතයෙන් PHP හි RESTful මාර්ග ක්‍රියාත්මක කිරීමේ එක් ක්‍රමයක් මෙන්න:

https://github.com/codeguy/Slim

$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
  echo "Hello, $name";
});
$app->run();

ඒ අනුව සේවාදායකය වින්‍යාස කරන්න.

AltoRouter භාවිතා කරන තවත් උදාහරණයක් මෙන්න:

https://github.com/dannyvankooten/AltoRouter

$router = new AltoRouter();
$router->setBasePath('/AltoRouter'); // (optional) the subdir AltoRouter lives in

// mapping routes
$router->map('GET|POST','/', 'home#index', 'home');
$router->map('GET','/users', array('c' => 'UserController', 'a' => 'ListAction'));
$router->map('GET','/users/[i:id]', 'users#show', 'users_show');
$router->map('POST','/users/[i:id]/[delete|update:action]', 'usersController#doAction', 'users_do');

OP ඉල්ලූ දේ නොවේ. තවද, OP කිසි තැනක REST ගැන සඳහන් කර නැත.
බෲනෝ Ferreira

RBRunoFerreira OP විශේෂයෙන් REST යන පදය භාවිතා නොකිරීම නිසා මම පිළිතුර මකා දැමීමට කැමතිද?
නියුරෙටින්

6
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();

මේ ආකාරයෙන් ඔබට සෙන්ඩ් රාමුව 2 හි ද සාක්ෂාත් කරගත හැකිය. ස්තූතියි.


ඔබට පාලකය තුළ කළ හැකිය $ request = $ this-> getRequest (). ඉන්පසු, $ request-> isPost (). $ Request-> getMethod () ද බලන්න.
වාසිලි ටොපොරොව්

6

එය ඉතා සරල ය $ _SERVER ['REQUEST_METHOD'] භාවිතා කරන්න;

උදාහරණයක්:

<?php
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {
  case 'GET':
    //Here Handle GET Request 
    break;
  case 'POST':
    //Here Handle POST Request 
    break;
  case 'DELETE':
    //Here Handle DELETE Request 
    break;
  case 'PUT':
    //Here Handle PUT Request 
    break;
}
?>

1
"DELETE" නඩුව කිසි විටෙකත් පහර නොදෙන බැවින් එය කළ හැකි REQUEST_METHOD නොවේ. වලංගු REQUEST_METHODs වන්නේ 'GET', 'HEAD', 'POST', 'PUT' ය. පිළිතුරක් පළ කිරීමට පෙර ප්‍රලේඛනය කියවන්න (මෙම පිටුවේම පිළිතුරු ගණනාවක පෙන්වා ඇත).
පැට්‍රික්

1
At පැට්‍රික්, ඇත්ත වශයෙන්ම, ඉල්ලීම් ක්‍රමය මකා දැමූ විට “මකන්න” නඩුව සාර්ථක වනු ඇත; එසේ වුවද PHP හි ඇති ලියකියවිලි වල එය සඳහන් නොවේ. ඇත්ත වශයෙන්ම, ඕනෑම ක්‍රමයක් $_SERVER['REQUEST_METHOD']අභිරුචිකරණය කළ ක්‍රමවේදයන් තුළ පවා පිළිබිඹු වේ. මෙම ක්‍රමය ඉල්ලීම් ශීර්ෂයේ ඇති නූලක් පමණක් බවත් එහි නිරවද්‍යතාවය පරීක්ෂා කිරීම අපගේ කර්තව්‍යය බවත් මතක තබා ගන්න.
අයිවන් ද පාස් සෙන්ටෙනෝ

1
At පැට්‍රික් මකාදැමීම RFC7231 හි අර්ථ දක්වා ඇති අතර එය සියලුම ප්‍රධාන බ්‍රව්සර්වල සහය දක්වයි. tools.ietf.org/html/rfc7231#section-4.3.5 සහ $ _SERVER ["REQUEST_METHOD"] යනු නූලක් පමණි.
රොබට් තලඩා

VanIvanDePazCenteno හරියටම. පරිශීලක ආදානය විශ්වාස නොකරන්න. පරිශීලක ආදානය විශ්වාස නොකරන්න.
රොබට් තලඩා

4

මූලික php හි ඔබට මේ ආකාරයට කළ හැකිය:

<?php

$method = $_SERVER['REQUEST_METHOD'];

switch ($method) {
  case 'GET':
    //Here Handle GET Request
    echo 'You are using '.$method.' Method';
    break;
  case 'POST':
    //Here Handle POST Request
    echo 'You are using '.$method.' Method';
    break;
  case 'PUT':
    //Here Handle PUT Request
    echo 'You are using '.$method.' Method';
    break;
  case 'PATCH':
    //Here Handle PATCH Request
    echo 'You are using '.$method.' Method';
    break;
  case 'DELETE':
    //Here Handle DELETE Request
    echo 'You are using '.$method.' Method';
    break;
  case 'COPY':
      //Here Handle COPY Request
      echo 'You are using '.$method.' Method';
      break;

  case 'OPTIONS':
      //Here Handle OPTIONS Request
      echo 'You are using '.$method.' Method';
      break;
  case 'LINK':
      //Here Handle LINK Request
      echo 'You are using '.$method.' Method';
      break;
  case 'UNLINK':
      //Here Handle UNLINK Request
      echo 'You are using '.$method.' Method';
      break;
  case 'PURGE':
      //Here Handle PURGE Request
      echo 'You are using '.$method.' Method';
      break;
  case 'LOCK':
      //Here Handle LOCK Request
      echo 'You are using '.$method.' Method';
      break;
  case 'UNLOCK':
      //Here Handle UNLOCK Request
      echo 'You are using '.$method.' Method';
      break;
  case 'PROPFIND':
      //Here Handle PROPFIND Request
      echo 'You are using '.$method.' Method';
      break;
  case 'VIEW':
      //Here Handle VIEW Request
      echo 'You are using '.$method.' Method';
      break;
  Default:
    echo 'You are using '.$method.' Method';
  break;
}


?>

1

$_GETඔබ වෙනත් වර්ගයක නිසි ඉල්ලීමක් යවන විට පවා PHP සියළුම පරාමිතීන් ජනගහනය කරන බව අතිරේකව සටහන් කිරීම වටී.

ඉහත පිළිතුරු පැතැලිව ක්රම සම්පූර්ණයෙන්ම නිවැරදි, කෙසේ වෙතත් ඔබ වෙනුවෙන් additionaly පරීක්ෂා කිරීමට අවශ්ය නම්, GETසමඟ කටයුතු පරාමිතීන් POST, DELETE, PUT, ආදිය ඉල්ලීම, ඔබ ප්රමාණය පරීක්ෂා කිරීමට අවශ්ය $_GETසාධක විය.


0

ක්රමයක් ඉල්ලා සිටි විට, එය අ array. එබැවින් සරලව පරීක්ෂා කරන්න count().

$m=['GET'=>$_GET,'POST'=>$_POST];
foreach($m as$k=>$v){
    echo count($v)?
    $k.' was requested.':null;
}

3v4l.org/U51TE


0

මම මෙම කේතය භාවිතා කළෙමි. එය ක්‍රියාත්මක විය යුතුය.

function get_request_method() {
    $request_method = strtolower($_SERVER['REQUEST_METHOD']);

    if($request_method != 'get' && $request_method != 'post') {
        return $request_method;
    }

    if($request_method == 'post' && isset($_POST['_method'])) {
        return strtolower($_POST['_method']);
    }

    return $request_method;
}

මෙම ඉහත කේතය සමඟ ක්‍රියා කරන REST callsඅතර එය සමඟද ක්‍රියා කරයිhtml form

<form method="post">
    <input name="_method" type="hidden" value="delete" />
    <input type="submit" value="Submit">
</form>

-4

ඔබට ඕනෑම විමසුම් වචන දත්ත ලබා ගත හැකිය www.example.com?id=2&name=r

ඔබ දත්ත භාවිතා විය යුතුයි $_GET['id']හෝ $_REQUEST['id'].

ආකෘති වැනි පශ්චාත් දත්ත මාර්ගයෙන් <form action='' method='POST'>ඔබ භාවිතා කළ යුතුය $_POSTහෝ $_REQUEST.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.