Как правильно использовать AngularJS $ http.post для обновления таблицы MySQLi через PHP? - PullRequest
0 голосов
/ 16 января 2019

Я хочу обновить таблицу MySQLi achievements через PHP. Приложение написано на AngularJS и измеряет различные статистические данные. Когда цель достигнута, я отправляю информацию в PHP-скрипт, используя AngularJS $http.post. Затем PHP должен обработать информацию и соответствующим образом обновить мою таблицу. $http.post возвращает сообщение об успехе, но таблица не обновляется. Я уверен, что информация о соединении с базой данных верна.

Моя функция AngularJS $scope.updatePhp с использованием $http.post:

$scope.updatePhp = function(table, column, value, whereColumn, whereValue) {
    $http.post(
        "update-data.php", {
            'table': table,
            'column': column,
            'value': value,
            'whereColumn': whereColumn,
            'whereValue': whereValue
        }
    );
}

Моя функция AngularJS $scope.updatePhp без использования ярлыка .post:

$scope.updatePhp = function(table, column, value, whereColumn, whereValue) {

    console.log("Updating. Table: " + table + ", column: " + column + ", value: " + value + ", where: " + whereColumn + ", whereValue: " + whereValue);

    $http({
        method: 'POST',
        url: 'update-data.php',
        data: { table: table.toString(), column: column.toString(), value: value.toString(), whereColumn: whereColumn.toString(), whereValue: whereValue.toString() },
        headers: { 'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8' } 
    }).then(function successCallback(response) {
        console.log("Success.");
    }, function errorCallback(response) {
        console.log("Error.");
    });

}

Весь мой PHP-файл 'update-data.php`:

<?php

    //CORS header stuff
    header("Access-Control-Allow-Origin: *");

    //PHP posted info
    $info = file_get_contents('php://input');

    //Update the table
    $hostname_DB = "databaseHost";
    $database_DB = "databaseName";
    $username_DB = "databaseUser";
    $password_DB = "databasePass";
    $portnum_DB = "databasePort";
    $mysqli = mysqli_connect($hostname_DB, $username_DB, $password_DB, $database_DB, $portnum_DB ) or die(mysqli_error());

    $table = $info->table;
    $column = $info->column;
    $value = $info->value;
    $whereColumn = $info->whereColumn;
    $whereValue = $info->whereValue;

    $query = "UPDATE '$table' SET '$column' = '$value' WHERE '$whereColumn' = '$whereValue' ";
    $mysqli->query($query) or die(mysqli_error());  

?>

Я использую PHP error_log и получаю эту ошибку для каждой переменной table, column, value и т. Д.:

PHP Notice: Trying to get property 'table' of non-object in /update-data.php on line 16.

Определенно, что-то не так с тем, как публикуется информация, или с тем, как извлекается опубликованная информация, а не с SQL.

Заранее благодарю за любую помощь, которую вы можете оказать в решении этой ситуации!

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Попробуйте не использовать $ .param () для данных. Вы можете отправить объект данных напрямую.

$scope.updatePhp = function(table, column, value, whereColumn, whereValue) {

console.log("Updating. Table: " + table + ", column: " + column + ", value: " + value + ", where: " + whereColumn + ", whereValue: " + whereValue);

$http({
    method: 'POST',
    url: 'update-data.php',
    data: { 
        table: table.toString(),
        column: column.toString(),
        value: value.toString(),
        hereColumn: whereColumn.toString(),
        whereValue: whereValue.toString() 
    },
    headers: { 'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8' } 
}).then(function successCallback(response) {
    console.log("Success.");
}, function errorCallback(response) {
    console.log("Error.");
});

}
0 голосов
/ 05 февраля 2019

Проблема заключалась в способе форматирования данных. Вот моя $info переменная напечатана:

{"table":"achievements","column":"Goal","value":1,"whereColumn":"id","whereValue":"1"}

Строка из file_get_contents('php://input') заключена в фигурные скобки и разделяет запятую каждое значение, оба из которых мне пришлось удалить.

Мне также пришлось избавиться от кавычек для каждой пары ключ-значение строки, и, поскольку все, что я хотел, это значение, мне пришлось избавиться от всего, начиная с : и до этого («ключ», если вы будет).

Вот мой (хотя и хакерский) результат, который отлично сработал:

//PHP posted info
    $info = file_get_contents('php://input');
    $dataArr = explode(',',$data);

    $dCount = 0;
    foreach ($dataArr as $datum) {
        $newDatum = substr($datum, strpos($datum, ":") + 1);
        $newDatum = str_replace(array('}', '{', '"'), '', $newDatum);
        $dataArr[$dCount] = $newDatum;
        $dCount++;
    }

    $table = $dataArr[0];
    $column = $dataArr[1];
    $value = $dataArr[2];
    $whereColumn = $dataArr[3];
    $whereValue = $dataArr[4];
0 голосов
/ 31 января 2019

Возможно, ошибка в $ .param ().

        data: $.param({ table: table.toString(), column: column.toString(), value: value.toString(), whereColumn: whereColumn.toString(), whereValue: whereValue.toString() })

$. Param () - это функция JQuery.

Проверьте это: AngularJSParamSerializer

Попробуйте без кодирования / декодирования json проверить, работает ли он.

РЕДАКТИРОВАТЬ (комментарий ответчика):"В вашем php попробуйте echo file_get_contents('php://input') ; И в javascript в обратном вызове запроса console.log(response); Чтобы увидеть, если некоторые данные успешно отправлены."

...