2015-06-11 2 views
1

У меня есть приложение Angular + PHP, и у меня проблема с удалением клиента.

У меня нет ошибки, на самом деле приложение возвращает sucecess, но оно не удаляет клиента из моей базы данных.

Это мой угловой контроллер

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> 

Edit: Я пробовал это на PHP:

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

И он вернулся:

DELETE FROM PRODUTO WHERE ID = ''

Почему не может PHP Получать идентификатор?

+0

Привет SQL инъекции вектор, прощай 'PRODUTO' данные таблицы – Phil

+0

Фил, это просто проект studdying. –

+0

Попробуйте отладить '$ postdata'. Правильный отладчик был бы хорош, но, как минимум, попробуйте '$ postdata = file_get_contents ('php: // input'); var_dump ($ PostData); exit; ' – Phil

ответ

1

Угловая не отправляет тело запроса для DELETE, так что вы будете должны прочитать id из URL. Вы можете также просто передать его в качестве параметра запроса

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

+0

YAY !! Ваше второе решение работало отлично !! не изменить свой исходный код, кроме {данных: {: ID}}. Спасибо !!! –

+0

@guuilp пожалуйста, обратите внимание на SQL-инъекции кода PHP бесплатно в первой части – Phil

+0

Ok Фил. Мои знания о SQL-инъекции очень плохо, но я буду изучать об этом и исправить мой код.Если вы порекомендуете какие-либо материалы, я буду очень благодарен (снова): D –

1

Пожалуйста, попробуйте заменить это,

$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'); 
     }) 
}; 
+0

Я пробовал, но не просил :(, мой php все еще не может получить значение id –

+0

Не беспокойтесь, человек! К сожалению, все еще не сработало = (. FROM PRODUTO WHERE ID = «» –

+0

@KelvinKyaw OP не использует какие-либо данные PATH_INFO, чтобы ваш первоначальный ответ должен бы достаточно. – Phil

Смежные вопросы