0

我遵循 PHPAcademy 的注册和登录系列,并构建了一个登录系统。我想为它添加一个公告系统。我已经建立了它,但我无法将登录用户的名字和姓氏存储在表中。消息和日期被插入,但不是用户数据。

姓名、性别、部门等用户详细信息都存储在其他表中,但我只需要两个字段——名字和姓氏,所以我想到了使用会话变量。另外,我在那个 JOIN 概念上很弱,谁能解释一下,我有一种奇怪的感觉,它可以使用它来完成,但我不知道如何,我尝试了两次但失败了(可能是因为我没有得到概念)

请帮忙。以下是代码:

    <?php
    include $_SERVER["DOCUMENT_ROOT"].'/TestSite/core/init.php';
    faculty_protect_page();
    include $_SERVER["DOCUMENT_ROOT"].'/TestSite/includes/overall/header.php';

    if(empty($_POST)===false) {
        $required_fields = array('announce');
        foreach($_POST as $key=>$value) {
            if(empty($value) && in_array($key, $required_fields) === true ) {
                $errors[] = 'It seems like you have not made any announcement!';
                break 1;
            }
        }
        if(empty($errors) === true ){
            if(strlen($_POST['announce']) < 20) {
                $errors[] = 'Your announcement must be atleast 20 characters long!';
            }
            if(strlen($_POST['announce']) > 250) {
                $errors[] = 'Your announcement cannot be more than 250 characters long!';
            }
        }
    }
?>
<center><h3>Make an announcement</h3></center>
<?php
                if(isset($_GET['success'])===true && empty($_GET['success'])===true) {
                    echo 'You have successfully made an announcement';
                }
                else {
                    if(empty($_POST)=== false && empty($errors)===true) {
                        $announcement = array(
                            'announce'     => $_POST['announce'],
                       //'faculty_fname' => $_SERVER['faculty_fname'] this didn't work
                            );
                        announce($announcement);
                        header('Location: announce.php?success');
                        exit();
                    }
                    else if(empty($errors)===false) {
                        echo output_errors($errors);
                    }

    ?>
    <form action="" method="POST">
        <br/>
        <input type="text" class="span12" name="announce" maxlength="250"/><br/><br/>
        <center><input type="submit" class="btn btn" value="Announce" /></center>     
    </form>
<?php
}
include $_SERVER["DOCUMENT_ROOT"].'/TestSite/includes/overall/footer.php'; ?>

这是放置在函数文件中的我的宣布函数(init.php 需要):

    function announce($announcement) {
        array_walk($announcement, 'array_sanitize');
        $announcement['announce'] = ucfirst($announcement['announce']);
        $fields = '`' . implode('`, `', array_keys($announcement)) . '`';
        $data = '\'' . implode('\', \'', $announcement) . '\'';
        $one = $_SESSION['faculty_fname'];        
        mysql_query("INSERT INTO `notices` ($fields, `faculty_fname`, `datetime`) VALUES ($data, '$one', NOW())");
    }

谁能帮我在表中插入教师的名字?我已经花了一整天的时间,但无法成功。

谢谢你

4

1 回答 1

0

如果您想将用户信息存储在通知记录中,您需要存储例如用户表中与发布通知的用户相对应的主键。您的 notices 表必须有一个 user_id 列,并且将存储在该列中的 id 通常称为外键。这样,您就不会在数据库中存储重复的信息。所有用户特定信息都已存储在 user_table 中,因此无需将其再次存储在 notices 表中,这只是将用户连接到通知的一种手段。

要将其应用到您当前的代码中,您可以执行以下操作。

  1. 当您想在通知表中插入新通知时,您首先需要从数据库中检索提交通知的人的用户记录。您如何执行此操作取决于您的登录系统是如何构建的,但例如,在登录时,您可以将用户的主键存储在会话中。在通知提交时,您从会话中检索用户 ID 并使用它来查询数据库。在半伪代码中:

    $mysqli = new mysqli("localhost", "root", "", "");
    $user_id = $_SESSION['user_id'];  
    $sql = $mysqli->prepare("SELECT * FROM user_table WHERE user_id = ?");  
    $sql->bind_param("i", $user_id); 
    
  2. 现在我们有了登录用户的记录,您可以在通知表中插入通知

    $notice = $_POST['notice'];  
    $user_id = $_SESSION['user_id'];  
    $sql = $mysqli->prepare("INSERT INTO notices ('notice', 'user', 'datetime') VALUES (?,?,NOW())");  
    $sql->bind_param("si", $notice, $user_id);
    

执行查询后,新记录包含表 notices 的 user 列中的 user_id,对应于 user_table 中的主键,可以找到所有用户特定信息。

于 2013-01-20T16:26:49.500 回答