0

PHPAcademyの登録とログインのシリーズに従い、ログインシステムを構築しました。アナウンスシステムを追加したかったのです。これを作成しましたが、ログインしているユーザーの名前と名前をテーブルに保存できません。メッセージと日付は挿入されますが、ユーザーデータは挿入されません。

名前、性別、部門などのユーザーの詳細はすべて他のテーブルに格納されますが、名前と姓の2つのフィールドのみが必要なので、セッション変数を使用することを考えました。また、私はそのJOINのコンセプトが苦手ですが、誰か説明してもらえますか?それを使ってできるのは不思議な感じがしますが、方法がわかりません。2回試しましたが失敗しました(たぶん、コンセプト)

助けてください。コードは次のとおりです。

    <?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

通知レコードにユーザー情報を格納する場合は、たとえば、通知をアナウンスしているユーザーに対応するユーザー テーブルの主キーを格納します。通知テーブルには 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);
    

クエリを実行すると、新しいレコードには、user_table の主キーに対応するテーブル notifications の user 列に user_id が含まれます。ここで、すべてのユーザー固有の情報を見つけることができます。

于 2013-01-20T16:26:49.500 に答える