Подтвердить что ты не робот

Значения поля ввода, отображаемого в консоли, но не в поле ввода + не могут быть сохранены в db

Я работаю с зависимостью angular и angular (материальным дизайном).

У меня есть эта основная сетка, когда я нажимаю на нее, будет создана плитка, и когда я нажму на эту плитку, появится всплывающее окно. В этом всплывающем окне есть форма с двумя полями ввода, которые должны отображать координаты x и y для плитки. Значения не отображаются в поле ввода, но они выполняются на моей консоли.

То, что я пытаюсь достичь, - это сохранить эти координаты в моем db. По какой-то причине, когда я нажимаю save, он не сохраняется в моем db.

Вот мой код для всплывающего окна:

<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);
        }
    }
?>
4b9b3361

Ответ 1

Я думаю, что проблема может возникнуть в 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

);}

и убедитесь, что его работа

Надеюсь, это поможет.

Ответ 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 - выходной буфер).

Теперь с этим ответом мы можем использовать angular, чтобы узнать, успешно ли выполнена задача, проверив data.success следующим образом: (данные - это ответ от PHP, который теперь намного лучше сформирован JSON)

У вас также есть серьезное непонимание метода .post().error(). Это будет выполнено, если запрос HTTP/POST завершится неудачно, а не если PHP был успешным или нет. Посмотрите, как angular действительно обнаруживает, удалось ли выполнить 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");
});

Надеюсь, это было полезно

Ответ 3

Вы не можете получить доступ к глобальной переменной (в данном случае к вашему соединению с БД) внутри вашей функции, поэтому вы не можете вставлять данные в базу данных. Пожалуйста, найдите 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";      
    }    
}

?>

Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать!