javascript - 使用 angularjs 和 PHP (PDO) 连接 MySQL

标签 javascript php mysql angularjs

我有一个特殊的问题,由于我缺乏 Angular 和 JS 的经验,我似乎无法解决。

我有一个名为通用数据库的数据库连接类,它由 PHP 脚本“action.php”调用。 “Action.php”是通过 JS 中的 $http 方法调用的。由于需要用户端输入的灵 active ,处理功能依赖于诸如“数据”之类的变量来提交数据。 JS 允许三种用户交互模式:输入、编辑、删除。我当前困难的特点是,如果我尝试立即输入数据,则会失败(并显示自定义错误消息“发生了一些问题,请重试。”);但是,如果我先单击“编辑”,则它允许我添加新记录。编辑和删除都失败,尽管它们不显示消息,仅显示应该出现此类消息的红色框(编辑)。

我正在使用:

error_reporting(E_ALL) 

在相关的 PHP 代码中,但没有收到 PHP 错误。我还发现 JS 似乎可以通过 console.log() 访问它正在收集的所有值。大概是因为它不起作用,我错过了一些重要的东西,请帮我找到它!

此外,数据库中当前现有的记录显示正确且符合预期。

JS:

//define application
angular.module("crudApp", []).controller("userController", function($scope, $http){
        $scope.cats = [];
        $scope.tempUserData = [];

        //function to get records from the database
        $scope.getRecords = function(){
            $http.get('action.php', {
                params:{
                    'type':'view'
                }
            }).success(function(response){
                if(response.status == 'OK'){
                    $scope.cats = response.records;
                }
            });
        };

        //function to insert or update data in database
        $scope.saveCats = function(type){
            var data = $.param({
                'data':$scope.tempUserData,
                'type':type
            });
            var config = {
                headers : {
                    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
                }
            };
            $http.post("action.php", data, config).success(function(response){
                if (response.status == 'OK'){
                    if (type == 'edit'){
                        console.log($scope.cats[$scope.index].uid = $scope.tempUserData.uid);
                        console.log($scope.cats[$scope.index].Categories = $scope.tempUserData.Categories);
                    }
                    else{
                        $scope.cats.push({
                            //uid:response.uid,
                            Categories:response.data.Categories
                        });
                    }
                    $scope.catForm.$setPristine();
                    $scope.tempUserData = {};
                    $(".formData").slideUp();
                    $scope.messageSuccess(response.msg);
                }
                else {
                    console.log($scope.messageError(response.msg));
                }
            });
        };

        //function to add data
        $scope.addCat = function(){
            $scope.saveCats('add')
        };

        //function to edit data
        $scope.editCat = function(cat){
            console.log($scope.tempUserData = {
                uid: cat.uid,
                Categories: cat.Categories
            });
            $scope.index = $scope.cats.indexOf(cat);
            $(".formData").slideDown();
        };

        // function to update user data
        $scope.updateCat = function(){
            $scope.saveCats('edit');
        };

        //function to delete data
        $scope.deleteCat = function(cat){
            var conf = confirm("Are you sure you want to delete this Category?");
            if (conf == true){
                var data = console.log($.param({
                    'id': cat.uid,
                    'type': 'delete'
                }));
                var config = {
                    headers : {
                        'Content-Type' : 'application/x-www-form-urlencoded;charset=utf-8'
                    }
                };
                $http.post("action.php", data, config).success(function(response){
                    if (response.status == 'OK'){
                        var index = $scope.cats.indexOf(cat);
                        $scope.cats.splice(index,1);
                        $scope.messageSuccess(response.msg);
                    }
                    else{
                        console.log($scope.messageError(response.msg));
                    }
                });
            }
        };

        //function: display success message
        $scope.messageSuccess = function(msg){
            $('.alert-success > p').html(msg);
            $('.alert-success').show();
            $('.alert-success').delay(5000).slideUp(function(){
                $('.alert-success > p').html('');
            });
        };

        //function: display error message
        $scope.messageError = function(msg){
            $('.alert-danger > p').html(msg);
            $('.alert-danger').show();
            $('.alert-danger').delay(5000).slideUp(function(){
                $('.alert-danger > p').html('');
            });
        };

    });

HTML:

<div class="container well" ng-controller="userController" ng-init="getRecords()">
    <div class="row cinzel">
        <div class="panel panel-default users-content">
            <div class="panel-heading">
                Add Categories <a href="javascript:void(0);" class="glyphicon glyphicon-plus" onClick="$('.formData').slideToggle();"></a>
            </div>
            <div class="alert alert-danger none"><p></p></div>
            <div class="alert alert-success none"><p></p></div>
            <div class="panel-body none formData">
                <form class="form" name="catForm" method="POST" action="">
                    <div class="form-group">
                        <label>Category</label>
                        <input type="text" class="form-control" name="Categories" ng-model="tempUserData.Categories" />
                    </div>
                    <a href="javascript:void(0);" class="btn btn-warning" onClick="$('.formData').slideUp();">Cancel</a>
                    <a href="javascript:void(0);" class="btn btn-success" ng-hide="tempUserData.uid" ng-click="addCat()">Add Category</a>
                    <a href="javascript:void(0);" class="btn btn-success" ng-hide="!tempUserData.uid" ng-click="updateCat()">Update Category</a>
                </form>
            </div>
            <div class="panel-heading">
                View Categories <a href="javascript:void(0)" class="glyphicon glyphicon-plus" onClick="$('.viewCats').slideToggle();"></a>
            </div>
            <div class="panel-body none viewCats">
            <table class="table table-striped">
                <tr>
                    <th width="5%">#</th>
                    <th width="20%">Categories</th>
                </tr>
                <tr ng-repeat="cat in cats | orderBy:'-uid'">
                    <td>{{$index + 1}}</td>
                    <td>{{cat.Categories}}</td>
                    <td>
                        <a href="javascript:void(0);" class="glyphicon glyphicon-edit" ng-click="editCat(cat)"></a>
                        <a href="javascript:void(0);" class="glyphicon glyphicon-trash" ng-click="deleteCat(cat)"></a>
                    </td>
                </tr>
            </table>
            </div>
        </div>
    </div>

</div>

action.php:

<?php

    error_reporting(E_ALL);
    require_once("class_lib.php");

    use App\mainClasses\GeneralDB;

    $db = new GeneralDB();
    $tblName = 'cats';
    if(isset($_REQUEST['type']) && !empty($_REQUEST['type'])){
        $type = $_REQUEST['type'];
        switch($type){
            case "view":
                $records = $db->getRows($tblName);
                if($records){
                    $data['records'] = $db->getRows($tblName);
                    $data['status'] = 'OK';
                }else{
                    $data['records'] = array();
                    $data['status'] = 'ERR';
                }
                echo json_encode($data);
                break;
            case "add":
                if(!empty($_POST['data'])){
                    $userData = array(
                        'Categories' => $_POST['data']['Categories']
                    );
                    $insert = $db->insert($tblName,$userData);
                    if($insert){
                        $data['data'] = $insert;
                        $data['status'] = 'OK';
                        $data['msg'] = 'User data has been added successfully.';
                    }else{
                        $data['status'] = 'ERR';
                        $data['msg'] = 'Some problem occurred, please try again.';
                    }
                }else{
                    $data['status'] = 'ERR';
                    $data['msg'] = 'Some problem occurred, please try again.';
                }
                echo json_encode($data);
                break;
            case "edit":
                if(!empty($_POST['data'])){
                    $userData = array(
                        'Categories' => $_POST['data']['Category']
                    );
                    $condition = array('uid' => $_POST['data']['id']);
                    $update = $db->update($tblName,$userData,$condition);
                    if($update){
                        $data['status'] = 'OK';
                        $data['msg'] = 'User data has been updated successfully.';
                    }else{
                        $data['status'] = 'ERR';
                        $data['msg'] = 'Some problem occurred, please try again.';
                    }
                }else{
                    $data['status'] = 'ERR';
                    $data['msg'] = 'Some problem occurred, please try again.';
                }
                echo json_encode($data);
                break;
            case "delete":
                if(!empty($_POST['id'])){
                    $condition = array('id' => $_POST['id']);
                    $delete = $db->delete($tblName,$condition);
                    if($delete){
                        $data['status'] = 'OK';
                        $data['msg'] = 'User data has been deleted successfully.';
                    }else{
                        $data['status'] = 'ERR';
                        $data['msg'] = 'Some problem occurred, please try again.';
                    }
                }else{
                    $data['status'] = 'ERR';
                    $data['msg'] = 'Some problem occurred, please try again.';
                }
                echo json_encode($data);
                break;
            default:
                echo '{"status":"INVALID"}';
        }
    }

PHP 数据库连接:

class GeneralDB extends PDOconnect {

        private $sql;
        private static $db;

        /**
         * @param $table
         * @param array $conditions
         * @return array|bool|int|string
         */
        public function getRows($table, $conditions = array()) {

            $i=0;

            self::$db = PDOconnect::newPDO();

            $this->sql = 'SELECT';
            $this->sql .= array_key_exists("select", $conditions)?$conditions['select']:'*';
            $this->sql .= ' FROM '.$table;

            if (array_key_exists("where", $conditions)) {
                $this->sql .= ' WHERE ';
                foreach ($conditions['where'] as $key => $value) {
                    $pre = ($i>0)?' AND ':'';
                    $this->sql .= $pre.$key." = '".$value."'";
                    $i++;
                }
            }

            if (array_key_exists("order_by", $conditions)){
                $this->sql .= ' ORDER BY '.$conditions['order_by'];
            }

            if (array_key_exists("start", $conditions)&&array_key_exists("limit", $conditions)){
                $this->sql .= ' LIMIT '.$conditions['start'].','.$conditions['limit'];
            }
            elseif (!array_key_exists("start", $conditions)&&array_key_exists("limit", $conditions)){
                $this->sql .= ' LIMIT '.$conditions['limit'];
            }

            $query = self::$db->prepare($this->sql);
            $query->execute();

            if (array_key_exists("return_type",$conditions)&&$conditions['return_type']!='all') {
                switch($conditions['return_type']){
                    case 'count':
                        $data = $query->rowCount();
                        break;
                    case 'single':
                        $data = $query->fetch(PDO::FETCH_ASSOC);
                        break;
                    default:
                        $data = '';
                }
            }
            else {
                if ($query->rowCount() > 0) {
                    $data = $query->fetchAll(PDO::FETCH_ASSOC);
                }
            }

            return !empty($data)?$data:false;

        }

        public function insert($table,$data) {
            if (!empty($data)&&is_array($data)) {
                self::$db = PDOconnect::newPDO();

                $columns = '';
                $values = '';
                $i = 0;

                $columnString = implode(',', array_keys($data));
                $valueString = ":".implode(",:",array_keys($data));
                $sql = "INSERT INTO ".$table." (".$columnString.") VALUES (".$valueString.")";
                $query = self::$db->prepare($sql);

                foreach ($data as $key=>$val) {
                    $val = htmlspecialchars(strip_tags($val));
                    $query->bindParam(':'.$key,$val);
                }

                $insert = $query->execute();
                if ($insert) {
                    $data['id'] = self::$db->lastInsertId();
                    return $data;
                }
                else {
                    return false;
                }


            }
            else {
                return false;
            }
        }

        public function update($table,$data,$conditions) {
            if (!empty($data)&&is_array($data)) {
                self::$db = PDOconnect::newPDO();

                $colValSet = '';
                $whereSQL = '';
                $i = 0;

                foreach($data as $key=>$val) {
                    $pre = ($i>0)?', ':'';
                    $val = htmlspecialchars(strip_tags($val));
                    $colValSet .= $pre.$key."='".$val."'";
                    $i++;
                }

                if (!empty($conditions)&&is_array($conditions)) {
                    $whereSQL .= ' WHERE ';
                    $i = 0;
                    foreach ($conditions as $key=>$value) {
                        $pre = ($i>0)?' AND ':'';
                        $whereSQL .= $pre.$key." = '".$value."'";
                        $i++;
                    }
                }

                $sql = "UPDATE ".$table." SET ".$colValSet.$whereSQL;
                $query = self::$db->prepare($sql);
                $update = $query->execute();
                return $update?$query->rowCount():false;

            }
            else {
                return false;
            }
        }

        public function delete($table,$conditions) {
            self::$db = PDOconnect::newPDO();
            $whereSQL = '';
            $i = 0;
            if (!empty($conditions)&&is_array($conditions)) {
                $whereSQL .= ' WHERE ';
                foreach ($conditions as $key=>$value) {
                    $pre = ($i>0)?' AND ':'';
                    $whereSQL .= $pre.$key." = '".$value."'";
                    $i++;
                }

            }

            $sql = "DELETE FROM ".$table.$whereSQL;
            $delete = self::$db->exec($sql);
            return $delete?$delete:false;
        }

    }

最佳答案

如果在 $scope.saveCats 函数中的 JS 文件上添加记录,data 变量的 data 参数是数组,因此不会获取添加到您的参数列表中。

    $scope.saveCats = function(type){
         var data = $.param({
                    'data':$scope.tempUserData,
                    'type':type
         });
      ...//Your code as it is
    }

当有添加案例时,将 JS 文件中的上述代码替换为此代码

$scope.saveCats = function(type){
  var data = $.param({
           'data':$scope.tempUserData['Categories'],
           'type':type
  });
  ...//Your code as it is
}

并选择action.php中的类别数据为

 ...//Your code as it is
 case "add":
       if(!empty($_POST['data'])){
           $userData = array(
           'Categories' => $_POST['data']
       ); 
  ...//Your code as it is

关于javascript - 使用 angularjs 和 PHP (PDO) 连接 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41036471/

相关文章:

根据链接显示数据的 PHP 数组 - 跟进

php - 插入 foreach 循环

c# - JSON 数据结构 - JSON 到对象 - 最佳实践

php - 使用 Javascript 动态更改 PHP 值

php - 如何 jQuery toggle() 和隐藏切换链接或按钮?

java - 如何使用 CriteriaQuery 查询使用 @Convert 注释持久化为字符串的集合?

php - 将 Cloud SQL 中的数据导入到 CSV 文件中/将数据导出到 CSV 文件中

php - 在 php 中按日期和时间显示最近的评论

javascript - DOM 对象是在哪里诞生的?

javascript - 变量从无处传递到地理位置函数