2016-10-04 10 views
0

Так что у меня проблема, когда данные, закодированные с использованием php, не правильно декодируются в javascript. Вот ошибка: ErrorPHP json encode не правильно декодирует в javascript

JSON выглядит хорошо, но javascript выдает ошибку, и я понятия не имею, почему.

Вот мой код:

JS:

function requestData(url) 
{ 
document.getElementById("spinner").style.visibility = "visible"; 

var xhttp; 
xhttp = new XMLHttpRequest(); 
xhttp.onreadystatechange = function() { 
    if (this.readyState == 4) { 
     if(this.status == 200) 
     { 
      document.getElementById("spinner").style.visibility = "hidden"; 

      console.log(this.responseText); 

      return this.responseText; 
     } 
     else 
     { 
      document.getElementById("spinner").style.visibility = "hidden"; 

      document.getElementById("errorsec").innerHTML = ":(An unknown error has happened and your request was canceled. Code: " + this.status; 

      return false; 
     } 
    } 
}; 
xhttp.open("GET", url, true); 
xhttp.send(); 
} 

function handleSignup() 
{ 
var username = document.getElementById("un").value; // Get text field values 
var password = document.getElementById("pw").value; 

var requestObject = requestData("../../FRAMEWORK/createaccount.php?name=" + username + "&password=" + password, false); 

var returnObject; 

if(requestObject != false) 
{ 
    requestObject = JSON.parse(requestObject); 

    console.log(returnObject.value); 
} 
} 

PHP:

<?php 
# REV 1.0.0 

$name = $_GET[ "name" ]; # Get values to set 
$password = $_GET[ "password" ]; 

$file = fopen("../USER_STORE/userindex.json", "r"); # Load user index 
$accounts = json_decode(fread($file, filesize("../USER_STORE/userindex.json")), true); 
fclose($file); 

$alreadyExists = false; # Check to see if username already is in use 
foreach($accounts as $val) { 
if($val == $name) 
{ 
    $alreadyExists = true; 
} 
} 

if(!$alreadyExists) # If username is not in use 
{ 
$UUID = sizeof($accounts) + 1; 

$toAppend = array("username" => $name, "password" => hash("sha256", $password)); # Create append list 

mkdir("../USER_STORE/" . $UUID); # Append user data 
$file = fopen("../USER_STORE/" . $UUID . "/accountinfo.json", "w"); 
fwrite($file, json_encode($toAppend)); 
fclose($file); 

$accounts[ $UUID ] = $name; # Create new user index 

$file = fopen("../USER_STORE/userindex.json", "w"); # Update userindex 
fwrite($file, json_encode($accounts)); 
fclose($file); 

$return = array("value" => "created"); # Return message 
echo(json_encode($return)); 
} 
else # Account is in use 
{ 
$return = array("value" => "account_in_use"); # Return error message 
echo(json_encode($return)); 
} 
?> 
+0

Возможно, у вас где-то есть место или некоторые невидимые символы, возможно, перед ' Rasclatt

+0

Как выглядит объект requestObject перед тем, как попробовать JSON.parse()? – tpdietz

+0

Вот как это выглядит раньше: {"returnValue": "account_in_use"} – steve

ответ

0

XMLHttpRequest работает асинхронно. Таким образом, ваша функция requestData заканчивается после xhttp.send(); и ничего не возвращает. Обработчик события для readystatechange (который называется бит позже, после того, как XMLHttpRequest фактически получает ответ от сервера) возвращает значение, но с ним ничего не делается.

Решение: переместить синтаксический анализ и интерпретацию ответа в обработчике события.

Дополнительные примечания:

  1. Когда вы строите URL, вам нужно бежать (с помощью encodeURIComponent) параметров. Как вы думаете, что произойдет, если какое-либо из двух полей содержит пробелы или специальные символы, такие как % или &?

  2. Когда у вас есть пароль, вы должны сначала его солить. Или используйте готовые функции, такие как password_hash, которые сделают это за вас.

  3. Возможно, вы захотите использовать file_get_contents/file_put_contents для чтения/записи вашего пользовательского файла, что упростит ваш код совсем немного. Или еще лучше, база данных.

+0

Привет, поэтому я сделал свой код, но у меня все еще такая же проблема. Вот новый код: [Pastebin] (http://pastebin.com/Ycx5AQmw) – steve

+0

Используйте фрагмент или jsFiddle для кода, он позволяет прямое тестирование. Быстрая проверка показывает опечатку: 'callback (true, this.resoponseText);'. Может быть больше ошибок. – jcaron

+0

Опечатка была на самом деле в идете https://gyazo.com/eed189f0dd5270c53c671b1f1165f817 Приятный улов! – steve