我有一个表单输入用户的详细信息,并将它们添加到数据库中,还检索这些详细信息,并显示在一个表中


I have a form to input user details to and add them to a database and also retrieve those details and display it in a table

我在angular js中这样做,这是一种练习,但我卡住了。我刚接触angularjs。我正在做的是发送帖子,并得到相同的php页面,并使用开关来执行适当的代码。但是当我执行它时,我得到了错误:

angular.js:12520 SyntaxError: Unexpected token < in JSON at position 0

我有两个问题,
1. 为什么我得到这个错误?我做错了什么?
2. 我已经打开了错误报告,但我没有得到任何错误。为什么?

如果你在我的代码中看到一些愚蠢的地方,请原谅我,并帮助我把它做得更好。

AngDemo.html:

<!DOCTYPE html>
<html>
<head>
    <title>AngularJS Demo</title>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js">
    </script>
    <style type="text/css">
    table, th , td  {
                      border: 1px solid grey;
                      border-collapse: collapse;
                      padding: 5px;
                    }
                    table tr:nth-child(odd) {
                      background-color: #f1f1f1;
                    }
                    table tr:nth-child(even) {
                      background-color: #ffffff;
                    }
    </style>
</head>
<body ng-app="demoFile">
<div ng-controller="frmCntrl" ng-init="showTable=false">
<form>
    <p> First Name: &emsp;<input type="text" ng-model="fnameAng" /> </p>
    <p> Last Name: &emsp;<input type="text" ng-model="lnameAng" /> </p>
    <p> Age: &emsp;&emsp;&emsp;&ensp;&nbsp;<input type="number" ng-model="ageAng" /> </p>
    <p> Department: 
        &ensp;&nbsp;<select ng-model="deptAng">
            <option value="">
            <option value="software">Software
            <option value="hr">HR
            <option value="tele-marketing">Tele-Marketing
            <option value="database">Database
        </select>
    </p>
    <input type="submit" value="Submit" data-ng-click="insertData()" />
    <input type="reset" value="Reset" data-ng-click="resetData()" />
</form><br>
<table>
    <thead ng-show="showTable">
        <th>First name</th>
        <th>Last name</th>
        <th>Age</th>
        <th>Department</th>
    <thead>
    <tbody>
        <tr ng-repeat="x in names">
            <td>{{x.fname}}</td>
            <td>{{x.lname}}</td>
            <td>{{x.age}}</td>
            <td>{{x.dept}}</td>         
        </tr>
    </tbody>
</table> 
</div>

</body>
<script>
    var app= angular.module('demoFile', []);
    app.controller('frmCntrl',function($scope,$http){
        $scope.insertData=function(){
            $http.post("addData.php",{
                'fnameAng':$scope.fnameAng,
                'lnameAng':$scope.lnameAng,
                'ageAng':$scope.ageAng,
                'deptAng':$scope.deptAng,
            }).then(function(response){
             console.log("response.data");});
            $scope.showTable=true;
            $http.get("addData.php")
            .then(function(response){
            $scope.names=response.data.records;});
        };
        $scope.resetData=function(){
            $scope.fnameAng="";
            $scope.lnameAng="";
            $scope.ageAng="";
            $scope.deptAng="";
        }   
    });
    /*
    app.controller('tableCntrl',function($scope,$http){
        $http.get("select.php")
        .then(function(response){
        $scope.names=response.data.records;
        })
    });*/
</script>
</html>

addData.php:

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
ini_set('display_startup_errors',1);
ini_set('display_errors',1);
error_reporting(-1); //Initializing error reporting
$uname="root";//initialzing and connecting to database
$pass="";
$dname="phptut";
mysql_connect("localhost", $uname, $pass);
@mysql_select_db($dname) or die("Cannot open Database");
$method=$_SERVER['REQUEST_METHOD'];//determining the type of request
switch($method)
{
    case 'POST':{
                echo $method;
                $data=json_decode(file_get_contents("php://input"));
                $fname=$data->fnameAng;
                $lname=$data->lnameAng;
                $age=$data->ageAng;
                $dept=$data->deptAng;
                $result = mysql_query("INSERT INTO anginfo (fname, lname, age, dept) VALUES ('$fname','$lname',$age,'$dept')");
                break;
            }
    case 'GET': {
                $result = mysql_query("SELECT fname, lname, age, dept from anginfo");//executing query
                $output=array();//converting the result object to json
                while($r = mysql_fetch_assoc($result)) 
                {
                    $output[] = $r;
                }
                $json=json_encode($output);
                $json='{"records":'.$json.'}';
                echo($json);
            }

}

mysql_free_result($result);
mysql_close();
?>

对于你的第一个问题,听起来你没有给客户端json。我不会说PHP,所以我不确定。在您的PHP文件中,看起来您没有在switch语句中定义POST处理程序。基于它说响应中的第一个字符是<的事实,我猜响应是HTML。如果我要尝试确认这一点,我会在Chrome devtools的网络选项卡中查看服务器响应的内容。

关于你的第二个问题…$http.post上的.then调用需要两次回调。第一个是您已经提供的成功处理程序。第二个是错误处理程序,您还没有提供它。您可以尝试添加错误处理程序,以查看它是否记录任何错误。它应该能帮助你确认第一个问题……php返回的是HTML而不是JSON。下面是它的样子:

$http.post(function(){
    //your code
}).then(successFunction, errorFunction);