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
相关产品推荐
相关产品推荐

