2016-07-12 14 views
1

Ich versuche, JSON über AJAX zu meinem PHP zu schicken, aber $_POST hat nichts und file_get_contents(“php://input”) gibt einen langen String zurück.file_get_contents ("php: // input") gibt einen langen String zurück

AJAX-Code:

function sendData(userData) { 
    alert(userData); 
    $.ajax({ 
     type: 'post', 
     url: 'testLogin.php', 
     dataType : 'json', 
     data: userData, 
     success: function (msg) { 
     if (msg.error) { 
      alert("error:" + msg.msg); 
      showError(msg.msg); 
     } else { // send to redirection page 
      alert("do something here"); 
     } 
    }, 
    error : function (XMLHttpRequest, textStatus, errorThrown) { 
     alert("ajaxError:::" + textStatus + ":::" + errorThrown); 
    } 
    }); 
} 

die Warnung vor dem AJAX zeigt { "username": "Benutzer", "Passwort": "lange Hash hier", "op": "login"}

PHP-Code:

$user = $_POST('username'); 
$pass = $_POST["pass"]; 

$logString = "user: ".$user. 
    " pass: ".$pass. 
    " SERVER-REQUEST_METHOD: ".$_SERVER['REQUEST_METHOD']. 
    " getfile: ".file_get_contents("php://input"). 
    "*\n*\n"; 
// my loging method 
logMe($logString); 

$returnMsg['msg']= $pass; 
$returnMsg['error'] = true; 
echo json_encode($returnMsg); 

Dies ist, was ich in meiner Protokolldatei

userpassSERVER-request_ erhalten

METHODPOSTgetfileusernameasdpasswordcd8d627ab216cf7fa8992ca4ff36653ca6298566dc5f7d5cc9b96ecf8141c71boplogin Dies ist, was ich bei der Rückkehr Alarm Erfolg in AJAX erhalten Fehler: null

ich nicht die file_get_contents dekodieren kann („php: // input“), weil es keine Begrenzungen gibt.

edit: Die Logme-Funktion unterbrach den Loggings-Text. Ich habe das behoben und das habe ich jetzt in meinem Logfile. Benutzer: Passwort: SERVER-REQUEST_METHOD: POST getfile: { "username": "asd", "Passwort": "cd8d627ab216cf7fa8992ca4ff36653ca6298566dc5f7d5cc9b96ecf8141c71b", "op": "login"}

so sollte ich in Ordnung sein Ich werde nur dekodieren („php: // input“) die file_get_contents

+0

Warum können Sie nicht einfach verwenden '$ _POST'? –

+1

Die erste Zeile Ihres PHP-Codes hat '$ _POST ('Benutzername');' - ist das ein Tippfehler? – andrewsi

+2

@PraveenKumar - Da die gesendeten Daten JSON sind und kein Format, das PHP zum Auffüllen von $ _POST unterstützt. – Quentin

Antwort

-1

Dies ist ein weiterer gemeinsamer Weg, es zu tun:

$entityBody = stream_get_contents(STDIN); 
$data = json_decode($entityBody, true); 
$username = $data['username']; 
$password = $data['pass']; 
+0

Aus der Frage * die Warnung vor dem AJAX zeigt {"Benutzername": "Benutzer", "Passwort": "langer Hash hier", "op": "Login"} * - Es ist ** bereits ** auf diese Weise codiert . Das Problem ist, dass es so aussieht, als ob es von der OP in PHP betrachtet wird. – Quentin

+0

Denke, du hast Recht. –

+0

Wie auch immer, der zweite Teil der Antwort ist meistens noch korrekt. –

-1

Änderung Ihr Format von Userdata zu & username = etwas & Passwort = etwas ..

+0

„Erster POST-Methode in Ajax hat Format wie diese“ - Es ** ** kann tun, aber die OP versucht, JSON-formatierte Daten zu senden. – Quentin

0

Quention war richtig, es war ein Problem mit meiner Protokollfunktion. Ich habe es in meinem Test verwendet, nur weil ich es zur Verfügung hatte, aber ich habe mich nicht darum gekümmert. Es hatte eine cleanString-Funktion, die meine Probleme verursachte.

+0

Dank @Quentin für mich in die richtige Richtung zeigen. Ich war fest, das Problem als PHP-Problem zu betrachten und war nicht in der Lage, aus dieser Box zu sehen. – user052211

+0

"Damit es mir gut geht, entschlüssele ich einfach den file_get_contents (" php: // input ")" Was Sie tatsächlich getan haben, um das Skript zum Laufen zu bringen, war, was ein paar Leute in Antworten vorgeschlagen haben, die alle abgelehnt wurden. Die Protokollierungsfunktion funktionierte nicht richtig, aber das war nicht das, was das Skript kaputt machte. Wenn Sie diese Funktion auskommentiert und keine andere Änderung vorgenommen haben, funktioniert das ursprüngliche Skript immer noch nicht. – BeetleJuice

-1

Sie müssen die Variablen selbst ausfüllen. Weil Sie JSON senden, wird PHP bauen nicht $_POST für Sie:

$json_str = file_get_contents("php://input"); 
$json_obj = json_decode($json_str); 

if(is_null($json_obj)): //if there was an error   
    die(json_last_error_msg()); 
endif; 

$username = $json_obj->username; 
$password = $json_obj->password 
-1

Zuerst $_POST ein super globale Variable ist, und es ist nicht eine Funktion $_POST('username'); $_POST['username']

Und Sie

but $_POST has nothing and file_get_contents("php://input") returns one long string.

Am Ende

 
$returnMsg['msg']= $pass; ← ← ← 
$returnMsg['error'] = true; 
echo json_encode($returnMsg); 

die $pass zu

$pass = $_POST["pass"]; 

Statt gleich ist, sollten Sie die externe Variable aus file_get_contents("php://input") selbst lesen.Folgende Benutzerfunktion zum Parsen verwendet file_get_contents("php://input"), abgerufen von PHP docs comment.

function getRealPOST() { 
    $pairs = explode("&", file_get_contents("php://input")); 
    $vars = array(); 
    foreach ($pairs as $pair) { 
     $nv = explode("=", $pair); 
     $name = urldecode($nv[0]); 
     $value = urldecode($nv[1]); 
     $vars[$name] = $value; 
    } 
    return $vars; 
} 

Und zusammen mit Ihrem Codes

header("Content-Type: application/json;charset=utf-8"); //to return the response as json 
$post = getRealPOST(); //parse the POST 
$user = $post["username"]; 
$pass = $post["pass"]; 

$logString = "user: ".$user. 
    " pass: ".$pass. 
    " SERVER-REQUEST_METHOD: ".$_SERVER['REQUEST_METHOD']. 
    " getfile: ".file_get_contents("php://input"). 
    "*\n*\n"; 
// my loging method 
logMe($logString); 

$returnMsg['msg']= $pass; 
$returnMsg['error'] = true; 
echo json_encode($returnMsg); 
+0

'explode (" & "' - so werden die JSON-Daten, die in das Skript gepostet werden, nicht geparst ... und die Frage war, wieso die Daten bei "file_get_contents" (php: // input ")' (und basiert auf einer falschen Prämisse, sollte also trotzdem geschlossen werden). – Quentin

Verwandte Themen