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

JS对象传PHP存入MySQL异常:值变为NULL/0问题求助

问题排查与修复方案

我来帮你梳理下问题根源,主要是两个核心错误导致数据无法正确存入数据库:PHP端获取POST数据的方式错误,以及JavaScript端没有把描述字段传入对象中。

一、PHP代码的核心问题

你写的这行代码完全搞错了逻辑:

$obj = isset($_POST['obj']);

isset()返回的是布尔值(true/false),而不是POST请求里的实际JSON字符串。这就导致后续json_decode($obj, true)只能得到NULL,最终存入数据库的自然是默认的0和空字符串。

修复后的PHP代码(含安全优化)

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "map";

// 正确获取并过滤POST中的JSON数据
$objStr = filter_input(INPUT_POST, 'obj', FILTER_SANITIZE_STRING);
if (!$objStr) {
    die("No valid data received");
}

// 解码JSON并检查是否成功
$decoded = json_decode($objStr, true);
if (json_last_error() !== JSON_ERROR_NONE) {
    die("Invalid JSON format");
}

// 提取数据并设置默认值,避免未定义索引报错
$lat = isset($decoded['lat']) ? $decoded['lat'] : 0.0;
$lng = isset($decoded['lng']) ? $decoded['lng'] : 0.0;
$descr = isset($decoded['descr']) ? $decoded['descr'] : '';

// 建立数据库连接
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// 重点:使用预处理语句防止SQL注入,绝对不要直接拼接SQL字符串
$sql = "INSERT INTO mapinfo (lat,lng,descr) VALUES (?,?,?)";
$stmt = $conn->prepare($sql);
// 绑定参数:d=浮点数,s=字符串
$stmt->bind_param("dds", $lat, $lng, $descr);

if ($stmt->execute() === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

// 关闭资源
$stmt->close();
$conn->close();
?>

二、JavaScript代码的问题

在upload()函数中,你调用getval()拿到了描述文本description,但没有把这个值添加到obj对象里就直接序列化了,导致PHP解码后根本没有descr字段,数据库里的对应字段自然为空。

修复后的JavaScript代码

var pressed = false; 
var markerPos; 
var clickCoords = {}; 
var xx,yy; 
var x,y,descr; 
var objStr; 
var obj = new Object; 
var description; 
var map; 

function getval() { 
    description = document.getElementById("type").value; 
} 

function initMap() { 
    map = new google.maps.Map(document.getElementById('map'), { 
        center: {lat: -34.397, lng: 150.644}, 
        zoom: 8 
    }); 

    map.addListener('mousemove', function(event) { 
        markerPos = {lat: event.latLng.lat(), lng:event.latLng.lng()} 
    }); 

    // 合并重复的click事件监听,避免逻辑冲突
    map.addListener('click',function() { 
        if (pressed) { 
            var marker = new google.maps.Marker({position: markerPos, map: map}); 
            Object.assign(obj,markerPos); 
            console.log(markerPos.lat); 
            pressed=false; 
        }
        // 保留打印obj的逻辑
        console.log(obj.lat); 
        console.log(obj.lng); 
        console.log(obj); 
    }); 
} 

function upload() { 
    getval();
    // 把描述字段加入obj后再序列化
    obj.descr = description;
    objStr = JSON.stringify(obj);
    $.ajax({ 
        url: "map.php", 
        method: "post", 
        data: {obj:objStr}, 
        success: function(res) { 
            console.log("Upload success: ", res);
            console.log("Sent data: ", objStr); 
        },
        error: function(xhr) {
            console.error("Upload failed: ", xhr.responseText);
        }
    }); 
}

三、额外优化点

  1. 合并了地图上重复绑定的click事件,避免逻辑冲突;
  2. 给AJAX请求添加了错误回调,方便排查上传失败的原因;
  3. 使用PHP预处理语句彻底避免SQL注入风险,同时也能防止特殊字符导致的SQL语法错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:02:46