PHP报错:Assignments can only happen to writable values 解决求助
问题分析与修复方案
致命错误核心原因
你碰到的Assignments can only happen to writable values错误,是数组元素赋值的语法完全写错了:
你写的$data=['status']=false;是错误语法,$data=['status']是创建一个仅包含'status'元素的新数组,这是一个表达式而非可写变量,所以无法给它赋值。正确的数组键值赋值写法是$data['status'] = false;,同理$data=['message']='xxx';也要改成$data['message'] = 'xxx';。
其他需修复的问题
除了这个语法错误,代码里还有几个会导致异常的点:
- 全局变量拼写错误:
$GLOBALs['$db']应该改为$GLOBALS['db'](注意是大写的S,且键名不需要加$) $error未初始化:使用前要先声明$error = 0;,否则会触发未定义变量警告$user_id未定义:INSERT语句中用到的$user_id没有定义,若该字段是自增类型,可直接从INSERT语句中省略;若需要手动赋值,要补充生成逻辑(比如唯一ID)pg_query参数错误:pg_query($con,$data)应该传入SQL语句$query,而非$data数组- 空值判断逻辑错误:
$userdata['email_id']==' '只判断了单个空格,应该改为判断空字符串或去除空格后为空,比如trim($userdata['email_id']) === ''
修复后的完整代码
<?php require 'gp.php'; function registeruser($userdata){ $con = $GLOBALS['db']; $data = array(); $error = 0; // 初始化错误计数器 if(trim($userdata['email_id']) === ''){ $error++; $data['status'] = false; $data['message'] = 'Enter your Email id!'; } if(trim($userdata['full_name']) === ''){ $error++; $data['status'] = false; $data['message'] = 'Enter your Full name!'; } if(trim($userdata['password']) === ''){ $error++; $data['status'] = false; $data['message'] = 'Enter your Password!'; } if($error > 0){ return $data; } $full_name = pg_escape_string($con, $userdata['full_name']); $email_id = pg_escape_string($con, $userdata['email_id']); $password = pg_escape_string($con, $userdata['password']); // 假设user_id是自增字段,直接从INSERT语句中省略 $query = "INSERT INTO users(full_name, email_id, password)"; $query .= "VALUES('$full_name', '$email_id', '$password')"; if(pg_query($con, $query)){ $data['status'] = true; $data['message'] = 'Account created!'; } else { $data['status'] = false; $data['message'] = 'Something is wrong'; } return $data; } ?>
额外建议
- 建议使用预处理语句(
pg_prepare+pg_execute)替代直接拼接SQL,彻底避免SQL注入风险 - 密码不要明文存储,应该用
password_hash()加密后再存入数据库
内容的提问来源于stack exchange,提问作者Suraj Paswan
相关产品推荐
相关产品推荐

