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

如何将登录用户的「添加到收藏」操作关联至pgAdmin 4数据库——PHP新手技术咨询

解决登录用户与收藏操作关联的问题

嘿,别着急,作为PHP和数据库新手遇到这个问题太正常了——你现在的核心困境是没有把登录用户的身份信息和收藏操作绑定起来,咱们一步步拆解你漏掉的关键环节:


1. 必须保存用户的登录状态(Session 机制)

用户登录成功后,你需要用PHP的Session来持久化用户的身份(比如用户ID),这样后续所有请求(包括提交收藏)才能识别出当前操作的是哪个用户。

  • 操作步骤:
    • 在**所有需要用户身份的页面(包括favorite.php和登录页面)**的最开头添加:
      session_start(); // 启动Session
      
    • 当用户登录验证通过(账号密码匹配数据库)后,把用户ID存入Session:
      // 假设从数据库查询到的用户信息存在$user变量里
      $_SESSION['user_id'] = $user['id'];
      
    • 后续在favorite.php里,就可以通过$_SESSION['user_id']获取当前登录用户的ID了。

2. 表单缺少「唱片ID」的传递

你的前端表单只有提交按钮,没有告诉PHP用户要收藏哪张唱片。需要给表单添加一个隐藏字段,传递当前唱片的ID:

修改你的HTML表单部分:

<form name="favorite" action="favorite.php" method="post">
  <!-- 隐藏字段:传递当前唱片的ID,这里对应你div里的id="1" -->
  <input type="hidden" name="record_id" value="1">
  <input type="submit" name="submit" value="Add to Favorites">
</form>

(注意:如果是动态生成的唱片列表,value要替换成对应唱片的实际ID,比如从数据库读取的record.id)

3. 收藏表的结构需要调整

你当前的favorite表只有id字段,这根本无法关联用户和唱片。正确的收藏表应该至少包含两个字段:

  • user_id:关联登录用户的ID(外键关联用户表的主键)
  • record_id:关联被收藏唱片的ID(外键关联唱片表的主键)

如果还没创建正确的表,可以用PostgreSQL语句创建:

CREATE TABLE favorite (
    id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(id), -- 假设用户表名为users,主键是id
    record_id INT REFERENCES records(id), -- 假设唱片表名为records,主键是id
    UNIQUE(user_id, record_id) -- 防止同一用户重复收藏同一张唱片
);

4. 修正PHP代码的逻辑错误

你的favorite.php有几个明显问题:

  • 没有启动Session,无法获取登录用户ID
  • 试图读取$_POST['favorite'],但表单里根本没有这个字段
  • 直接把变量拼进SQL,存在严重的SQL注入风险

修正后的favorite.php代码示例:

<?php
session_start(); // 必须放在最开头
require_once 'credent.php';

// 连接数据库(修正拼写错误:connecionstr → connectionstr)
$connectionstr = "host=".DB_SERVER." port=5432 dbname=".DB_BASE." user=".DB_USER." password=".DB_PASS." options='--client_encoding=UTF8'";
$dbconn = pg_connect($connectionstr);
if (!$dbconn) {
    die("Connection failed: " . pg_last_error()); // pg_connect_error() → pg_last_error() 更准确
}

// 处理收藏提交
if(isset($_POST["submit"])) {
    // 先检查用户是否登录,且是否传递了唱片ID
    if(isset($_SESSION['user_id']) && isset($_POST['record_id'])) {
        $user_id = $_SESSION['user_id'];
        $record_id = $_POST['record_id'];
        
        // 使用预处理语句防止SQL注入!
        pg_prepare($dbconn, "insert_favorite", "INSERT INTO favorite(user_id, record_id) VALUES($1, $2)");
        $result = pg_execute($dbconn, "insert_favorite", array($user_id, $record_id));
        
        if($result) {
            echo "收藏成功!";
            // 可以跳回之前的页面,比如 header("Location: record_list.php");
        } else {
            echo "收藏失败:" . pg_last_error();
        }
    } else {
        echo "请先登录,或者选择有效的唱片!";
    }
}

pg_close($dbconn);
?>

5. 补充登录验证的逻辑

确保你的登录页面在验证用户账号密码正确后,将用户ID存入Session,比如:

// 假设登录表单提交了username和password
if(isset($_POST['login'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
    
    // 查询数据库验证用户(注意:密码应该加密存储,比如用password_hash)
    $query = pg_prepare($dbconn, "check_user", "SELECT id FROM users WHERE username = $1 AND password = $2");
    $result = pg_execute($dbconn, "check_user", array($username, $password));
    
    if(pg_num_rows($result) > 0) {
        $user = pg_fetch_assoc($result);
        $_SESSION['user_id'] = $user['id']; // 存入用户ID
        header("Location: 你的首页地址");
        exit;
    } else {
        echo "账号或密码错误";
    }
}

把以上几个环节补上,就能建立起用户-收藏-唱片的关联关系啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:49:04