2015-07-03 10 views
13

Sto lavorando con dipendenza angolare e materiale angolare (design del materiale).Valori del campo di input visualizzati in console ma non nel campo di input + non in grado di salvare nel db

Ho questa griglia principale che quando clicco su di essa verrà creata una piastrella e quando clicco su quella tessera appare un pop up. In questo pop-up c'è un modulo con 2 campi di input che dovrebbero mostrare le coordinate x e y della tessera. I valori non vengono visualizzati nel campo di input, ma lo fanno nella mia console.

Quello che sto cercando di ottenere è di essere in grado di salvare queste coordinate sul mio db. Per qualche ragione quando premo save non viene salvato nel mio db.

Ecco il mio codice per la casella pop-up:

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

Il codice per la mia 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, 
      }) 
     } 
    } 

}; 

Questo è il mio codice 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

Suggerirei memorizzare le variabili di coordinate in un oggetto 'coordinates.x' e' coordinates.y' a causa dell'ereditarietà e dello stile appropriato. Li inizializzerei anche lì. Hai investigato dove fallisce? Il tuo server ottiene le variabili o non sono disponibili nel metodo 'save_task'? – enpenax

+0

@enpenax, questo è ciò che accade -> http://recordit.co/HcnJOljPxC – GY22

+0

Puoi rimuovere il comando print_r() e provare? Non sono completamente sicuro di ciò, ma PHP non esegue oltre print_r() se è chiamato – srthu

risposta

3

Penso che la problema potrebbe accadere in php

tipo nella barra degli indirizzi: http://yourservername.com/db.php/action=debug

fare una funzione 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 

);} 

e assicurarsi che il suo lavoro

spero che aiuta.

+0

spero esattamente questo aiuto perché ora ho appena ottenuto una pagina vuota – GY22

+0

È mio piacere @ GY22 .... E non farlo dimenticare di valutare la mia risposta .... –

+0

scusa penso che tu mi abbia frainteso. Come esattamente il tuo bit di codice mi aiuterà perché quando lo uso ora ottengo solo una pagina bianca .... – GY22

1

Non è possibile accedere variabile globale (In questo caso il vostro DB Connection) all'interno della vostra funzione, Ecco perché non si è in grado di inserire i dati nel database. Si prega di trovare il codice PHP qui sotto e aggiornare, spero che funzionerà per voi !!

Per me funziona perfettamente!

<?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";  
    }  
} 

?> 

Se avete qualche domanda per favore fatemelo sapere !!

+0

@ GY22 qualsiasi feedback? – s1lam8u

+0

ho rinunciato a tutto il php e ho deciso di andare con node e mongo (quindi per prima cosa funziona molto più facilmente per me). ma grazie in qualsiasi modo per la tua risposta – GY22

+0

aggiornamento Pls o accettare! – s1lam8u

2

Questo è il problema nel codice PHP, non si stanno utilizzando correttamente gli array associativi. Hai anche un grosso fraintendimento del metodo .post().error() di angular.

$task_coordinate_x   = $data->task_coordinate_x; 
$task_coordinate_y   = $data->task_coordinate_y; 

dovrebbe essere

$task_coordinate_x   = $data['task_coordinate_x']; 
$task_coordinate_y   = $data['task_coordinate_y']; 

Questo è il motivo per cui il vostro back-end è vuoto/non tornare nulla. Ho verificato questo con questo test:

<?php 
$array = ['test' => 'testval']; 
echo $array->test; 
?> 

Questo restituisce una pagina vuota, non viene emesso nulla. Lo -> viene utilizzato per le proprietà dell'oggetto, se si dispone di una classe PHP. Array e classi associativi sono molto diversi in PHP. Prova echo $array['test'] e funziona.

Un'altra cosa è che si sta definendo la funzione add_task, ma mai invoca!alla fine del file di inclusione add_task();

Inoltre, il fine funzioni PHP facendo eco gli array, sarebbe una pratica molto meglio per loro di tornare un valore e poi essere emessi come JSON, capirete perché

dire che si modifica la funzione add_task per restituire una variabile $qry_res. Poi, dopo aver chiamato quella funzione è possibile creare le uscite molto meglio

$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); 

Un altro suggerimento molto utile sarebbe per voi per eseguire un qualche tipo di controllo degli errori sulla linea $qry_res = mysql_query($qry). Se la query fallisce, concatena quel messaggio di errore a $ response ['message'] (all'interno della funzione assicurati di dichiarare global $response), (un'altra tecnica di debugging PHP molto utile è la output buffer).

Ora, con questa risposta, possiamo usare angolare per verificare se l'operazione è stata completata con successo, controllando il data.success in questo modo: (i dati è la risposta da PHP che ormai è molto meglio formato JSON)

Hai anche un grosso malinteso sul metodo .post().error(). Questo sarà eseguito quando il/richiesta HTTP POST non riesce, se non il PHP ha avuto successo o no, vedere come avere angolare in realtà rilevare se il php riuscito:

.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"); 
}); 

Spero che questo è stato utile

+0

@ GY22 Hai detto che sei passato al nodo, vorrei che tu lo avessi visto prima perché era un fraintendimento degli array associativi php. Penso che se avessi messo un paio di echo degli input avresti visto che stava fallendo a '$ data-> task_cordinate_x', è importante farlo debugging sin dall'inizio e assicurarti di non avere ipotesi. Direi che il nodo è la nuova cosa interessante, ma il passaggio è spesso molto doloroso, specialmente se si deve ridefinire un grosso back-end. Ho provato lo switch e il nodo è in effetti molto più complicato. PHP è noto per essere il più semplice. In bocca al lupo –

Problemi correlati