AngularJS+PHP+MySQL表单提交报错:Undefined property: stdClass::$name
问题分析与解决
这个错误Undefined property: stdClass::$name本质是你PHP代码里的$data对象根本没有name这个属性,核心原因是前端请求数据格式和后端接收方式不匹配,咱们一步步排查解决:
问题根源
AngularJS 的 $http.post 方法默认会把请求数据以 application/x-www-form-urlencoded(表单格式)发送,但你的PHP代码却用json_decode(file_get_contents("php://input"))来解析JSON格式的数据——这就导致json_decode无法正确解析表单格式的字符串,最终得到的$data是null或者一个没有预期属性的空对象,自然会触发Undefined property的错误。
解决方法(二选一即可)
方法1:修改前端,发送JSON格式数据
在$http.post里添加请求头,明确告诉后端发送的是JSON格式数据,同时建议加上回调逻辑反馈状态:
$scope.add_company = function(){ $scope.msg=false; $http.post('php/create.php', { 'name':$scope.advertiser_name, 'orgnumber':$scope.advertiser_org, 'phone':$scope.advertiser_phone, 'address':$scope.advertiser_address, 'postcode':$scope.advertiser_postcode, 'location':$scope.advertiser_location, 'billAddress':$scope.advertiser_billAddress, 'billPostcode':$scope.advertiser_billPostcode, 'billLocation':$scope.advertiser_billLocation }, { headers: { 'Content-Type': 'application/json' } // 新增这行,指定数据格式 }).then(function(response) { // 请求成功后的逻辑 $scope.msg = true; $timeout(function() { $scope.msg = false; }, 3000); }, function(error) { // 请求失败时的错误提示 console.error('添加失败:', error); }); };
方法2:修改后端PHP,用表单方式接收数据
既然前端默认发送的是表单格式,直接用$_POST获取数据即可,不用解析JSON:
<?php include '../src/config/db2.php'; // 替换原来的json_decode部分,直接从$_POST取值,用?? ''避免未定义警告 $advertiser_name = $_POST['name'] ?? ''; $advertiser_org = $_POST['orgnumber'] ?? ''; $advertiser_phone = $_POST['phone'] ?? ''; $advertiser_address = $_POST['address'] ?? ''; $advertiser_postcode = $_POST['postcode'] ?? ''; $advertiser_location = $_POST['location'] ?? ''; $advertiser_billAddress = $_POST['billAddress'] ?? ''; $advertiser_billPostcode = $_POST['billPostcode'] ?? ''; $advertiser_billLocation = $_POST['billLocation'] ?? '';
重要安全提醒:防范SQL注入
你的代码直接把用户输入拼到SQL语句里,这是极高的安全风险,很容易被SQL注入攻击。强烈替换为MySQLi预处理语句:
// 用?作为占位符编写SQL $sql = "INSERT INTO `tbl_advertisers` ( `advertiser_name`, `advertiser_org`, `advertiser_phone`, `advertiser_address`, `advertiser_postcode`, `advertiser_location`, `advertiser_billAddress`, `advertiser_billPostcode`, `advertiser_billLocation`) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?)"; // 初始化预处理对象 $stmt = mysqli_prepare($conn, $sql); // 绑定参数,s代表字符串类型(数字类型可用i) mysqli_stmt_bind_param($stmt, "sssssssss", $advertiser_name, $advertiser_org, $advertiser_phone, $advertiser_address, $advertiser_postcode, $advertiser_location, $advertiser_billAddress, $advertiser_billPostcode, $advertiser_billLocation ); // 执行语句并反馈结果 if (mysqli_stmt_execute($stmt)) { echo "Data added"; } else { echo "Error: Did not add data " . mysqli_error($conn); } // 关闭资源 mysqli_stmt_close($stmt); mysqli_close($conn);
内容的提问来源于stack exchange,提问作者Thosc
相关产品推荐
相关产品推荐

