You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP注册页面JSON语法错误:数据可入库但报错持续

解决注册接口JSON解析错误:Error: SyntaxError: Unexpected token 'o', "object(std"... is not valid JSON

问题描述

开发注册页面时,数据可正常写入数据库,但前端始终报错:Error: SyntaxError: Unexpected token 'o', "object(std"... is not valid JSON。作为后端新手,尝试过谷歌及Stack Overflow查找方案但未解决,附上相关代码:

PHP脚本

<?php
    session_start();
    header("Content-Type: application/json; charset=UTF-8");
    header("Access-Control-Allow-Origin: *");
    header("Access-Control-Allow-Headers: *");
    main();

    function main(){
        require 'connectToDB.php';
        // echo "\nreached the php file";
        $response = array("code" => 0, "message" => "");

        $request = file_get_contents('php://input');
        $jsonRequest = json_decode($request);
        var_dump($jsonRequest);

        if (checkForExistingUser($conn, $jsonRequest) != 0){
            $response["code"] = 2;
            $response["message"] = "User already exists";
        }
        // else if($response["code"] == 1){
        //     // $userID = $conn->lastInsert();
        //     // header("Location: UniqueUserID.php");
        //     exit; 
        // }
        else{
            $response = addUser($conn, $jsonRequest);
            // header("Location: UniqueUserID.php");
            exit;
        }
        // printf(json_encode($response));
        // var_dump($response);
        $conn = null;
        return json_encode($response);

    }

    function checkForExistingUser ($conn, $jsonRequest){

        
        $stmt = $conn->prepare("
        SELECT COUNT(Email) as noOfUsers
        FROM user_main
        WHERE Email = :confirmemailadd");

        // $stmt -> bindParam(':confirmemailadd', $jsonRequest->confirmemailadd);

        if (isset($jsonRequest->confirmemailadd)) {
            $stmt->bindValue(':confirmemailadd', $jsonRequest->confirmemailadd);
        } else {
            $stmt->bindValue(':confirmemailadd', '');
        }

        $stmt->execute();

        $result = $stmt->setFetchMode(PDO::FETCH_ASSOC);

        $results = $stmt->fetchAll();

        $noOfResults = $results[0]["noOfUsers"];
        // echo($noOfResults);

        return $noOfResults;
    }

    function addUser($conn, $jsonRequest){

        $response = array("code"=>0, "message"=>"");

        // echo ("Reached addUser \n");

        $firstname = sanitise($jsonRequest->firstname);
        $surname = sanitise($jsonRequest->surname);
        $username = sanitise($jsonRequest->username);
        $confirmemailadd = sanitise($jsonRequest->confirmemailadd);
        $phonenum = sanitise($jsonRequest->phonenum);
        $retypepassword = sanitise($jsonRequest->retypepassword);

        function encryptPassword($retypepassword) {
            $key = openssl_random_pseudo_bytes(32);
            $iv = openssl_random_pseudo_bytes(16);
            $encrypted = openssl_encrypt($retypepassword, 'AES-256-CBC', $key, 0, $iv);
            $hash = hash_hmac('sha256', $encrypted, $key);
            return $hash . ':' . base64_encode($iv) . ':' . base64_encode($encrypted);
        }

        $stmt = $conn->prepare("
                        INSERT INTO user_main (Name, Surname, Username, Email, PhoneNum, PWD) 
                        VALUES (:firstname, :surname, :username, :confirmemailadd, :phonenum, :retypepassword) ");
        

        $stmt->bindParam(':firstname', $firstname);
        $stmt->bindParam(':surname', $surname);
        $stmt->bindParam(':username', $username);
        $stmt->bindParam(':confirmemailadd', $confirmemailadd);
        $stmt->bindParam(':phonenum', $phonenum);
        $stmt->bindParam(':retypepassword', $retypepassword);


        try{
            $stmt->execute();
            $userID = $conn->lastInsertId();
            $response["code"] = 1;
            $response["message"] = "successfully added";
            $response["user_id"] = $userID;
        }
        catch (PDOException $e){
            $response["code"] = 0;
            $response["message"] = $e->getMessage();

        }
        // echo json_encode($response);
        return $response;


    }

    function sanitise($data) {
        
        $data = trim($data);
        $data = stripslashes($data);
        $data = htmlspecialchars($data);
        return $data;

    }

?>

JavaScript代码

document.addEventListener('DOMContentLoaded', function () {
    const form = document.querySelector('form');
    form.addEventListener('submit', handleFormSubmit);
  }, false)
 
  function handleFormSubmit(event) {
    event.preventDefault();
    checkEmails();
    checkPasses();
    processForm();
    // redirectToPage()
  }

  function checkEmails(){
 
    var emailValue = document.getElementById("emailadd").value;
    var retypeEmailValue = document.getElementById("confirmemailadd").value;

    if (emailValue !== retypeEmailValue){
        window.alert("Emails do not match.");
    }
    }

    function checkPasses(){
        
        var passValue = document.getElementById("password").value;
        var retypeValue = document.getElementById("retypepassword").value;
    
        if (passValue !== retypeValue){
            window.alert("Passwords do not match.");
        }

    }

  
  function processForm(){
    
    var userDetails = gatherData()
    console.log(userDetails);
    postRequest(userDetails)
    
  }


  function gatherData(){
    //gather the data from the form fields into JSON 
    var userDetails = {
        firstname : document.getElementById("firstname").value,
        surname : document.getElementById("surname").value,
        username  : document.getElementById("username").value,
        confirmemailadd:   document.getElementById("confirmemailadd").value,
        phonenum:   document.getElementById("phonenum").value,
        retypepassword:   document.getElementById("retypepassword").value,
    }
    
    return userDetails;
    
    }
async function postRequest(userDetails){
    
    // make an AJAX POST request to server 
        try{

            const response = await fetch("../php/register.php",{
                method: 'POST',
                headers: {
                    
                    'Origin' : 'http://localhost/',
                    'Content-Type': 'application/json', // sent request
                    'Accept':       'application/json'  // expected data sent back
                    
                },
                body: JSON.stringify(userDetails),
            });
    
            const data = await response.json();
            console.log(data);
            handleResponseCode(data);
            
        }catch (error){
            console.log('Error:',error);
        }

} 
function handleResponseCode(data){
    console.log("response code: ", data.code);
    console.log("response message: ", data.message);

    if (data.code  == 1){
        alert ("Your account has been successfully created")
    }
    else if (data.code == 2 ){
        alert (data.message );
    }
}

解决方案

1. 移除调试输出var_dump($jsonRequest)

var_dump($jsonRequest)会输出类似object(stdClass)#1 (6) {...}的非JSON字符串,导致响应内容被污染,前端response.json()解析时触发错误。直接删除该行代码即可。

2. 修复main()函数的响应输出逻辑

当前main()函数存在两个问题:

  • exit;语句会提前终止脚本,导致后续响应输出代码无法执行
  • 仅return json_encode($response)不会将内容输出到响应流,前端无法接收到JSON数据

修改后的main()函数:

function main(){
    require 'connectToDB.php';
    $response = array("code" => 0, "message" => "");

    $request = file_get_contents('php://input');
    $jsonRequest = json_decode($request);
    // 删除var_dump($jsonRequest)

    if (checkForExistingUser($conn, $jsonRequest) != 0){
        $response["code"] = 2;
        $response["message"] = "User already exists";
    }
    else{
        $response = addUser($conn, $jsonRequest);
        // 删除exit;语句
    }
    $conn = null;
    echo json_encode($response); // 将return改为echo,输出JSON到响应流
}

3. 补充:启用密码加密逻辑

addUser()函数中定义了encryptPassword()方法,但未实际调用,导致密码明文存入数据库。建议在绑定参数前添加加密调用:

$retypepassword = encryptPassword($retypepassword);

内容的提问来源于stack exchange,提问作者slavman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 06:09:19