AngularJS 与 PHP:为啥我的应用程序无法保存输入文本发送的字符串?

Posted

技术标签:

【中文标题】AngularJS 与 PHP:为啥我的应用程序无法保存输入文本发送的字符串?【英文标题】:AngularJS with PHP: why my app can't save strings sent by input text?AngularJS 与 PHP:为什么我的应用程序无法保存输入文本发送的字符串? 【发布时间】:2015-06-15 04:21:12 【问题描述】:

我有一个带有 php 应用程序的 AngularJS,可以在 mysql 数据库中保存和搜索。

在我的 index.html 中,我有一个显示数据库中所有记录的表格、一个包含两个输入文本的表单和一个保存信息的按钮。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body ng-app="carApp" ng-controller="carCtrl">
    <div class="container">
        <div class="jumbotron">
            <p>Simple CRUD in AngularJS and PHP</p>
        </div>
        <table class="table">
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th>Plate</th>
            </tr>
            <tr ng-repeat="c in cars">
                <td>c.car_id</td>
                <td>c.car_name</td>
                <td>c.car_plate</td>
            </tr>
        </table>
        <br /> <br />

        <h3>New Car</h3>
        <form role="form">
            <div class="row">
                <div class="col-sm-6">
                    <div class="form-group">
                        <label>Car Name: name</label> <input type="text" ng-model="name" class="form-control">
                    </div>
                </div>
                <div class="col-sm-6">
                    <div class="form-group">
                        <label>Car Plate: plate</label> <input type="text" ng-model="plate" class="form-control">
                    </div>
                </div>
            </div>
            <button type="button" ng-click="save()" class="btn btn-primary">Save</button>
        </form>
    </div>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
    <script>
        var app = angular.module('carApp', []);
        app.controller('carCtrl', function($scope, $http) 
            $scope.cars = [];
            $scope.name = '';
            $scope.plate = '';

            getCars();

            $scope.save = function() 
                var car = 
                    name : $scope.name,
                    plate : $scope.plate
                ;

                $http.post("../database/insert/newCar.php", car).success(
                        function() 
                            console.log(car);
                            getCars();
                        );
            ;

            function getCars() 
                $http.get("../database/select/cars.php").success(
                        function(response) 
                            $scope.cars = response;
                        );
            
            ;
        );
    </script>
</body>
</html>

在数据库中搜索是可以的,但是当我尝试进行插入时,应用程序只有在两个字段都用numbers 填充时才会保存。当我尝试保存strings 时,什么都没有保存。我不知道为什么会这样,因为我在两个字段中都使用输入类型text,而数据库中的列是varchar

EG: 车名: 111111111, 车牌: 1111111111 结果: 信息已保存。 车名:333333333,车牌: 12345667 结果:信息已保存 汽车名称: 333333333,车牌:12 34 56 67 结果:信息不 已保存 车名:333 33 33 33,车牌:12345667 结果:信息未保存 汽车名称:aaaaaaaaa,汽车 车牌:bbbbbbbbb 结果:信息未保存 汽车 名称:hj3k4hjk34h,车牌:1a2b3ce49 结果:信息不 已保存

这里是 newCar.php:

<?php
    include '../connector/mysql_connection.inc';

    $json = file_get_contents('php://input');

    $car = json_decode($json);

    $sql = "INSERT INTO `testing_angular`.`car` (`car_name`, `car_plate`) VALUES (" . $car->name . ", " . $car->plate . ");"; 

    $connection->query($sql);
    $connection->close();
?>

这里是“汽车”表:

CREATE TABLE IF NOT EXISTS `car`(
    `car_id` int(11) NOT NULL AUTO_INCREMENT,
    `car_name` varchar(255) NOT NULL,
    `car_plate` varchar(50) NOT NULL,
    PRIMARY KEY (`car_id`),
    UNIQUE KEY `car_plate` (`car_plate`)
);

【问题讨论】:

您是否尝试过在插入前检查 $car ?这至少可以帮助您缩小范围。 我试过 echo $car->name;但我没有答案...... @herbert 您是否尝试过使用服务异步执行此操作? 【参考方案1】:

我认为如果您像这样引用插入值会更好:

"INSERT INTO `testing_angular`.`car` (`car_name`, `car_plate`) 
    VALUES ('" . $car->name . "', '" . $car->plate . "');";

当然,以这种方式构造语句时,SQL 注入通常会出现问题。

【讨论】:

谢谢,伙计!我以为问题出在其他地方,但不是在 SQL 中。 阅读 PDO 和准备好的语句。生活将变得更加轻松和安全。 没问题。它工作的事实有时让我首先怀疑 SQL。根据我的经验,如果问题出在 PHP 或 javascript 上,它更有可能永远无法工作。是的,准备好的陈述!【参考方案2】:

不要这样$http.post("../database/insert/newCar.php", car).success( function() console.log(car); getCars(); );

$http.post("../database/insert/newCar.php", car).success( function(respone) $scope.cars = response; );

在保存后的php文件中将搜索到的数据发送到前面。这是更有效的方法。

试着这样 $car = json_decode($json, TRUE); $sql = "INSERT INTOtesting_angular.car(car_name,car_plate) VALUES ('" . $car['name'] . "', '" . $car['plate'] . "');"; 解码后尝试 var_dump $car。

用要保存的数据手工写sql 解码功能后检查数据

【讨论】:

以上是关于AngularJS 与 PHP:为啥我的应用程序无法保存输入文本发送的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 foreach 循环与 users.json 文件中的键不匹配

为啥我的 AngularJS 视图无法在 Cordova 中加载?

AngularJS 应用程序与 XAMPP 本地主机上的 PHP 文件通信

为啥我不能在angularjs中以两种方式绑定指令组件具有相同的名称?

如何在 AngularJS 部分文件中使用 php (wordpress) 函数?

为啥我的“代码”HTML 元素没有 AngularJS Material 设置的设计?