Mysql - PHP - 创建触发器或事务? - 需要澄清

时间:2013-01-02 18:43:39

标签: php mysql transactions triggers pdo

请先阅读编辑2谢谢!

我一直在处理一个名为“inoffice.php”的页面,这个页面显示了等待被人看到的学生,目前正在看页面视图:

Page view of inoffice.php

现在,我刚刚使用上面的相同表格来获得第二张桌子,但是我添加了一个左连接,以便显示与学生一起工作的辅导员(在这种情况下是Dawne)以及学生被接受的时间由辅导员。

该项目的那部分难度如此之大,但我能够顺利完成。现在对我来说困难的部分就是这个(这也是我的问题):

1)我怎样才能使正在看见的表(等待的第二个表)为空,除非辅导员(或工作人员)点击“开始会话”按钮(不是php会话)但是学生和辅导员之间的真实生活会议)

2)如果顾问(工作人员)点击“开始会话”按钮,我怎样才能使第一张表(等待)丢失一个条目。

我的数据库架构如下:

  1. 用户 - 持有员工凭证
  2. 等待 - 包含ID(PK),anum(学生身份证号码), 第一个,最后一个,为什么,评论,签名时间
  3. 辅导员 - 持有身份证(等待在加入时使用的PK和FK),律师,辅导员开始时间
  4. 评论 - ID(等待的PK和FK),评论(咨询评论的varchar 50左右)
  5. 完成 - ID(等待的PK和FK),以及辅导员完成学生的时间戳
  6. 所以希望通过我提供的信息,有人可以详细说明我应该使用触发器或事务来完成此操作。或者,如果它是PHP的“东西” - 缺乏更好的词。

    谢谢你, 愤怒

    编辑2:删除旧的无效代码,使用新代码更新帖子并删除过时的屏幕截图!包括更新的一个! :

    <php
    require('core/init.php');
    
        if(!isset($_SESSION['LoggedIn'])){
            die("You must <a href='index.php'><bold>login</bold></a> before you can see that page!");
        }
    
    //Begin the select statements
    try 
        {
    $query = $dbh->prepare("SELECT * FROM waiting WHERE counselorname IS NULL ");
    $query->bindParam(':null', $null);
    $query->execute();
    $result = $query->fetchall();
        }
            catch (PDOException $e) {
            error_log($e->getMessage());
            die($e->getMessage());
            }
    
    
        echo "Return to <a href='login_success.php'><bold>Home Page</bold></a>";
    
    echo "<br />";
    echo "Waiting";
    
    echo 
        "<table border='2'>
        <tr>
        <th>ID</th>
        <th>A Number</th>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Why</th>
        <th>Comments</th>
        <th>Signintime</th>
        <th>Staff Member</th>
        <th>Click if ready!</th>
        </tr>"
        ;
    
        foreach($result as $row)
        {
      echo "<tr>";
      echo "<td>" . $row['id'] . "</td>";
      echo "<td><a href=Student.php?student=" . $row['anum'] . ">" .$row['anum'] . " </a></td>";
      echo "<td>" . $row['first'] . "</td>";
      echo "<td>" . $row['last'] . "</td>";
      echo "<td>" . $row['why'] . "</td>";  
      echo "<td>" . $row['comments'] . "</td>";
      echo "<td>" . $row['signintime'] . "</td>";
      echo "
            <td>    <form action='counselor.php?id=" . $row['id'] . "' method='post' target='_new'>
                        <select name='namedrop'>
                            <option value=''>Counselor Name</option> 
                            <option value='Admin-John'>Admin - John</option>
                            <option value='Admin-Christine'>Admin - Christine</option>
                            <option value='Admin-Dawne'>Admin - Dawne</option>
                            <option value='Counselor-Cherie'>Counselor - Cherie</option>
                            <option value='Counselor-Tootie'>Counselor - Tootie</option>
                            <option value='Counselor-Debbie'>Counselor - Debbi</option>
                            <option value='FrontDesk-Delores'>Front Desk - Delores</option>
                            <option value='FrontDesk-Kiana'>Front Desk - Kiana</option>
                        </select>
                </td>
    
                <td> <input type='submit' name='submit' value='Start Session'></td>
                </form> </td>";
    }
    
      echo "</tr>";
      echo "</table>";
    
    echo "<br />";
    echo "<br />";
    
    
    try 
        {
        $query2 = $dbh->prepare("SELECT * FROM waiting WHERE counselorname is NOT NULL");
        $query2->execute();
        $result2 = $query2->fetchall();
        }
            catch (PDOException $e) {
            error_log($e->getMessage());
            die($e->getMessage());
            }
    
    
    echo "Return to <a href='login_success.php'><bold>Home Page</bold></a>";
    
    echo "<br />";
    echo "Being seen";
    
    echo 
        "<table border='2'>
        <tr>
        <th>ID</th>
        <th>A Number</th>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Why</th>
        <th>Comments</th>
        <th>Signintime</th>
        <th>Staff Member</th>
        <th>Counselor Start Time</th>
        </tr>"
        ;
    
        foreach($result2 as $row2)
        {
      echo "<tr>";
      echo "<td>" . $row2['id'] . "</td>";
      echo "<td><a href=Student.php?student=" . $row2['anum'] . ">" .$row2['anum'] . " </a></td>";
      echo "<td>" . $row2['first'] . "</td>";
      echo "<td>" . $row2['last'] . "</td>";
      echo "<td>" . $row2['why'] . "</td>"; 
      echo "<td>" . $row2['comments'] . "</td>";
      echo "<td>" . $row2['signintime'] . "</td>";
      echo "<td>" . $row2['counselorname'] . "</td>";
      echo "<td>" . $row2['counselor_time'] . "</td>";
    }
    
    
    ?> 
    

    New preview

1 个答案:

答案 0 :(得分:2)

对于两者呈现的HTML表,应该有一个SQL表(具有任何规范化的依赖关系)。

也就是说,使显示的HTML表格代表相同信息的不同视图

现在,发布的架构主要是允许这样做,但是存在一个问题,使其无法实现:

辅导员表包含不是功能依赖的信息(start time) - 也就是说,它与“作为辅导员”无关!这导致两个问题:

  1. 辅导员可能只有一个start time和;
  2. 无法代表所有活动的start time
  3. 修复方法是从Counselors表中移动start time列并将其放在Schedules表中,因为start time(如finish时间)取决于特定的调度。


      

    1)我怎样才能使正在看见的桌子(正在等待的第二张桌子)是空的,除非辅导员(或工作人员)点击“开始会话”按钮(不是php会话而是实际学生和辅导员之间的现实生活会议)

    查询(查看信息):

    select * from Schedules
    where startTime not null   -- only show started events
    
      

    2)如果顾问(工作人员)点击“开始会话”按钮,我怎样才能使第一张表(等待)丢失一个条目。

    查询(查看信息):

    select * from Schedules
    where startTime is null    -- it does not 'lose' item, but it is not shown
    

    否则,如果坚持使用单独的表,则必须进行簿记:每次手动插入/删除或设置触发器以执行相同操作。这增加了额外的工作,可能不需要。