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); } }); }
三、额外优化点
- 合并了地图上重复绑定的
click事件,避免逻辑冲突; - 给AJAX请求添加了错误回调,方便排查上传失败的原因;
- 使用PHP预处理语句彻底避免SQL注入风险,同时也能防止特殊字符导致的SQL语法错误。
内容的提问来源于stack exchange,提问作者kishetate
相关产品推荐
相关产品推荐

