【问题标题】:Angular - $http.delete returns success but doesn't worksAngular - $http.delete 返回成功但不起作用
【发布时间】:2015-08-26 12:13:29
【问题描述】:

我有一个 Angular + PHP 应用程序,但在删除客户时遇到问题。

我没有收到任何错误,实际上,应用程序返回成功,但它并没有从我的数据库中删除客户。

这是我的角度控制器

    app.controller('consultar_cliente_controller', function($scope, $http){
    $scope.listaDeCliente = [];

    var init = function(){
        $scope.buscar();
    };

    $scope.buscar = function(){
        $http.get('consultar_cliente.php')
             .success(function(data){
                $scope.listaDeCliente = data;
             })
             .error(function(){
                console.error('Erro ao executar o GET do cliente');
             });
    };

    $scope.deletar = function(id){
        $http.delete('remover_cliente.php/' + id)
             .success(function(){
                console.log('Cliente removido com sucesso!');
                $scope.buscar();
             })
             .error(function(){
                console.error('Erro ao remover cliente');
             })
    };

    init();
});

这是我的 PHP

<?php
  $dbh = new PDO('pgsql:host=localhost;dbname=livraria_glp', 'postgres');
  /*
  * Recuperando todos os detalhes da requisição HTTP do Angular
  */ 
  $postdata = file_get_contents("php://input");
  $request  = json_decode($postdata);
  @$id      = $request->id;

  echo $id;

  $dbh->exec("DELETE FROM PRODUTO WHERE ID = '$id'") or die( $dbh->errorInfo() );

?>

这是我的 HTML

<div class="well">
  <div class="container">
      <h2>Dados</h2>
      <div class="form-group">
        <label>Nome</label>
          <input class="form-control" type="text" ng-model="filtroNome" />
      </div>
  </div>
  <div class="container resultado">      
    <table class="table">
      <thead>
        <tr>
          <th>Nome</th>
          <th>CPF</th>
          <th>E-mail</th>
        </tr>
      </thead>
      <tbody>
        <tr ng-repeat="cliente in listaDeCliente | filter : filtroNome">
          <td>{{cliente.nome}}</td>
          <td>{{cliente.cpf}}</td>
          <td>{{cliente.id}}</td>
          <td><button class="btn btn-danger" ng-click="deletar(cliente.id)">Deletar</button></td>
        </tr>
      </tbody>
    </table>
  </div>
  <button class="btn btn-success" onclick="window.location.href='javascript:window.history.go(-1)'">Voltar</button>
</div>

编辑:我在 PHP 上试过这个:

echo "DELETE FROM PRODUTO WHERE ID = '$id'";

它返回了:

从 ID = '' 的产品中删除

为什么 PHP 收不到 id?

【问题讨论】:

  • 你好SQL注入向量,再见PRODUTO表数据
  • 菲尔,这只是一个学习项目。
  • 尝试调试$postdata。一个合适的调试器会很好,但至少,试试$postdata = file_get_contents('php://input'); var_dump($postdata); exit;

标签: php html ajax angularjs database


【解决方案1】:

Angular 不会发送 DELETE 的请求正文,因此您将不得不从 URL 中读取 id。您不妨将其作为查询参数传递

$http.delete('remover_cliente.php', {
    params: {id: id}
})

然后通过$_GET['id']阅读。

<?php
if (!isset($_GET['id'])) {
    exit;
}

$id = $_GET['id'];
$dbh = new PDO('pgsql:host=localhost;dbname=livraria_glp', 'postgres');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $dbh->prepare('DELETE FROM PRODUTO WHERE ID = ?');
$stmt->execute([$id]);

echo $id;

或者(以防$_GET 不适用于DELETE 请求),您可以尝试使用强制请求消息数据

$http.delete('remover_cliente.php', {
    data: {id: id}
})

但是我不知道这是否受支持,而且它肯定不是非常 REST-ful。如果确实有效,您可以继续使用file_get_contents('php://input')json_decode()

【讨论】:

  • 耶!!您的第二个解决方案完美!除了 {data: {id: id}} 之外,没有更改我的原始代码。谢谢!!!
  • @guuilp 请注意第一部分中无 SQL 注入的 PHP 代码
  • 好的,菲尔。我对 SQL 注入的了解很差,但我会研究它并修复我的代码。如果您推荐任何材料,我将非常感谢(再次):D
【解决方案2】:

请尝试替换这个,

$scope.deletar = function(id){
    var postData = {'id' : id};
    $http.delete('remover_cliente.php', postData)
         .success(function(){
            console.log('Cliente removido com sucesso!');
            $scope.buscar();
         })
         .error(function(){
            console.error('Erro ao remover cliente');
         })
};

【讨论】:

  • 我试过了,但没有唤醒 :(,我的 php 仍然无法接收到 id 的值
  • 别担心,伙计!不幸的是,仍然没有工作=(。PHP中的语句仍然DELETE FROM PRODUTO WHERE ID =''
  • @KelvinKyaw OP 没有使用任何 PATH_INFO 数据,因此您的初始答案应该足够了。
  • @Phil 是的。但是,我无法想象为什么不能从服务器端获取这个值。
  • Kelvin,用 postData 尝试了你的更新解决方案,但仍然没有工作 =(
猜你喜欢
  • 2019-02-14
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 2015-08-06
  • 2020-03-26
相关资源
最近更新 更多