我正在使用角度和角度材质(材质设计)依赖。
我有这个主网格,当我点击它时会创建一个图块,当我点击该图块时会出现一个弹出窗口。弹出窗口是一个带有2个输入字段的表单,它应该显示图块的x和y坐标。这些值不会显示在输入字段中,但会在我的控制台中显示。
我想要实现的是能够将这些坐标保存到我的数据库中。出于某种原因,当我点击保存时,它不会保存到我的数据库中。
以下是弹出框的代码:
<form ng-controller="AppCtrl">
<div layout="row">
<input type="text" id="coord_x" name="coordinate_x" value="" ng-model="task_coordinate_x" >
<input type="text" id="coord_y" name="coordinate_y" value="" ng-model="task_coordinate_y">
</div>
</form>
我app.js
的代码:
app.controller('AppCtrl', function($scope, $mdDialog, $http) {
$scope.save_task = function() {
$http.post('db.php?action=add_task',
{
'task_coordinate_x' : $scope.task_coordinate_x,
'task_coordinate_y' : $scope.task_coordinate_y
}
)
.success(function (data, status, headers, config) {
//$scope.get_task(); //this will fetch latest record from DB
console.log("The task has been added successfully to the DB");
console.log(data);
})
.error(function(data, status, headers, config) {
console.log("Failed to add the task to DB");
});
function snapToGrid(x, y, $element, animate) {
//Set gridsize and offsets
var gridSizeX = 60;
var offsetX = 0;
var gridSizeY = 69;
var offsetY = 10;
//calculate the x and y positions on the grid
var newX = x - ( x % gridSizeX );
var newY = y - ( y % gridSizeY );
// pass the x and x to the popup hidden input field to be able to save to db
localStorage.setItem('coordinateX', newX);
localStorage.setItem('coordinateY', newY);
console.log("NewX: " + newX);
console.log("NewY: " + newY);
//apply the new positions
if(animate){
$element.animate({
top: offsetY + newY,
left: offsetX + newX,
}, 200)
}else{
$element.css({
top: offsetY + newY,
left: offsetX + newX,
})
}
}
};
这是我的PHP代码:
<?php
include('config.php');
switch($_GET['action']) {
case 'add_task' :
add_task();
break;
}
/** Function to add a task to db **/
function add_task() {
$data = json_decode(file_get_contents("php://input"));
$task_coordinate_x = $data->task_coordinate_x;
$task_coordinate_y = $data->task_coordinate_y;
print_r($data);
$qry = 'INSERT INTO tblTask(task_coordinate_x, task_coordinate_y)
VALUES ("'
. $task_coordinate_x . '","'
. $task_coordinate_y . '")';
echo ($qry);
$qry_res = mysql_query($qry);
if ($qry_res) {
$arr = array('msg' => "Task added successfully!!!", 'error' => '');
$jsn = json_encode($arr);
// print_r($jsn);
}
else {
$arr = array('msg' => "", 'error' => 'Error in inserting record');
$jsn = json_encode($arr);
// print_r($jsn);
}
}
?>
答案 0 :(得分:3)
我认为问题可能发生在php
在地址栏中输入: http://yourservername.com/db.php/action=debug
制作一个php函数
switch($_GET['action']) {
case 'debug' :
debug();
break;
}
function debug() {
$qry = 'INSERT INTO tblTask(task_coordinate_x, task_coordinate_y)
VALUES ("'
some value '","'
some value '")'
or trigger_error("Query Failed! SQL: $sql - Error: ".mysqli_error(), E_USER_ERROR
);}
并确保其工作
我希望它有所帮助。
答案 1 :(得分:2)
这是PHP代码中的问题,您没有正确使用关联数组。你也对angular .post().error()
方法有一个重大的误解。
$task_coordinate_x = $data->task_coordinate_x;
$task_coordinate_y = $data->task_coordinate_y;
应该是
$task_coordinate_x = $data['task_coordinate_x'];
$task_coordinate_y = $data['task_coordinate_y'];
这就是为什么你的后端是空白/没有返回任何东西。我已通过此测试验证了这一点:
<?php
$array = ['test' => 'testval'];
echo $array->test;
?>
这将返回一个空白页面,没有任何回显。如果您有PHP类,->
用于对象属性。关联数组和类在PHP中非常不同。试试echo $array['test']
即可。
另一件事是你正在定义add_task函数,但从不调用它!在文件末尾包含add_task();
另外,你的php函数以回显数组结束,对于它们返回一个值然后输出为JSON将是一个更好的做法,你会明白为什么
假设您修改add_task函数以返回该$qry_res
变量。然后,在调用该函数后,您可以创建更好的输出
$qry_res = addtask();
$response = [];
if($qry_res){
$response['success'] = true;
$response['message'] = "Task added successfully";
}
else {
$response['success'] = false;
$response['message'] = "Task not added";
}
echo json_encode($response);
另一个非常有用的建议是您在$qry_res = mysql_query($qry)
行上执行某种错误检查。如果查询失败,请将该错误消息连接到$ response ['message'](在函数内确保声明global $response
),(另一个非常有用的PHP调试技术是output buffer)。
现在有了这个响应,我们可以使用angular来查看任务是否成功完成,通过检查data.success如下:(数据是来自PHP的响应,现在形成的JSON要好得多)
您对.post().error()
方法也存在重大误解。这将在HTTP / POST请求失败时执行,而不是PHP成功与否,请参阅如何让角度实际检测到php是否成功:
.success(function(data, status, headers, config) {
console.log(data.message);
if(data.success){
// query was successful
}
else {
// query was unsuccessful
}
})
.error(function(data, status, headers, config) {
console.log("Failed to reach PHP file or recieve response");
});
希望这是有帮助的
答案 2 :(得分:1)
您无法在函数内访问全局变量(在本例中为数据库连接),这就是您无法将数据插入数据库的原因。请在下面找到PHP代码并进行更新,希望它对您有用!!
对我而言,这是完美的工作!!
<?php
class createCon {
var $host = 'localhost';
var $user = 'root';
var $pass = 'root';
var $db = 'tblTask';
var $myconn;
public function connect() {
$con = mysqli_connect($this->host, $this->user, $this->pass, $this->db);
if (!$con) {
die('Could not connect to database!');
} else {
$this->myconn = $con;
//echo 'Connection established!';
}
return $this->myconn;
}
public function close() {
mysqli_close($myconn);
echo 'Connection closed!';
}
}
$connection = new createCon();
$connection->connect();
if($_GET['action'] == 'add_task'){
$data = json_decode(file_get_contents("php://input"));
$task_coordinate_x = $data->task_coordinate_x;
$task_coordinate_y = $data->task_coordinate_y;
$qry = 'INSERT INTO tblTask(task_coordinate_x, task_coordinate_y)
VALUES ("'
. $task_coordinate_x . '","'
. $task_coordinate_y . '")';
if ( mysqli_query($connection->myconn, $qry)) {
echo "Success";
} else {
echo "Fail";
}
}
?>
如果您有任何疑问,请告诉我!!