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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:06:27