【问题标题】:How to use PATCH for updating a simple database field?如何使用 PATCH 更新简单的数据库字段?
【发布时间】:2017-02-02 06:39:26
【问题描述】:

我是 php 和 API 的新手,我正在尝试学习这些方法。但我无法执行 PATCH 或 PUT 来更新我的简单 mysql 数据库。我使用了以下代码。

if(isset($_PATCH)){     
    $con = mysqli_connect("localhost", "root", "root","wordpress");
    $sql = "UPDATE trainsample SET Location = ('$_PATCH[Location]'), Data = ('$_PATCH[Data]') WHERE Name = ('$_PATCH[Name]')";
    mysqli_query($con,$sql);
    echo "Data Updated<br>";
}
else
{
    echo "Data Not found ";
}

我使用邮递员作为 REST 客户端并尝试发送数据以更新字段。任何帮助表示赞赏。提前谢谢你。

【问题讨论】:

标签: php mysql rest api


【解决方案1】:

我找到了使用 POST 的解决方法。我是初学者,如果有更好的方法请回复。

<?php
if(isset($_POST)){  

    $con = mysqli_connect("localhost", "root", "root","wordpress");
    $sql = "UPDATE `trainsample` SET `Location`='".$_POST['Location']."', 
            `Data`='".$_POST['Data']."' WHERE `Name`='".$_POST['Name']."'";
    if (mysqli_query($con, $sql)) {
        echo "Record updated successfully";
    } 
    else {
        echo "Error updating record: " . mysqli_error($con);
    }

    mysqli_close($con);
}
else
{
    echo "Data Not found ";
}
?>

【讨论】:

  • 对我来说似乎没问题。在这里查看stackoverflow.com/questions/60174/… 以避免使用未经处理的输入进行 SQL 注入。确实,不要打扰 PATCH 而不是 POST。
  • 好的。我正在尝试使用 REST api 学习东西,但被 PATCH 和 PUT 卡住了。所以不得不使用 POST 来完成它。谢谢!
【解决方案2】:

以下是 PHP 中功能齐全的 REST 服务器:

<?php

// get the HTTP method, path and body of the request
$method = $_SERVER['REQUEST_METHOD'];
$request = explode('/', trim($_SERVER['PATH_INFO'],'/'));
$input = json_decode(file_get_contents('php://input'),true);

// connect to the mysql database
$link = mysqli_connect('localhost', 'user', 'pass', 'dbname');
mysqli_set_charset($link,'utf8');

// retrieve the table and key from the path
$table = preg_replace('/[^a-z0-9_]+/i','',array_shift($request));
$key = array_shift($request)+0;

// escape the columns and values from the input object
$columns = preg_replace('/[^a-z0-9_]+/i','',array_keys($input));
$values = array_map(function ($value) use ($link) {
  if ($value===null) return null;
  return mysqli_real_escape_string($link,(string)$value);
},array_values($input));

// build the SET part of the SQL command
$set = '';
for ($i=0;$i<count($columns);$i++) {
  $set.=($i>0?',':'').'`'.$columns[$i].'`=';
  $set.=($values[$i]===null?'NULL':'"'.$values[$i].'"');
}

// create SQL based on HTTP method
switch ($method) {
  case 'GET':
    $sql = "select * from `$table`".($key?" WHERE id=$key":''); break;
  case 'PUT':
  case 'PATCH':
    $sql = "update `$table` set $set where id=$key"; break;
  case 'POST':
    $sql = "insert into `$table` set $set"; break;
  case 'DELETE':
    $sql = "delete `$table` where id=$key"; break;
}

// excecute SQL statement
$result = mysqli_query($link,$sql);

// die if SQL statement failed
if (!$result) {
  http_response_code(404);
  die(mysqli_error());
}

// print results, insert id or affected row count
if ($method == 'GET') {
  if (!$key) echo '[';
  for ($i=0;$i<mysqli_num_rows($result);$i++) {
    echo ($i>0?',':'').json_encode(mysqli_fetch_object($result));
  }
  if (!$key) echo ']';
} elseif ($method == 'POST') {
  echo mysqli_insert_id($link);
} else {
  echo mysqli_affected_rows($link);
}

// close mysql connection
mysqli_close($link);

确实如此:

  • 支持 HTTP 动词 GET、POST、PUT、PATCH 和 DELETE
  • 正确转义所有数据以避免 SQL 注入
  • 正确处理空值

source

【讨论】:

  • 嗨,执行 PUT 是否有任何先决条件。因为我无法实现它。 case 'PUT': $sql = "UPDATE trainsample SET Name = '$_PUT[Name]' WHERE ID = '$_PUT[ID]'";休息;不是这样吗?
  • @RonySamuel:AFAIK 没有“$_PUT”这样的东西。
  • 谢谢。我无法完成 PUT 和 DELETE 操作。使用了一个函数,但值没有返回到查询中。你能帮忙吗?
  • @RonySamuel:是的。在this repo 上创建问题,我会帮助你。
猜你喜欢
  • 1970-01-01
  • 2022-11-14
  • 2017-03-09
  • 2021-03-04
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2018-04-01
相关资源
最近更新 更多