axios 无法使用PHP删除数据库条目,DELETE请求从REACT发送

fsi0uk1n  于 2023-08-04  发布在  iOS
关注(0)|答案(2)|浏览(134)

我试图删除数据库条目与DELETE http请求发送从axios在React。

function Delete() {
        const form = new FormData();
        for (var i = 0; i < selected.length; i++) {
            form.append(i, selected[i]);
          }
        console.log(form)
        axios.delete(url, form)
        navigate(`/`)
    }

字符串
正如您在这里看到的,我迭代了“selected”,它是一个数组,并将表单中的键分配为数字。例如,表单中的第一个键是1,第一个“选定”值,依此类推。然后是PHP代码。

header('Access-Control-Allow-Origin: http://localhost:3000');
header("Access-Control-Allow-Methods: GET, POST, DELETE");
$servername = "localhost";
$username = "root";
$password = "";
$conn = new mysqli($servername, $username, $password, 'commerce');
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {
  case "DELETE":
    parse_str(file_get_contents("php://input"), $_DELETE);
    for ($i = 0; $_DELETE; $i++) {
      $sku = $_DELETE[$i];
      $delete = $conn->prepare("DELETE FROM baseinfos WHERE sku='$sku'");
      $delete->execute();
    }
    break;


在这里,我应该得到DELETE表单的值,迭代键值(它们是数字,迭代应该有效)并删除数据库中相应的条目。什么都没有发生,甚至没有抛出错误。我该怎么办?

carvr3hs

carvr3hs1#

DELETE请求的主体不是一个好主意,通常应该避免。DELETE请求的目的是删除您正在使用的URL所标识的资源。
在您的例子中,看起来您想要定义一个删除许多不同项的通用操作。POST更适合于此。
服务器和客户端 * 可能 * 丢弃DELETE请求体,因为DELETE请求体没有意义。
最新的HTTP规范:
虽然请求消息帧独立于所使用的方法,但DELETE请求中接收的内容没有一般定义的语义,不能改变请求的含义或目标,并且可能导致一些实现拒绝请求并关闭连接,因为它可能是请求走私攻击([HTTP/1.1]的第11.2节)。客户端不应在DELETE请求中生成内容,除非该请求是直接发送给源服务器的,该源服务器先前已在带内或带外指示该请求具有目的并将得到充分支持。源服务器不应该依赖私有协议来接收内容,因为HTTP通信的参与者通常不知道请求链沿着的中介。
https://www.rfc-editor.org/rfc/rfc9110.html#name-delete

sg24os4d

sg24os4d2#

第一个问题是axios.delete()的签名是
axios.delete(url[,config])
如果你想发送一个请求体,你需要在配置对象的data属性中这样做。
其次,在请求体中发送FormData使用的是content-type: multipart/form-data,而不是parse_str()使用的格式。
解析字符串,就像它是通过URL传递的查询字符串一样
我强烈建议使用JSON来代替。只需直接发送selected数组

axios.delete(url, { data: selected });

字符串
Axios会将其编码为JSON,并自动设置相应的content-type: application/json头。
要在PHP端阅读这篇文章,请使用以下代码

$skusToDelete = json_decode(file_get_contents('php://input'));
$stmt = $conn->prepare('DELETE FROM baseinfos WHERE sku = ?');
$stmt->bind_param('s', $sku);
foreach ($skusToDelete as $sku) {
    $stmt->execute();
}


注意,我使用了绑定的SQL查询参数a lot safer。您也只需要准备一个查询语句和绑定参数一次。然后可以在循环中执行它。

相关问题