我有一个带有标签的表格 ng-submit="login()
ng-submit="login()
该函数在javascript中被很好地调用。
function LoginForm($scope, $http) { $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; $scope.email = "fsdg@sdf.com"; $scope.password = "1234"; $scope.login = function() { data = { 'email' : $scope.email, 'password' : $scope.password }; $http.post('resources/curl.php', data) .success(function(data, status, headers, config) { console.log(status + ' - ' + data); }) .error(function(data, status, headers, config) { console.log('error'); }); } }
我从PHP文件中获得了200 OK响应,但是返回的数据就是这样,email并且password未定义。这就是我拥有的所有php
email
password
<?php $email = $_POST['email']; $pass = $_POST['password']; echo $email; ?>
知道为什么我会得到未定义的POST值吗?
POST
编辑
我想指出,因为这似乎是一个受欢迎的问题(但它是旧的),.success并.error已被弃用,你应该使用.then如@詹姆斯氏族在commments指出
.success
.error
.then
angularjs .post()默认将Content- type标头设置为application/json。您要覆盖此内容以传递表单编码的数据,但是您没有更改data值以传递适当的查询字符串,因此PHP并未$_POST按预期填充。
.post()
application/json
data
$_POST
我的建议是只使用默认的angularjs设置application/json作为标头,读取PHP中的原始输入,然后反序列化JSON。
可以这样在PHP中实现:
$postdata = file_get_contents("php://input"); $request = json_decode($postdata); $email = $request->email; $pass = $request->password;
或者,如果您严重依赖$_POST功能,则可以形成类似的查询字符串email=someemail@email.com&password=somepassword并将其作为数据发送。确保此查询字符串是URL编码的。如果是手动构建的(而不是使用类似的东西jQuery.serialize()),则Javascript encodeURIComponent()可以为您解决问题。
email=someemail@email.com&password=somepassword
jQuery.serialize()
encodeURIComponent()