【问题标题】:Use $http angularjs Callback properly with php?用 php 正确使用 $http angularjs 回调?
【发布时间】:2017-05-06 12:56:32
【问题描述】:

所以我试图向 php 发送一个 $http angularjs 请求,但它会触发successCallback(这是否意味着我的请求成功?)但是当我检查我的数据库时什么也没发生,我的数据仍然存在.我知道我在这里遗漏了一些东西。请帮忙。

控制器(调用checkPollCodeIfAvail函数)

pollFactory.checkPollCodeIfAvail('qwe123').then(function successCallback(response){
    console.log('success');
}, function errorCallback(response){
    console.log('fail');
});

工厂:

factory.checkPollCodeIfAvail = function(x){
    code = x;
    return $http({
        method: 'POST',
        data: {
            'action' : 'checkPollCode',
            'pollCode' : code
        },
        url: 'http://localhost/poll/api.php'
    });
};

return factory;

api.php

if(empty($_POST['action'])){
    return;
}

if(($_POST['action']) == "checkPollCode"){
    $checkPollCode = $_POST['pollCode'];
}

switch ($_POST['action']) {
    case 'checkPollCode':
        $sql = "DELETE FROM polls WHERE pollCode = :pollcode";
        $stmt = $db_con->prepare($sql);
        $stmt->bindParam(":pollcode", $checkPollCode);
        $stmt->execute();
        if($stmt->rowCount() > 0){
            echo "success";
        }else{
            echo "error";
        }
        break;
}

感谢任何可以帮助我的人。

【问题讨论】:

  • 你的方法是GET,但在php中是POST
  • 感谢您的回复,但我尝试将其更改为POST,但仍然无法正常工作。
  • 为什么在 php 中使用 switch case。尝试直接删除并以角度删除successCallback
  • used 切换,因为我将在我的 php 文件中执行一些操作。为什么我必须删除successCallback
  • 你不需要它,并且在角度你应该在发送之前转换数据。让我尝试创建答案

标签: php angularjs


【解决方案1】:

在角度尝试添加这个

 return $http({
        method: 'POST',
        data: {
            'action' : 'checkPollCode',
            'pollCode' : code
        },
        url: 'http://localhost/poll/api.php'
        transformRequest:function(obj) {
                var str=[];
            for(var p in obj){
    str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]))
                                }
                                return str.join("&");
                            },
                headers:{'Content-Type':'application/x-www-form-urlencoded'}
    }).then(function(response){
    console.log('success');
}

angular 的默认类型 header 是 application/json ,如果你不改变 header ,你应该在 php 中解码输入。我对php不熟悉,我改成form-urlencoded。

对于 application/x-www-form-urlencoded,发送给服务器的 HTTP 消息的主体本质上是一个巨大的查询字符串——名称/值对由 & 分隔,名称与等号 (=) 的值。这方面的一个例子是:

MyVariableOne=ValueOne&MyVariableTwo=ValueTwo

还有这段代码

transformRequest:function(obj) {
                    var str=[];
                for(var p in obj){
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]))
                                    }
                                    return str.join("&");
                                }

在向服务器发送数据之前,您循环遍历数据并将其转换为x-www-form-urlencoded

【讨论】:

  • 这行得通,谢谢,但我是 angularjs 的新手,我不太了解这段代码,为什么我需要这样做。你能解释一下这里发生了什么吗?
  • @CityDove 我编辑了答案并尝试解释。我的英语不好,所以我很难解释清楚
  • @ThanTung 我明白了。谢谢!我有另一个问题。 .then(function(response)中的response是我的php中回显的“成功”吗?
  • @CityDove 你是什么意思?如果您的意思是在 php 中显示 echo"success",您应该在 php 中创建数组并放置消息 echo 并对其进行编码。
  • 像这样:$ar = array() ar['message'] ='success' json_encode($ar); 和角度$scope.sucess = response.data.message;
【解决方案2】:

你在 Http 中有一些 pbm

试试这个代码:

var fd = new FormData();
fd.append('action', "checkPollCode");
fd.append('pollCode', code);

$http.post("http://localhost/poll/api.php", fd, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
}).success(function(data, status, headers, conf) {
    //Evrytheng OK
}).
error(function(data, status, headers, config) {
    alert("You have some error");
});

不要忘记在控制器中添加 $Http:

app.controller('YourController', ['$scope', '$http',function($scope, $http){...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多