PHP JSON кодирует неправильно декодирование в javascript

Таким образом, у меня есть проблема, где данные, закодированные с помощью php, не декодируются должным образом в 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
# 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 ) );
}
?>

1 ответ

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

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

    дополнительное Примечание:

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

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

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