5
votes

Comment utiliser correctement AngularJS $ http.post pour mettre à jour la table MySQLi via PHP?

Je souhaite mettre à jour une table MySQLi réalisations via PHP. L'application est codée dans AngularJS et mesure diverses statistiques. Lorsqu'un objectif est atteint, j'envoie les informations à un script PHP en utilisant $ http.post d'AngularJS. PHP devrait alors gérer les informations et mettre à jour ma table en conséquence. Le $ http.post renvoie un message de réussite, mais la table n'est pas mise à jour. Je suis convaincu que les informations de connexion à la base de données sont correctes.

Ma fonction AngularJS $ scope.updatePhp utilisant $http.post:

<?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());  

?>


10 commentaires

qu'est-ce que "port #" ? Ne devrait-il pas être 3306 ou le numéro de port de votre serveur DB?


port # est, bien sûr, mon numéro de port. Ce n'est pas vraiment pertinent pour la question, merci cependant.


Avez-vous essayé de consigner la $ query résultante et de l'exécuter directement sur la base de données dans un outil SQL?


pouvez-vous essayer quelque chose comme $ query = "UPDATE` $ table` SET `$ column` =` $ value` WHERE `$ whereColumn` =` $ whereValue` ";


@Naveen - Je n'ai malheureusement pas obtenu de résultats différents.


@Florian Lim - Bon appel, je vois que j'obtiens une erreur # 1064 lors de l'utilisation de l'outil SQL phpMyAdmin. Je suppose que l'erreur est que j'ai utilisé des guillemets simples pour la requête, comme ceci: UPDATE 'réalisations' SET 'Goal' = '1' WHERE 'id' = '1' lorsque la requête est en fait want est METTRE À JOUR les succès SET Goal = 1 WHERE id = 1 car le Goal est une valeur booléenne et id est un entier.


@FlorianLim J'ai exécuté console.log ("Query: 'UPDATE" + table + "SET" + column + "=" + value + "WHERE" + whereColumn + "=" + whereValue + "'"); < / code> dans mon AngularJS et j'ai obtenu le résultat suivant: Requête: 'UPDATE réussites SET Goal = 1 WHERE id = 1' qui devrait être bien ...


pouvez-vous essayer return mysqli_error ($ mysqli) dans votre update-data.php au lieu de die (mysqli_error ())


@RandallArms Cela ressemble à ce que vous avez connecté en JavaScript. Vous devez enregistrer la $ query résultante dans votre fichier php, puis la modifier jusqu'à ce que vous obteniez le résultat souhaité. Je n'ai pas utilisé PHP depuis longtemps, donc je ne peux pas vous aider avec la syntaxe.


@Naveen @FlorianLim J'utilise le journal d'erreur PHP et j'obtiens cette erreur pour chaque variable: Avis PHP: Essayer d'obtenir la propriété 'table' d'un non-objet dans /update-data.php à la ligne 16 . Il y a certainement quelque chose qui ne va pas avec la façon dont les informations sont publiées ou avec la façon dont les informations publiées sont récupérées, pas avec le SQL.


3 Réponses :


1
votes

L'erreur est probablement dans $ .param ().

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

$ .param () est une fonction JQuery.

Vérifiez ceci: AngularJSParamSerializer

Essayez sans encoder / décoder json pour voir si cela fonctionne.

MODIFIER (commentaire du répondeur): "Dans votre PHP, essayez echo file_get_contents ('php: // input'); Et en javascript dans le callback de la requête console.log (response); Pour voir si certaines données sont envoyées avec succès . "


6 commentaires

Pas de chance, même si j'envoie les données sans le $ .param () dans les $ http () post data et sans le json_decode () dans le update-data.php . Ma fonction $ http () donne un rappel d'erreur sans aucune information imprimée dans le PHP error_log . Bien que j'aie supprimé les éléments param / json_decode car je suis sûr que vous avez raison sur ce point.


Dans votre php, essayez de "echo file_get_contents ('php: // input');" Et en javascript dans le callback de la requête "console.log (response);" Pour voir si certaines données sont envoyées avec succès.


Ma console a enregistré la réponse suivante lors du rappel: Object {data: "", status: 200, headers: xd (), config: {…}, statusText: "OK", xhrStatus: "complete"} . Je ne suis pas tout à fait sûr de savoir comment voir le contenu de l'écho PHP, car upload-data.php n'est qu'un simple fichier PHP ouvert à partir de la requête AngularJS. EDIT: Maintenant que je regarde la réponse, elle contient des données comme vides ...


L'expansion de config {...} dans le rappel contient la section suivante, qui montre les données qui s'y trouvent: config: {…} data: {…} < / code> colonne: "WingedShoes" table: "succès" valeur: 1 whereColumn: "id" < code> whereValue: "1"


J'ai choisi cette réponse pour la prime et la réponse acceptée car elle a été la plus utile, mais je rencontre encore des difficultés (même si votre aide m'a rapproché, je pense).


J'ai décidé d'utiliser error_log () pour enregistrer à la fois $ info et $ query depuis mon update-data.php fichier. La variable $ info enregistrée EST complète: {"table": "réalisations", "column": "VaultoDiamonds", "value": 1, ‌ "whereColumn": "id" , "‌ whereValue": "1"} mais la $ query enregistrée est vide: Requête enregistrée: UPDATE '' SET '' = '' WHERE '' = ' ', qui explique l'erreur Essayer d'obtenir la propriété d'un non-objet que j'obtenais.



1
votes

Essayez de ne pas utiliser $ .param () pour les données. Vous pouvez envoyer l'objet de données directement.

$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 commentaires

0
votes

Le problème était lié au formatage des données. Voici ma variable $ info imprimée:

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

La chaîne de file_get_contents ('php: // input') était entourée de crochets et d'une virgule -séparé chaque valeur, que je devais supprimer toutes les deux.

Je devais également supprimer les guillemets pour chaque paire de chaîne clé-valeur, et comme tout ce que je voulais était la valeur, je devais obtenir débarrassez-vous de tout de : et avant (la 'clé' si vous voulez).

Voici mon résultat (bien que hacky), qui a parfaitement fonctionné:

< pré> XXX


0 commentaires